This project is mostly a collection of sub-projects and implementations of ideas and techniques, so please excuse the messy/naive code, but I always welcome constructive criticism.

My initial thought was the texture coordinates are wrong, but they appear correct on a quick check in 3ds Max. The screenshot has some notations, I'm also using an object loading that's slightly modified from one I found in one of the DirectX11 game books (.obj is a stop gap until I can write my own format). Please let me know if I've forgotten something.

#pragma pack(push, 1) private: struct VertexType { XMFLOAT3 position; XMFLOAT2 texture; XMFLOAT3 normal; }; #pragma pack(pop) bool Mesh::InitializeBuffers(ID3D11Device* device) VertexType* vertices; unsigned long* indices; D3D11_BUFFER_DESC vertexBufferDesc, indexBufferDesc; D3D11_SUBRESOURCE_DATA vertexData, indexData; HRESULT result; int i; vertices = new VertexType[m_vertexCount]; if (!vertices) return false; indices = new unsigned long[m_indexCount]; if (!indices) return false; for (i = 0; i < m_vertexCount; ++i) { vertices[i].position = XMFLOAT3(m_mesh[i].x, m_mesh[i].y, m_mesh[i].z); vertices[i].texture = XMFLOAT2(m_mesh[i].tu, m_mesh[i].tv); vertices[i].normal = XMFLOAT3(m_mesh[i].nx, m_mesh[i].ny, m_mesh[i].nz); indices[i] = i; } bool Mesh::LoadMesh(WCHAR* meshFilename) { bool result; float *verts, *norms, *texCoords; int i; m_objLoader = new ObjLoader; result = m_objLoader->LoadFromFile(meshFilename); if (!result) return false; m_vertexCount = m_objLoader->GetVertexCount(); m_indexCount = m_vertexCount; verts = m_objLoader->GetVerticesPtr(); norms = m_objLoader->GetNormalsPtr(); texCoords = m_objLoader->GetTexCoordsPtr(); int vIndex = 0; int nIndex = 0; int tIndex = 0; m_mesh = new MeshType[m_vertexCount]; for (i = 0; i < m_vertexCount; ++i) { m_mesh[i].z = verts[vIndex] * -1.0f; // Correct vertex winding vIndex++; m_mesh[i].y = verts[vIndex]; vIndex++; m_mesh[i].x = verts[vIndex]; vIndex++; } for (i = 0; i < m_objLoader->GetTexCoordsCount(); ++i) { m_mesh[i].tu = texCoords[tIndex]; tIndex++; m_mesh[i].tv = texCoords[tIndex]; tIndex++; } for (i = 0; i < m_vertexCount / 3; ++i) { m_mesh[i].nx = norms[nIndex]; nIndex++; m_mesh[i].ny = norms[nIndex]; nIndex++; m_mesh[i].nz = norms[nIndex]; nIndex++; } if (m_objLoader) { m_objLoader->Shutdown(); delete m_objLoader; m_objLoader = 0; } return true; }