Mit Shadern 2 Texturen verwalten ?



  • Hi,

    Ich arbeite mich gerade in vertex/pixel shader ein. Die Shader funktionieren mit 1.er Textur wunderbar!!! Probleme gibt es wenn ich eine 2. Textur hinzufüge !!
    -> Mein test polygon wird einfach nicht mehr angezeigt 🙂

    Also hier erstmal meine Strukturen:

    #define D3DFVF_VERTEX_TEX2 ( D3DFVF_XYZ | D3DFVF_TEX2 )
    
    struct texcoord_t
    {
    	FLOAT x,y;
    };
    
    struct vertex3d_tex2_t
    {
        FLOAT x,y,z;
    	texcoord_t tex[2];
    };
    

    So hier speicher ich dann meine 2 dreiecke(polygon).

    Sicherheitshalber poste ich mal hier den COde:

    vertex3d_tex2_t vVertices[] =
    	{
    		{   0.0f, 0.0f,  3.0f, 0.0f, 1.0f, /*0.0f, 1.0f,*/ },
    		{   0.0f, 1.0f,  3.0f, 0.0f, 0.0f, /*0.0f, 0.0f,*/ },
    		{   1.0f, 0.0f,  3.0f, 1.0f, 1.0f, /*1.0f, 1.0f,*/ },
    
    		{   0.0f, 1.0f,  3.0f, 0.0f, 0.0f, /*0.0f, 0.0f,*/ },
    		{   1.0f, 1.0f,  3.0f, 1.0f, 0.0f, /*1.0f, 0.0f,*/ },
    		{   1.0f, 0.0f,  3.0f, 1.0f, 1.0f, /*1.0f, 1.0f,*/ },
    	};
    

    So bisher dürfe eig. alles regelrecht sein.

    Hier ist dann meine Vertexelement9 struktur mit folgenden Daten:

    { 0, 0,	D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }
    { 0, 12,	D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }
    { 0, 20,	D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }
    

    So und zu guter letzt setzte ich die beiden Texturen.

    m_pGraphicDevice->GetDevice()->SetTexture( 0, m_pTexture );
    	m_pGraphicDevice->GetDevice()->SetTexture( 1, m_pBumpmap );
    

    Das müsste doch reichen die Texturen einfach zu setzten, oder muss ich da noch besondere einstellungen vornhemen ?..

    So, .. Hier kommt dann noch der Pixel/VertexShader

    // Base VertexShader, v.1.1
    // ************ Register Defines **************************
    
    #define vertex_position		v0
    #define vertex_tex0			v3
    #define vertex_tex1			v4
    
    #define light_color0		c32;leer
    
    #define mat_proj			c0
    
    vs.1.1
    
    dcl_position0		vertex_position
    dcl_texcoord0		vertex_tex0
    dcl_texcoord1		vertex_tex1
    
    m4x4 oPos, vertex_position, mat_proj
    mov oD0, light_color0
    
    ;texturecoordinaten dem pixelshader übergeben
    mov oT0, vertex_tex0
    mov oT1, vertex_tex1
    
    ;END
    

    PixelShader:
    -----------

    // Base PixelShader.1.1
    ps.1.1
    
    tex t0
    
    add r0, v1, v0
    mul r0, r0, t0
    
    ;END
    

    Bin für jede Hilfe Dankbar!!

    Bye



  • Habe jetzt nicht die ahnung von Shadern aber was mir sofort auffällt ist der Pixel Shader.

    ps.1.1

    tex t0

    add r0, v1, v0
    mul r0, r0, t0

    tex t0 ist die 1. Textur. Wo ist die 2. Textur ? und die andere Sache ist das die 2. Textur dann noch irgendwie in die Rechnung rein muss.



  • Hi,
    Danke erstmal für die Antwort.

    Es ist ja im Prinzip egal ob ich ob ich Texel_1 [op] Texel_2 mache. Also ob ich Pixel von Textur1 mit Pixel von Textur2 multipliziere, dividiere... oder so.

    Ich hab einfach den Pixel von Texture0 verwendet.

    Und wenn der Fehler am PixelShader liegen sollte, müsste trotzdem ein schwarzes Polygon auftauchen(da schlimmstenfalls wäre Pixel der Pixel 0x00.. ist ), was nicht der Fall ist.

    Also muss es entwender an der Deklaration oder am VertexShader oder falschen Einstelllungen am Device oder so liegen.

    Bye



  • *push*


  • Mod

    liefert dir d3d einen errorstring beim compilieren der shader?

    rapso->greets();



  • Hi,

    nein. leider nicht.

    Bye



  • Und evtl. die DX Debug runtimes zur Laufzeit?



  • Hi,
    Nein, leider auch nicht. Das war das erste was ich geschaut hab!!.

    Ich glaub aber, das nur das Setzten der Texture nicht ausreicht!!

    m_pGraphicDevice->GetDevice()->SetTexture( 0, m_pTexture ); 
    m_pGraphicDevice->GetDevice()->SetTexture( 1, m_pBumpmap );
    

    Bye



  • Na dann lass halt deinen Schader mal weg und schau ob die Texturen so da sind. Evtl. ist ja auch gar kein Poly mehr zu sehen, weil du irgendwoanders was kaputt gemacht hast.


Anmelden zum Antworten