纹理化顶点缓冲区对象

发布于 2024-07-09 19:26:58 字数 725 浏览 11 评论 0原文

我想做的是用 OpenGL 绘制一个(大)地形。 所以我有一组顶点,比如说 256 x 256,我将其存储在 VRAM 中的顶点缓冲区对象中。 我正确地对它们进行了三角测量,所以我有一个用于面的索引缓冲区。

// vertexes
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBufferId);
glVertexPointer(3, GL_FLOAT, 0, 0);
// textures
glBindBufferARB(GL_ARRAY_BUFFER_ARB, texCoordBufferId);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
// indexes
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indexBufferId);
// draw it
glDrawRangeElements(GL11.TRIANGLES, 0, size - 1, size, GL_UNSIGNED_INT, 0);

我还加载了一个方形纹理,该纹理必须应用于每个三角形。 所以我遇到了纹理坐标的问题:

每个顶点都包含在 4 个三角形中,这意味着它需要 4 个纹理坐标。 但 glDrawRangeElements() 需要与顶点一样多的纹理坐标。

所以我不知道如何使用 VBO 来做到这一点。 也许有更好的概念来解决我的问题,或者我只是缺乏一个好主意。

提前致谢。

What I want to do is drawing a (large) terrain with OpenGL. So I have a set of vertices, lets say 256 x 256 which I store in a vertex buffer object in the VRAM. I properly triangulated them, so I've got an index buffer for the faces.

// vertexes
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBufferId);
glVertexPointer(3, GL_FLOAT, 0, 0);
// textures
glBindBufferARB(GL_ARRAY_BUFFER_ARB, texCoordBufferId);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
// indexes
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indexBufferId);
// draw it
glDrawRangeElements(GL11.TRIANGLES, 0, size - 1, size, GL_UNSIGNED_INT, 0);

I also loaded a square texture which has to be applied to each triangle. So I've got a problem with the texture coords:

Each vertex is included in 4 triangles which means it needs 4 texture coords. But glDrawRangeElements() requires as much texture coords as vertexes.

So I don't the see the way how to do this with the VBOs. Maybe there is better concept for solving my problem or I'm just lacking a good idea.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

玻璃人 2024-07-16 19:26:58

如果您的纹理应在每个四边形中重复(或镜像)自身,则最好的方法是使用与数组中的 (x, y) 位置编号相匹配的纹理坐标。 例如,对于第一行顶点,使用以下纹理坐标:(0.0, 0.0)、(1.0, 0.0)、(2.0, 0.0)...(255.0, 0.0)。

If your texture should repeat (or mirror) itself in each quad the best way would be to use texture coordinates that match the number of the (x, y) position in your array. E.g. for the first line of vertices use these texture coordinates: (0.0, 0.0), (1.0, 0.0), (2.0, 0.0)...(255.0, 0.0).

乙白 2024-07-16 19:26:58

由于您可能希望纹理无缝平铺,因此您所需要做的就是计算每个顶点的正确纹理坐标并像传递顶点一样传递它们。

As you probably want your texture to seamlessly tile, all you need to is to compute the proper texture coordinate for each vertex and pass them just like the vertices.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文