Total simpler Pixelshader - Problem :(



  • Ich habe einen Pixelshader, der einfach nur die Texturfarbe zurückgeben soll. Da dieser Shader fürs Terrain benutzt wird, sollen die Texturkoordinaten repeated werden. Das Ergebnis ist ... ernüchternd: http://home.arcor.de/firbach/ivan_traurig.jpg

    Der Vertexshader scheint schon mal richtig zu arbeiten. Ich hab beim Pixelshader das Gefühl, dass die Texturkoordinaten nicht stimmen, und scheinbar in genau eine Richtung nicht. Die "Landschaft" dreht sich beim rotieren der View schön mit, es ist also nichts ganz komisches. Das Bild sieht in allen drei Farbkanälen so verworren aus, im Alpha ist es weiß (wie es sein soll).

    Hier ist mein Effect-File:

    // Parameters
    float4x4 worldViewProj : WorldViewProjection;
    texture diffuseTexture;
    texture alphaTexture;
    
    // Variables
    sampler DiffuseSampler = sampler_state {
        AddressU  = WRAP;        
        AddressV  = WRAP;
        AddressW  = WRAP;
        MIPFILTER = LINEAR;
        MINFILTER = LINEAR;
        MAGFILTER = LINEAR;
        texture = <diffuseTexture>;
    };
    
    sampler AlphaSampler = sampler_state {
        MIPFILTER = LINEAR;
        MINFILTER = LINEAR;
        MAGFILTER = LINEAR;
        texture = <alphaTexture>;
    };
    
    // Structures
    struct vertex {
        float4 pos					: POSITION;
        float2 coordinates0			: TEXCOORD0;
        float2 coordinates1			: TEXCOORD1;
    };
    
    // Shaders
    vertex VS_Transform(vertex IN) {
        vertex OUT;
        OUT.pos = mul(IN.pos, worldViewProj);
        OUT.coordinates0 = IN.coordinates0;
        OUT.coordinates1 = IN.coordinates1;
    
        return OUT;
    }
    
    float4 PS_Texture(vertex IN) : COLOR {
    //	float4 ones = {1.0f, 1.0f, 1.0f, 1.0f};
    //	float4 diffuseValue = tex2D(DiffuseSampler, IN.coordinates0);
    //	float4 alphaValue = tex2D(AlphaSampler, IN.coordinates1);
    //	return diffuseValue * ones;
    	return tex2D(DiffuseSampler, IN.coordinates1);
    }
    
    // Techniques
    technique Default {
    	pass P0 {
    		AlphaTestEnable = false;
    		ZEnable = false;
    		Lighting = false;
    		CullMode = None;
    
    		VertexShader = compile vs_1_1 VS_Transform();
    		PixelShader  = compile ps_1_1 PS_Texture();
    	}
    }
    

    Ich hoffe ihr könnt mir helfen, den Fehler zu finden. Ich bin Anfänger bei den Shadern, aber ich hab da jetzt schon eine ganze Zeit gesucht und glaub langsam, dass es nichts triviales ist. Wie kann man sowas eigentlich systematisch debuggen? Ich benutze die Debug-Runtimes und mir wird keine Warnung und kein Fehler angezeigt. Im Referenz-Rasterizer sieht das Bild genauso aus.



  • Stimmen die Texturkoordinaten denn?
    Sieht es mit der Fixed Pipeline genauso aus?



  • Passen die Texturkoordinaten von TEXCOORD1 wirklich zur diffuseTexture? Ansonsten nochmal gewissenhaft das 2. Texturkoordinatenpaar der Vertices prüfen, ob die überhaupt stimmen.



  • Danke für eure Zeit. Ich hab jetzt herausgefunden dass mein Vertex-Struct schuld war. Angefangen hat es so:

    Der Vertexshader-Compiler hat darauf bestanden, dass ich an der POSITION alle 4 Elemente zuweise. Ich hatte da ursprünglich nen float3. Hab ich mir gedacht "ja scheiße, dann mach ich halt ein float4". Dementsprechend hab ich auch in meiner D3D-Anwendung das struct angepasst und noch ein dummy-float hinzugefügt. Seitdem ist alles schief gegangen. Das wusste ich da aber noch nicht, da ich auch noch keinen Pixelshader hatte und erst als ich den hatte hab ich das Problem bemerkt.

    Jetzt meine Frage: Warum funktioniert das jetzt überhaupt. Mein Vertex-struct sieht so aus:

    private float x, y, z;
    		private float u1, v1;
    		private float u2, v2;
    

    Das Effect-File wie vorhin. Warum führt das hier nicht zu Problemen, das vertex-struct dort ist immerhin ein float größer definiert. 😕 Oder kommen die Probleme noch...



  • Die Anwendungs-Daten müssen nicht 100%ig mit den Shader Daten übereinsteimmen.
    Wenn deine Shader-Daten mehr Elemente besitzen, werden diese einfach mit 0 aufgefüllt (außer für w, die wird mit 1 gefüllt).
    In deinem Beispiel mappst du ja nen float3 (D3DDECLTYPE_FLOAT3) auf nen float4, wodurch aus (x,y,z) ein (w,y,z,1) wird, was ja passt für die Transformation. Sollte also alles passen. 🙂

    Edit: wenn dich der implizte Cast stört, kannste ja ne extra Input-Struktur mit nem float3 als POS Semantik definieren und dann die Pos so in den Homogenen Clip Space transformieren:
    OUT.pos = mul(float4(IN.pos, 1), worldViewProj);



  • Ah ok. Jetzt ist jedenfalls alles geil (auch das Farbschema des Forums wieder). 🙂


Anmelden zum Antworten