在OpenGL中我可以访问我在顶点着色器中绘制的缓冲区吗?

时间:2017-01-20 22:45:58

标签: c++ opengl graphics opengl-es vbo

我知道每次运行顶点着色器时它基本上访问正在绘制的缓冲区(VBO)的一部分,当绘制顶点数7时,例如它基本上将7个顶点索引到VBO中,基于顶点属性等等。

layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec3 texCoords;     // This may be running on the 7th vertex for example.

我想要做的是访问VBO的早期部分,例如,当它绘制第7个顶点时,我想访问顶点编号1,以便我可以插值用它。

看到在运行着色器时它已经已经编入VBO索引了,我认为这是可能的,但我不知道该怎么做。

谢谢。

2 个答案:

答案 0 :(得分:0)

正如您在文档中看到的,顶点属性预计会在每次着色器运行时发生变化。所以不,你不能访问为顶点着色器中的其他顶点定义的属性。

你可以这样做: 定义统一数组并传入所需的值。但请记住,您使用更多内存,需要传递更多数据等。

答案 1 :(得分:0)

正如@Reaper所说,你可以使用统一的缓冲区,可以自由访问。但是GPU不喜欢随机访问,流通数据通常更有效。

您也可以通过将稍后/早期顶点的数据添加到数组中来解决这个问题,因为在C ++中,所有顶点都可供您使用。

例如,如果这是“普通”数组:

{
    vertex1_x, vertex1_y, vertex1_z, normal1_x, normal1_y, normal1_z, texCoord1_x, texCoord1_y,
    ...
}

然后你可以用另一个顶点的数据扩展它,用:

插值
{
    vertex1_x, vertex1_y, vertex1_z, normal1_x, normal1_y, normal1_z, texCoord1_x, texCoord1_y, vertex2_x, vertex2_y, vertex2_z, normal2_x, normal2_y, normal2_z, texCoord2_x, texCoord2_y,
    ...
}

实际上你可以传递每个顶点的任何数据。只需确保在glVertexAttribPointer参数中调整步幅大小和其他参数。