Sign in to follow this  
mbradber

Vertex and index buffers in DirectX.

Recommended Posts

mbradber    129

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.

Share this post


Link to post
Share on other sites
phil_t    8084
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. Edited by phil_t

Share this post


Link to post
Share on other sites
MJP    19754

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this