gpt4 book ai didi

c++ - 将步幅应用于 glVertexAttribPointer 时,顶点位置显示不正确

转载 作者:行者123 更新时间:2023-11-27 22:46:58 25 4
gpt4 key购买 nike

我遇到了一个问题,我的顶点被绘制到屏幕外。我将所有顶点属性指针的步幅更改为 0,现在它们绘制在正确的位置。

下面是一些代码来启动它:

glGenVertexArrays(1, &vertexID);
glBindVertexArray(vertexID);

glGenBuffers(1, &bufferID);
glBindBuffer(GL_ARRAY_BUFFER, bufferID);


GLfloat verts[4 * 2 * 3] = { -0.5, -0.5, 0.0, 1.0,// bottom left
.5, -.5, 0.0, 1.0, // bottom right
-.5, .5, 0.0, 1.0, // top left
0.5, 0.5, 0.0, 1.0,
.5, -.5, 0.0, 1.0, // bottom right
-.5, .5, 0.0, 1.0, // top left// top right
};
GLfloat color[4 * 3 * 2] = {
1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f };

GLfloat tex[8] = {
1.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f,
0.0f, 1.0f
};

glBufferData(GL_ARRAY_BUFFER, sizeof(verts) + sizeof(color) + sizeof(tex), nullptr, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(verts), verts);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(verts), sizeof(color), color);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(verts) + sizeof(color), sizeof(tex), tex);


glClearColor(0.05f, 0.05f, 0.05f, 1.0f);







glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, NULL);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, (const GLvoid *)(sizeof(GLfloat) * 4));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, (const GLvoid *)(sizeof(GLfloat) * 8));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);


glGenBuffers(1, &ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);

GLuint indices[4] = {
0,2,1,3
};
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_DYNAMIC_DRAW);

然后是渲染代码

   glClear(GL_COLOR_BUFFER_BIT);

glBindTexture(GL_TEXTURE_2D, texture);

glBindVertexArray(vertexID);

glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0);
//glDrawArrays(GL_TRIANGLES, 0, 6);
glFlush();

SDL_GL_SwapWindow(window);

好吧,这就是我感到困惑的地方:

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, NULL);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, (const GLvoid *)(sizeof(GLfloat) * 4));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, (const GLvoid *)(sizeof(GLfloat) * 8));

使用上面的代码,程序不会呈现我要呈现的正确正方形。如果我将所有这些的步幅更改为 0,那么它会呈现在正确的位置。我对此的理解是我对 3 组信息进行了子缓冲:位置、颜色和 tex 坐标。因此,我认为数据如下所示: enter image description here

我将步幅设置为 sizeof(GLFloat) * 10,但是,这不起作用。这让我假设我也没有正确设置偏移值。 那么为什么我的步幅会弄乱顶点位置?

最佳答案

Therefor I thought the data looked like the following:

但这不是你告诉 OpenGL 的。

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(verts), verts);

这告诉 OpenGL 获取数组 verts 并将其复制到缓冲区对象的开头。

glBufferSubData(GL_ARRAY_BUFFER, sizeof(verts), sizeof(color), color);

这告诉 OpengL 获取数组 color,并将其复制到缓冲区对象中,但是在所有 verts 之后。

这里没有交错。您缓冲区存储所有 verts,然后是所有 color,然后是所有 tex。它不存储 4 个 verts float ,后跟 4 个 color float ,然后是 4 个 tex float 。

glBufferSubData 无法为您交错数据(好吧,您可以在一长串调用中做到这一点,但那太荒谬了)。如果您想上传交错的顶点数据,必须在 CPU 上交错,然后再上传。

将步幅设置为 0 并不能使这项工作成功。好吧,它不会使其正确 工作。相对于您实际上传的数据,您的基本偏移量仍然是错误的。您将获得正确的位置数据,但颜色和纹理坐标将是错误的。

关于c++ - 将步幅应用于 glVertexAttribPointer 时,顶点位置显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41639858/

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