我是一个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这样的特殊关键字?还是有另一种可能性,我想念?
答案 0 :(得分:8)
这确实不可能。顶点着色器只能访问当前处理的顶点及其属性。由于OpenGL ES没有texture_buffer_object
扩展名,因此无法在着色器中访问VBO的数据。因此,访问顶点'邻居的唯一方法是将它们显式地放在顶点属性中,就像在第一个示例中一样。
但是,由于看起来您的几何图形是矩形图案,因此您也可以将其存储在纹理中(或将其复制到一个,如果ES支持,pixel_buffer_object
扩展可能会有帮助。在这种情况下,您可以使用经典的GPGPU片段着色器,该着色器计算输出图像的每个“像素”(在本例中为顶点)的法线(在本例中为矩形几何体的法线数据),基于它的邻居(通过简单的纹理访问访问)。
但是我想,考虑到额外的编程开销和/或内存复制操作,第一个和第二个都不会真的由你做任何事情,因为计算顶点法线已经非常快了。你无论如何都不必每次都这样做,如果你真的这样做,那是因为你也在更新你的顶点位置,在这种情况下你可以使用相同的更新例程来处理普通数据(无论是CPU还是CPU) GPGPU)。
答案 1 :(得分:4)
我想计算表面在这个表面的其他顶点上的depanding的法线。
错误的做法。计算法线并将它们与顶点一起存储。
我不想在“master”程序中这样做,因为它花了很多时间。
您不应重新计算每个渲染过程的法线。只需计算一个并存储它们。顶点着色器中的计算不是免费的。计算VS中的法线只会浪费处理能力。
计算它们,存储它们。