Vertex and index buffers in DirectX.

Started by
1 comment, last by MJP 11 years, 1 month ago

Hey guys, I'm learning DirectX and I've recently come across a problem that I would like some insight on. I have a cube class that creates a vertex buffer of vertices containing a 3D vector for position and a 3D vector for normals and a 2D vector for textures coordinates.

vec3 position

vec3 normal

vec2 texcoords

I'm using an index buffer as well so that I only need to have 8 vertices instead of 36. The problem with this is when texturing, the same vertex (for example the front face top left corner) would need to have different texture coordinates depending on which triangle it is part of during rendering (as each vertex will be part of 4 triangles). For instance the front face - top left vertex would have texture coordinates of 0,0 for the two triangles of the front face, but for the top face I would want that vertex to have texture coordinates of 0,1, and for the left face I would want that vertex to have texture coordinates of 1,0.

To try and solve this problem I just decided to create another vertex buffer to hold the 4 different texture coordinates and setup the input layout to read the texture coordinates from that buffer. Then I saw that you could only bind one index buffer...The only compromise I see right now is to create 24 vertices instead of 8, where each vertex has 3 permutations of texture coordinates depending on which face of the cube it is being rendered from.

So I'm curious as to whether there is a better way to structure your buffers so that you wouldn't need one large buffer of 24 vertices for a textured cube which really only has 8 vertices?

Thanks for the help.

Advertisement
Nope, that's the way to do it... 24 vertices.

Most "real" models are much smoother, and can generally share a lot more vertices between triangles.

Yeah GPU's can only work with a single index buffer, so typically you will duplicate vertices so that you have enough for all necessary combination of position/normal/UV/tangent/etc. If you're using a vertex shader and DX10+ it's possible to implement more complex means for storing vertex data since you can load arbitrary data from buffers, however like I said before the GPU is limited to one index buffer and your vertex shader will (usually) only run once for each vertex specified in the index buffer. Therefore it can get pretty complicated to do something like this.

This topic is closed to new replies.

Advertisement