Aktuelle Zeit: 08.01.2025, 07:42

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 23.01.2010, 11:43 
Offline

Registriert: 01.01.2010, 17:18
Beiträge: 11
Hallo,
ich habe versucht einen HLSL-Texturesplatting shader für bis zu 12 Texturen auf einem Texture-Layer zu schreiben.

Das ganze läuft so ab: Es gibt eine große Texture, die in 4x4 Quadrate aufgeteilt wird.
Die ersten 4 Texturen (horizontal) sind die Texturen, die angeben, wie stark eine "echte", sichtbare Texture zu sehen sein soll.

Beispieltexture: http://www.pic-upload.de/view-4342493/terrain.png.html
Hierbei werden nur 3 Texturen genutzt. Der R-Kanal steht für die 1. Texture (die ab 0x512 anfängt), G-Kanal für die 2. und B-Kanal für die 3.

Das funktioniert auch so einigermaßen, jedoch werden, wenn eine Tiled-Texture mehrmals angezeigt werden soll (also gekachelt aufs Terrain gelegt werden soll) die Ränder nicht richtig gemappt, das resultat ist, dass Pixel gerendert werden, welche überhauptnicht innerhalb einer Tiled-Texture liegen.

Screenshot: http://www.pic-upload.de/view-4342565/sh1.png.html
Hier sieht man zum einen dne rot/schwarzen Linien, die von neben den Texturen gemappt werden, und dazu auch noch so kleine komplett schwarze Linien. Selbst wenn ich den Bereich der Tiled-Texturen verzerre, sodass die falsch gepixelten Pixel nichtmehr da sein müssten sieht man diese kleinen schwarzen Striche...So, als ob der Pixelshader dafür garnicht ausgeführt wird.

Mein Shader sieht so aus:
Code:
float4x4 matViewProjection : ViewProjection;

sampler tex0;

struct VS_INPUT
{
   float4 Position : POSITION0;
   float2 alphamap : TEXCOORD0;
   float2 tex : TEXCOORD1;
};

struct VS_OUTPUT
{
   float4 Position : POSITION0;
   float2 alphamap : TEXCOORD0;
   float2 tex : TEXCOORD1;
};

struct PS_OUTPUT
{
   float4 diffuse : COLOR0;
};


VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;
   Output.Position = mul( Input.Position, matViewProjection );
   Output.alphamap = Input.alphamap;
   Output.tex = Input.tex;

   return( Output );
}

float4 getpixel(int2 id , float2 pos)
{
   float2 size  = float2(0.25 , 0.25);
   pos = pos % 1.0;
   return tex2D(tex0  , pos*size  +  id*size);
}



PS_OUTPUT ps_main(in VS_OUTPUT input)
{
   float texScale = 10.0;
   
   PS_OUTPUT output = (PS_OUTPUT)0;
   float4 a1 = getpixel(int2(0,0) , input.tex);
   float4 a2 = getpixel(int2(1,0) , input.tex);
   float4 a3 = getpixel(int2(2,0) , input.tex);
   float4 a4 = getpixel(int2(3,0) , input.tex);

   float2 tp = input.tex * texScale;
   
   float4 img1a = getpixel(int2(0,1) , tp) * a1.r;
   float4 img1b = getpixel(int2(1,1) , tp) * a2.r;
   float4 img1c = getpixel(int2(2,1) , tp) * a3.r;
   float4 img1d = getpixel(int2(3,1) , tp) * a4.r;
   
   float4 img2a = getpixel(int2(0,2) , tp) * a1.g;
   float4 img2b = getpixel(int2(1,2) , tp) * a2.g;
   float4 img2c = getpixel(int2(2,2) , tp) * a3.g;
   float4 img2d = getpixel(int2(3,2) , tp) * a4.g;
   
   float4 img3a = getpixel(int2(0,3) , tp) * a1.b;
   float4 img3b = getpixel(int2(1,3) , tp) * a2.b;
   float4 img3c = getpixel(int2(2,3) , tp) * a3.b;
   float4 img3d = getpixel(int2(3,3) , tp) * a4.b;
   
   float4 img1 = img1a + img1b + img1c + img1d;
   float4 img2 = img2a + img2b + img2c + img2d;
   float4 img3 = img3a + img3b + img3c + img3d;

   output.diffuse = img1 + img2 + img3;
   
   return output;
}

technique Default_DirectX_Effect
{
   pass Pass_0
   {
      VertexShader = compile vs_2_0 vs_main();
      PixelShader = compile ps_2_0 ps_main();
   }
}


Hat jemand vielleicht einen Rat, woran dies liegt?
Vielen Dank im Voraus! :-)


Gruß
Bastian


Nach oben
 Profil  
 
BeitragVerfasst: 24.01.2010, 17:04 
Offline
Newsposter
Benutzeravatar

Registriert: 12.03.2007, 10:42
Beiträge: 338
Wohnort: Berlin
hast du es schonmal damit versucht alle texturen einzeln zu speichern?


Nach oben
 Profil  
 
BeitragVerfasst: 24.01.2010, 18:44 
Offline

Registriert: 01.01.2010, 17:18
Beiträge: 11
...das ist etwas sinnlos ;)
Dann könnte ich maximal 3 verschiedene Texturen benutzten (da unter normalen Einstellungen Irrlicht nur 4 Layer hat).
Es gibt da zwar diese Konstante...Aber davon wird ja auch abgeraten (inkompatibele Hardware).


Gruß
Bastian


Nach oben
 Profil  
 
BeitragVerfasst: 24.01.2010, 23:00 
Offline

Registriert: 01.01.2010, 17:18
Beiträge: 11
Ok, ich habe es jetzt geschafft.
Zum einem war es das eingeschaltete Mipmapping schuld, zum anderem der Bilineare filter (er wollte die Pixel von sonst wo mappen).

Aber da das Mipmapping jetzt nichtmehr da ist, wird das Renderin irre langsam, sobald man mehr von der Texture sieht...Gibt es eine möglichkeit das Mipmapping selber nachzustellen, oder zumindest das ganze irgendwie zu beschleunigen? Wenn Mipmapping aktiv ist tauchen manchmal trotzdem noch so kleine komische Linien auf :(

Gruß
Bastian


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de