gpt4 book ai didi

c++ - OpenGL Vertex Buffer Object 代码输出错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:25:10 25 4
gpt4 key购买 nike

我的顶点缓冲区对象代码应该可以很好地渲染纹理,但纹理却被渲染成一些三角形形状。

发生了什么 - http://godofgod.co.uk/my_files/wrong.png

应该发生什么 - http://godofgod.co.uk/my_files/right.png

此函数创建 VBO 并设置顶点和纹理坐标数据:

extern "C" GLuint create_box_vbo(GLdouble size[2]){
GLuint vbo;
glGenBuffers(1,&vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
GLsizeiptr data_size = 8*sizeof(GLdouble);
GLdouble vertices[] = {0,0, 0,size[1], size[0],0, size[0],size[1]};
glBufferData(GL_ARRAY_BUFFER, data_size, vertices, GL_STATIC_DRAW);
data_size = 8*sizeof(GLint);
GLint textcoords[] = {0,0, 0,1, 1,0, 1,1};
glBufferData(GL_ARRAY_BUFFER, data_size, textcoords, GL_STATIC_DRAW);
return vbo;
}

这是另一个函数的一些相关代码,该函数应该使用 VBO 绘制纹理。

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor4d(1,1,1,a/255);
glBindTexture(GL_TEXTURE_2D, texture);
glTranslated(offset[0],offset[1],0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexPointer(2, GL_DOUBLE, 0, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer (2, GL_INT, 0, 0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDrawArrays(GL_TRIANGLES, 1, 3);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

我希望代码使用前三个坐标(左上、左下、右上)和后三个(左下、右上、右下)来绘制三角形以最有效的方式正确处理纹理数据。我不明白为什么三角形应该使它更有效率,但显然这是要走的路。当然,由于某种原因它会失败。

我想问的是哪里出了问题,但我的处理方式是否总体正确?

谢谢。

最佳答案

如果你想对顶点和纹理坐标使用同一个 VBO,你需要使用结构对它们进行分组。

定义您的数据:

typedef struct {
GLdouble x, y;
GLint s, t;
} VertexData;

VertexData data[] = {
// x y s t
{0.0, 0.0, 0, 0},
{0.0, size[1], 0, 1},
{size[0], 0.0, 1, 0},
{size[0], size[1], 1, 1}
};

复制到VBO中:

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), (GLvoid*)data, GL_STATIC_DRAW);

设置指针。请注意,步幅是您的结构的大小,指针本身用作偏移量:

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexPointer(2, GL_DOUBLE, sizeof(VertexData), (GLvoid*)offsetof(VertexData, x));
glTexCoordPointer(2, GL_INT, sizeof(VertexData), (GLvoid*)offsetof(VertexData, s));
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

然后画画。

编辑:按照 Bahbar 的建议使用 offsetof() 实现了偏移。

关于c++ - OpenGL Vertex Buffer Object 代码输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2952706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com