如何在opengl es 2中访问顶点着色器程序中的其他顶点?

时间:2012-01-31 12:31:58

标签: android opengl-es shader vertex-shader

我是一个Android应用程序,我想计算表面在这个表面的其他顶点上的depanding的法线。我不想在“主”程序中这样做,因为它花费了很多时间。实际上,对于每个顶点,我为每个vextex传递4个浮点数组:

attribute vec3 a_bottom;
attribute vec3 a_left;
attribute vec3 a_right;
attribute vec3 a_top;

vec3 calculNormal( ) {
    return normalize( cross( (a_left - a_right) , ( a_bottom - a_top ) ) );
}

我知道的代码非常非常脏,所以我不想传递4个数组,而是想要这样做:

vec3 calculNormal( ) {
    vec3 a_left = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - 1 ];
    vec3 a_bottom = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - X ];
    ...
    return normalize( cross( (a_left - a_right) , ( a_bottom - a_top ) ) );
}

那么在顶点着色器程序中是否可以访问当前的浮点缓冲区?是否有像currentFloat这样的特殊关键字?还是有另一种可能性,我想念?

2 个答案:

答案 0 :(得分:8)

这确实不可能。顶点着色器只能访问当前处理的顶点及其属性。由于OpenGL ES没有texture_buffer_object扩展名,因此无法在着色器中访问VBO的数据。因此,访问顶点'邻居的唯一方法是将它们显式地放在顶点属性中,就像在第一个示例中一样。

但是,由于看起来您的几何图形是矩形图案,因此您也可以将其存储在纹理中(或将其复制到一个,如果ES支持,pixel_buffer_object扩展可能会有帮助。在这种情况下,您可以使用经典的GPGPU片段着色器,该着色器计算输出图像的每个“像素”(在本例中为顶点)的法线(在本例中为矩形几何体的法线数据),基于它的邻居(通过简单的纹理访问访问)。

但是我想,考虑到额外的编程开销和/或内存复制操作,第一个和第二个都不会真的由你做任何事情,因为计算顶点法线已经非常快了。你无论如何都不必每次都这样做,如果你真的这样做,那是因为你也在更新你的顶点位置,在这种情况下你可以使用相同的更新例程来处理普通数据(无论是CPU还是CPU) GPGPU)。

答案 1 :(得分:4)

  

我想计算表面在这个表面的其他顶点上的depanding的法线。

错误的做法。计算法线并将它们与顶点一起存储。

  

我不想在“master”程序中这样做,因为它花了很多时间。

您不应重新计算每个渲染过程的法线。只需计算一个并存储它们。顶点着色器中的计算不是免费的。计算VS中的法线只会浪费处理能力。

计算它们,存储它们。