[Gelöst] Vertices kommen nicht richtig am Shader an



  • Tag alle zusammen,

    wie im Betreff schon steht kommen aus irgend einem Grund meine Vertices nicht richtig am Shader an.
    Ich kann weder einen Würfel, noch eine Plane oder ein einzelnes Face zeichnen ohne dass er mir irgendwas verhaut.

    Hier versuche ich einen Würfel zu zeichnen (24 Vertices | 36 Indices)

    Solid:
    http://fs2.directupload.net/images/user/150123/skgu4w2z.png

    Wireframe:
    http://fs1.directupload.net/images/user/150123/eolt5mn7.png

    Was laut RenderDoc am Shader ankommt:
    http://fs1.directupload.net/images/user/150123/8994xozc.png

    Ich könnte jetzt Code ohne Ende posten aber da ich keine Ahnung habe woher das resultiert wäre es im Moment eher kontra produktiv, glaube ich.


  • Mod

    das du renderdoc benutzt ist schonmal lobenswert, aber wir wissen nicht was ankommen sollte, daher nicht ob es falsch ist.

    hast du d3d debug an?

    BlackArma schrieb:

    Ich könnte jetzt Code ohne Ende posten aber da ich keine Ahnung habe woher das resultiert wäre es im Moment eher kontra produktiv, glaube ich.

    bleiben uns da mehr optionen als nickend zu sagen "ja, da scheint wirklich etwas schief zu gehen"

    nein, poste nicht code ohne ende, poste nur die relevanten sachen und falls es zuviel hier wird, dann benutze eine der nopaste seiten und verlinke es hier.

    dann haben wir eine chance zu sagen was falsch ist.



  • rapso schrieb:

    hast du d3d debug an?

    Ich denke mal schon ^^.

    rapso schrieb:

    nein, poste nicht code ohne ende, poste nur die relevanten sachen und falls es zuviel hier wird, dann benutze eine der nopaste seiten und verlinke es hier.

    dann haben wir eine chance zu sagen was falsch ist.

    So soll es sein!

    Hiermit halte ich meine Vertices und Indices.

    struct SMeshTexture
    {
    	SMeshTexture( )
    	{
    	};
    
    	SMeshTexture( const DirectX::XMFLOAT3& _v, const DirectX::XMFLOAT2& _c )
    		: pos( _v ), texCoord( _c )
    	{
    	}
    
    	SMeshTexture( float _vx, float _vy, float _vz, float _ux, float _uy )
    		: pos( _vx, _vy, _vz ), texCoord( _ux, _uy )
    	{
    	}
    
    	DirectX::XMFLOAT3 pos;
    	DirectX::XMFLOAT2 texCoord;
    };
    
    struct SMeshData
    {
    	std::vector<SMeshTexture> vertices;
    	std::vector<unsigned int> indices;
    
    	void clear()
    	{
    		vertices.clear();
    		indices.clear();
    	}
    };
    

    Hier fülle ich meine Struktur mit Daten für einen Würfel.

    void AssetPipeline::CreateCube( float _width, float _height, float _depth, SMeshData& _meshData )
    {
    	SMeshTexture v[24];
    
    	float x = 0.5f * _width;
    	float y = 0.5f * _height;
    	float z = 0.5f * _depth;
    
    	// Fill in the front face vertex data.
    	v[0] = SMeshTexture( -x, +y, -z, 0.0f, 0.0f );
    	v[1] = SMeshTexture( +x, +y, -z, 1.0f, 0.0f );
    	v[2] = SMeshTexture( -x, -y, -z, 0.0f, 1.0f );
    	v[3] = SMeshTexture( +x, -y, -z, 1.0f, 1.0f );
    
    	// Fill in the back face vertex data.
    	v[4] = SMeshTexture( +x, +y, +z, 0.0f, 0.0f );
    	v[5] = SMeshTexture( -x, +y, +z, 1.0f, 0.0f );
    	v[6] = SMeshTexture( +x, -y, +z, 0.0f, 1.0f );
    	v[7] = SMeshTexture( -x, -y, +z, 1.0f, 1.0f );
    
    	// Fill in the top face vertex data.
    	v[8] = SMeshTexture( -x, +y, +z, 0.0f, 0.0f );
    	v[9] = SMeshTexture( +x, +y, +z, 1.0f, 0.0f );
    	v[10] = SMeshTexture( -x, +y, -z, 0.0f, 1.0f );
    	v[11] = SMeshTexture( +x, +y, -z, 1.0f, 1.0f );
    
    	// Fill in the bottom face vertex data.
    	v[12] = SMeshTexture( +x, -y, +z, 0.0f, 0.0f );
    	v[13] = SMeshTexture( -x, -y, +z, 1.0f, 0.0f );
    	v[14] = SMeshTexture( +x, -y, -z, 0.0f, 1.0f );
    	v[15] = SMeshTexture( -x, -y, -z, 1.0f, 1.0f );
    
    	// Fill in the left face vertex data.
    	v[16] = SMeshTexture( -x, +y, +z, 0.0f, 0.0f );
    	v[17] = SMeshTexture( -x, +y, -z, 1.0f, 0.0f );
    	v[18] = SMeshTexture( -x, -y, +z, 0.0f, 1.0f );
    	v[19] = SMeshTexture( -x, -y, -z, 1.0f, 1.0f );
    
    	// Fill in the right face vertex data.
    	v[20] = SMeshTexture( +x, +y, -z, 0.0f, 0.0f );
    	v[21] = SMeshTexture( +x, +y, +z, 1.0f, 0.0f );
    	v[22] = SMeshTexture( +x, -y, -z, 0.0f, 1.0f );
    	v[23] = SMeshTexture( +x, -y, +z, 1.0f, 1.0f );
    
    	_meshData.vertices.assign( &v[0], &v[24] );
    
    	//
    	// Create the indices.
    	//
    
    	UINT i[36];
    
    	// Fill in the front face index data
    	i[0] = 0; i[1] = 1; i[2] = 3;
    	i[3] = 0; i[4] = 3; i[5] = 2;
    
    	// Fill in the back face index data
    	i[6] = 4; i[7] = 5; i[8] = 7;
    	i[9] = 4; i[10] = 7; i[11] = 6;
    
    	// Fill in the top face index data
    	i[12] = 8; i[13] = 9; i[14] = 11;
    	i[15] = 8; i[16] = 11; i[17] = 10;
    
    	// Fill in the bottom face index data
    	i[18] = 12; i[19] = 13; i[20] = 15;
    	i[21] = 12; i[22] = 15; i[23] = 14;
    
    	// Fill in the left face index data
    	i[24] = 16; i[25] = 17; i[26] = 19;
    	i[27] = 16; i[28] = 19; i[29] = 18;
    
    	// Fill in the right face index data
    	i[30] = 20; i[31] = 21; i[32] = 23;
    	i[33] = 20; i[34] = 23; i[35] = 22;
    
    	_meshData.indices.assign( &i[0], &i[36] );
    }
    

    Die Input Layout Description.

    const D3D11_INPUT_ELEMENT_DESC CInputDesc::texture[2] =
    {
    	{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    	{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    };
    

    Hier baue ich meine Buffer.

    void Object::BuildBuffers()
    {
    	RELEASE_COM( m_vertexBuffer );
    	RELEASE_COM( m_indexBuffer );
    
    	// Build Vertex Buffer Description
    	D3D11_BUFFER_DESC vertexBufferDesc = {};
    	vertexBufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
    	vertexBufferDesc.ByteWidth = sizeof(SMeshTexture) * m_meshData.vertices.size( );
    	vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    	D3D11_SUBRESOURCE_DATA vertexInitData = {};
    	vertexInitData.pSysMem = &m_meshData.vertices[0];
    	HR( m_deviceRef->CreateBuffer( &vertexBufferDesc, &vertexInitData, &m_vertexBuffer ) );
    
    	// Build Index Buffer Description
    	D3D11_BUFFER_DESC indexBufferDesc = {};
    	indexBufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
    	indexBufferDesc.ByteWidth = sizeof(unsigned int) * m_meshData.indices.size( );
    	indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
    	D3D11_SUBRESOURCE_DATA indexInitData = {};
    	indexInitData.pSysMem = &m_meshData.indices[0];
    	HR( m_deviceRef->CreateBuffer( &indexBufferDesc, &indexInitData, &m_indexBuffer ) );
    }
    

    Und hier renderer ich letzten Endes mein Objekt/Würfel.

    void Object::Render()
    {
    	UINT stride = sizeof( SMeshTexture );
    	UINT offset = 0;
    
    	m_deviceContextRef->IASetInputLayout( m_inputLayout );
    	m_deviceContextRef->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
    	m_deviceContextRef->IASetVertexBuffers( 0, 1, &m_vertexBuffer, &stride, &offset );
    	m_deviceContextRef->IASetIndexBuffer( m_indexBuffer, DXGI_FORMAT_R32_UINT, 0 );
    
    	XMMATRIX world = GetWorldMatrix( );
    	m_fxWorld->SetMatrix( reinterpret_cast<float*>( &world ) );
    	m_fxTexture->SetResource( m_texture );
    	m_fxTextureSampler->SetSampler( 0, m_textureSampler );
    
    	D3DX11_TECHNIQUE_DESC techDesc = {};
    	m_effectTech->GetDesc( &techDesc );
    
    	for(UINT p = 0; p < techDesc.Passes; ++p)
    	{
    		m_effectTech->GetPassByIndex( p )->Apply( 0, m_deviceContextRef );
    
    		m_deviceContextRef->DrawIndexed( m_meshData.indices.size( ), 0, 0 );
    	}
    }
    

  • Mod

    BlackArma schrieb:

    rapso schrieb:

    hast du d3d debug an?

    Ich denke mal schon ^^.

    bevor ich mir den source durchlese, hast du d3d debug explizit eingeschaltet? wenn nicht, make it so, das schliesst sehr viel fehlerquellen automatisch aus.



  • Ja habe ich.



  • EDIT: Da warst du glatt schneller als ich, daher den nächsten Absatz ignorieren
    Um mal die (vermutlich) nächste Frage vorweg zu nehmen, Debug Features aktivierst du indem du bei D3D11CreateDevice(AndSwapChain) im Parameter flags das entsprechende Flag zusätzlich mit dem Wert D3D11_CREATE_DEVICE_DEBUG belegst.

    Außerdem leg ich mich mal weit aus dem Fenster und behaupte das deine Matrix mit der du deine Vertices multiplizierst falsch ist. Musst du die eventuell noch transponieren, etc.? (HLSL Default ist column-major order und XMMATRIX ist afaik row_major-order. Transponieren indem du entweder XMMatrixTranspose aufrufst oder in dein HLSL file, sowas wie #pragma pack_matrix( row_major )

    Und was mir grad noch aufgefallen ist, wenn ich es richtig interpretiere, dann scheinen mir die ersten 3 Vertices die laut RenderDoc am Shader ankommen nicht unbedingt dazu geeignet um ein Dreieck aufzuspannen, das in einen Würfel integriert werden kann.

    floorball



  • Die Matrizen sehen alle in Ordnung aus.
    Die World Matrix ist eine Einheitsmatrix und die Projection Matrix sieht auch gut aus bzw es steht kein Schrott drinnen.


  • Mod

    BlackArma schrieb:

    vertexBufferDesc.ByteWidth = sizeof(SMeshTexture) * m_meshData.vertices.size( );
    

    steht da 480?

    BlackArma schrieb:

    UINT stride = sizeof( SMeshTexture );
    

    ist das 20?



  • rapso schrieb:

    BlackArma schrieb:

    vertexBufferDesc.ByteWidth = sizeof(SMeshTexture) * m_meshData.vertices.size( );
    

    steht da 480?

    Ja da steht 480 drinnen.

    rapso schrieb:

    BlackArma schrieb:

    UINT stride = sizeof( SMeshTexture );
    

    ist das 20?

    Nein, da steht aus irgend einem Grund 32 drin, hab es mal per Hand auf 20 geändert und dann funktioniert es 😕
    Nunja, jetzt weiß ich immerhin warum da nur Müll raus gekommen ist, vielleicht finde ich den Fehler warum da immer 32 rauskommt.


  • Mod

    such nach c++ struct member alignment, das wird es erklaeren 😉


  • Mod



  • rapso schrieb:

    such nach c++ struct member alignment, das wird es erklaeren 😉

    Noch nie davon gehört, durchaus interessant zu wissen 🙂

    rapso schrieb:

    hatte vorhin nicht soviel zeit, hier die infos:
    http://en.wikipedia.org/wiki/Data_structure_alignment
    http://www.drdobbs.com/cpp/padding-and-rearranging-structure-member/240007649
    https://evpo.wordpress.com/2014/01/25/memory-alignment-of-structures-and-classes-in-c-2/

    moegliche loesungen
    VC++: #pragma pack(1) https://msdn.microsoft.com/en-us/library/2e70t5y1.aspx
    GCC: __attribute__ ((__packed__))

    Scheint nun zu funktionieren. Dankeschön!!!


Anmelden zum Antworten