我知道每次运行顶点着色器时,它基本上都会访问正在绘制的缓冲区(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 中,我认为这是可能的,但我不知道该怎么做。
谢谢。
正如您在文档中看到的,顶点属性预计在每次着色器运行时都会更改。因此,不可以,您不能访问为顶点着色器中的其他顶点定义的属性。
您可能可以这样做:定义一个统一的数组并传入所需的值。但请记住,您以这种方式使用更多内存,您需要传递更多数据等。
正如@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 参数中调整步幅大小和其他参数即可。