我知道每次运行顶点着色器时它基本上访问正在绘制的缓冲区(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索引了,我认为这是可能的,但我不知道该怎么做。
谢谢。
答案 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参数中调整步幅大小和其他参数。