HLSL Problem mit PixelShader



  • Hallo,

    ich schreibe derzeit meinen ersten richtigen HLSL Shader.
    Ich habe Vertex- und Pixel Shader in einer Datei "*.hlsl".

    Das ist der Code meines Shaders:

    // HLSL test nr. 1
    
    float4x4 WorldViewProj;
    
    int Demo;
    
    sampler2D tex0;
    
    /*
     * === Vertex shader ===
     */
    
    struct SVertexOutput
    {
    	float4 Position	: POSITION;		// Vertex position
    	float2 TexCoord	: TEXCOORD0;	// Texture coordinate
    };
    
    SVertexOutput VertexMain(
    	float4 Position	: POSITION,
    	float4 Normal : NORMAL,
    	float2 TexCoord	: TEXCOORD0)
    {
    	SVertexOutput Output;
    
    	Output.Position = mul(Position, WorldViewProj);
    	Output.TexCoord = TexCoord;
    
    	return Output;
    }
    
    /*
     * === Pixel shader ===
     */
    
    float4 PixelMain(
    	float4 Position : POSITION,
    	float2 TexCoord : TEXCOORD0) : COLOR
    {
    	float4 Color = tex2D(tex0, TexCoord);
    
    	if (Position.y < 0.0)
    	{
    		if (Position.x < 0.0)
    		{
    			if ( (Color.r + Color.g + Color.b)/3.0 >= 0.5)
    				Color = float4(1.0, 1.0, 1.0, Color.a);
    			else
    				Color = float4(0.0, 0.0, 0.0, Color.a);
    		}
    		else
    		{
    			Color = float4(
    				( Color.r + Color.g + Color.b ) / 3.0,
    				( Color.r + Color.g + Color.b ) / 3.0,
    				( Color.r + Color.g + Color.b ) / 3.0,
    				Color.a
    			);
    		}
    	}
    	else
    	{
    		if (Position.x > 0.0)
    			Color = float4(1.0 - Color.r, 1.0 - Color.g, 1.0 - Color.b, Color.a);
    	}
    
    	return Color;
    }
    

    Im Pixel shader gibt es Probleme wegen des "float4 Position : POSITION".
    Wenn ich POSITION1 nehem, kommt zwar keien Fehler meldung, aber es steht immer ( 0 | 0 | 0 | 0 ) in dem Vektor 😞

    Kann mir jemand sagen was an diesem Shader falsch ist??

    PS: Ich habe es auch schon mit PS version 2_0 und 3_0 usw. ausprobiert.



  • Ich hab schon länger nichts mehr mit HLSL gemacht, aber POSITION im Pixelshader kommt mir ein bisschen komisch vor. Was soll denn deiner Meinung nach da drin stehen?



  • Naja ich dachte die Pixel position?!

    Wie kann ich den 'varying' wie in GLSL einbauen. Also sonstige Werte von Vertex- zu Pixel Shader übertragen?

    Und noch eine zweite Frage nebenbei: Wird der VertexShader wirklich nur auf jeden Vertex angewand? Der Name lässt ja darauf schließen, aber manchmal verstehe ich nicht, wie das gehen soll, wenn er nicht auf jeden Pixel angewand wird?!



  • Von http://msdn.microsoft.com/en-us/library/bb944006(VS.85).aspx#Varying_Shader_Inputs_and_Semantics

    Pixel and vertex shaders have different sets of input semantics due to the different parts of the graphics pipeline that feed into each shader unit.
    ...
    Pixel shader input semantics describe the information that is provided per pixel by the rasterization unit. The data is generated by interpolating between outputs of the vertex shader for each vertex of the current primitive.

    Leider steht da nicht welche es genau sind. Soweit ich weiß sind aber NORMAL und die verschiedenen Texturkoordinaten dabei.



  • LukasBanana schrieb:

    Naja ich dachte die Pixel position?!

    Nö, dafür gibts doch die TEXCOORDs.



  • In deinem Position stehen die interpolierten Vertexpositionen im Clipspace.
    IMHO bekommst du Screen space Positionen ab SM4.0 mit SV_Position.

    Wird der VertexShader wirklich nur auf jeden Vertex angewand?

    Wenn ein indizierter Vertex mehrmach benutzt wird, wird der Vertexshader nicht nochmal aufgerufen, wenn der Vertex noch im Cache liegt. Wenn du keine Indizes benutzt, wird ein mehrfach verwendeter Vertex wohl in jedem Fall mehrfach durch den VS gejagt werden.



  • LukasBanana schrieb:

    Und noch eine zweite Frage nebenbei: Wird der VertexShader wirklich nur auf jeden Vertex angewand? Der Name lässt ja darauf schließen, aber manchmal verstehe ich nicht, wie das gehen soll, wenn er nicht auf jeden Pixel angewand wird?!

    Wie stellst du dir vor dass es gehen soll, dass ein Vertex-Shader auf Pixel/Fragments angewendet wird?
    Wenn du uns das erklärst, können wir dir vielleicht verraten, wo du da etwas falsch verstanden hast.



  • this->that schrieb:

    ...IMHO bekommst du Screen space Positionen ab SM4.0 mit SV_Position.

    Das geht auch schon im PixelShader 3.0 mit der VPOS Semantik.



  • Okay gut das klappt jetzt einiger Maßen mit TEXCOORD.

    Dann hab' ich noch ne Frage zu globalen Variablen.
    Wenn ich danach in Google suche, finde ich nur Seiten, auf denen beschrieben steht, dass man globale Variablen vom Programm aus setzen kann (z.B. die "mWorldViewProj" Matrix) und dann im Shader nutzen kann.

    Ich möchte aber variablen anlegen, die ich z.B. im PixelShader benutzen kann und in den eigenen Funktionen im PixelShader OHNE, dass ich diese Variablen jedesmal der Funktion als Parameter übergeben muss.



  • Gameco schrieb:

    this->that schrieb:

    ...IMHO bekommst du Screen space Positionen ab SM4.0 mit SV_Position.

    Das geht auch schon im PixelShader 3.0 mit der VPOS Semantik.

    Das "ab" bezog sich auf SV_POSITION.

    @LukasBanana: Das steht alles in der SDK HLSL Doku. http://msdn.microsoft.com/en-us/library/bb509706(VS.85).aspx


Anmelden zum Antworten