gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:03:27 25 4
gpt4 key购买 nike

我是一个 android 应用程序,我想根据该表面的其他顶点计算表面的法线。我不想在“主”程序中这样做,因为它需要很多时间。实际上,对于每个顶点,我为每个 vextex 传递了 4 个 float 组:

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 这样的特殊关键字?还是我错过了另一种可能性?

最佳答案

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

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

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

关于android - 如何在 opengl es 2 的顶点着色器程序中访问其他顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9079534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com