opengl - OpenGL VBO 中的颜色?

标签 opengl vbo

我正在尝试在 OpenGL 中使用单个结构和单个 VBO 向我的对象添加颜色。为此,我创建了一个 Vertex 结构,如下所示:

typedef struct {
    float x;
    float y;
    float z;
    float r;
    float g;
    float b;
    float a;
} Vertex;

我已经知道我正在正确设置所有坐标和颜色以获得我想要的,因为我对列表中存储的每个对象进行了迭代测试,并使用 glVertex3f 绘制点并设置颜色和 glColor4f (这比我正在寻找的要慢得多)。但是当我尝试使用 VBO 绘制它时,我发现到处都是一大堆乱七八糟的彩色三角形。

我的渲染循环中绘制 VBO 的部分如下所示:

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, NULL);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, offsetof(Vertex, r), NULL);
glDrawArrays(GL_TRIANGLES, 0, vertex_amount);
glBindBuffer(GL_ARRAY_BUFFER, 0);

我做错了什么?

最佳答案

glVertexPointer(3, GL_FLOAT, 0, NULL);
                             ^

Vertex 数组中的位置值不是紧密排列的,因此您不能使用 0 来表示 stride。使用sizeof(顶点)

glColorPointer(4, GL_FLOAT, offsetof(Vertex, r), NULL);
                            ^^^^^^^^^^^^^^^^^^^

我……不确定你来这里的目的是什么。也许您认为glVertexPointer()/glColorPointer()的第三个参数是 pointer 而不是 stride?将 offsetof() 移动到最后一个参数,pointer

一起:

glVertexPointer(3, GL_FLOAT, sizeof( Vertex ), offsetof(Vertex, x) );
glColorPointer(4, GL_FLOAT, sizeof( Vertex ), offsetof(Vertex, r) );

您可能需要将 pointer 参数值转换为 void*,具体取决于您实现 offsetof() 的方式。

关于opengl - OpenGL VBO 中的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40165256/

相关文章:

opengl - 在 OpenGL 上下文之间同步资源时是否需要调用 glFinish?

c++ - 如何在 OpenGL 中渲染 3D 文本?

c++ - 在 openGL 中绘制具有透明度的实心球体

c++ - 我想在 opengl 中将图像包裹在一个球体周围

c++ - 用于渲染不同对象的 VAO 和 VBO

java - LWJGL 体素引擎 - VBO 上的纹理

c++ - OpenGL VBO 不工作

c++ - 使用 OpenGL 固定函数旋转和平移二维图像

opengl - 多少个VAO和VBO

opengl - 在空间中移动多个对象(存储在 VBO 中)的最有效方法是什么?我应该使用 glTranslatef 还是着色器?