[Gelöst] Vertices kommen nicht richtig am Shader an
-
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 ); } }
-
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.
-
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.
-
such nach c++ struct member alignment, das wird es erklaeren
-
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__))
-
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!!!