- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个问题,我的顶点被绘制到屏幕外。我将所有顶点属性指针的步幅更改为 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 坐标。因此,我认为数据如下所示:
我将步幅设置为 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/
我不确定哪种结构布局最适合我的应用程序:共享、打包、std140、std430。我并不是要求对每个信息进行解释,这些信息很容易找到,只是很难弄清楚每个信息对供应商兼容性/性能的影响。如果 shared
如何在 Swift 中获取特定数字类型的最小值(跨度)?我的意思是,最短的非零步幅。例如 1 代表 Int,0.00...001 代表 Double 等... 最佳答案 这已经在单独的评论中得到了部分
有没有办法告诉 numpy 在写入 python pickle 文件时保留非标准步幅? >>> # Create an array with non-standard striding >>> x =
我将图像存储为 2d numpy 数组(可能是多维)。 我可以在那个反射(reflect)二维滑动窗口的数组上创建一个 View ,但是当我 reshape 它以使每一行都是一个扁平化的窗口(行是窗口
我是一名优秀的程序员,十分优秀!