Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl glsl常量数组_Opengl_Opengl Es_Glsl_Glsles - Fatal编程技术网

Opengl glsl常量数组

Opengl glsl常量数组,opengl,opengl-es,glsl,glsles,Opengl,Opengl Es,Glsl,Glsles,我正在使用OpenGL/ES为桌面/移动(android/iOS)平台开发应用程序 我在顶点着色器代码中使用常量数组。我在我的nv8800GT上测试了它,有和没有常量数组,没有发现任何区别。但我读到,常量数组可能比制服慢得多 const float offset_s[4] = float[4](0.625, 0.625, 0.75, 0.85); 问题是-我应该避免使用常量数组而使用统一数组吗?还是现在一切都好了?驱动程序已修复,等等…我在GLSL中遇到了常量和非常量数组的奇怪行为。 将常量数

我正在使用OpenGL/ES为桌面/移动(android/iOS)平台开发应用程序
我在顶点着色器代码中使用常量数组。我在我的nv8800GT上测试了它,有和没有常量数组,没有发现任何区别。但我读到,常量数组可能比制服慢得多

const float offset_s[4] = float[4](0.625, 0.625, 0.75, 0.85);

问题是-我应该避免使用常量数组而使用统一数组吗?还是现在一切都好了?驱动程序已修复,等等…

我在GLSL中遇到了常量和非常量数组的奇怪行为。 将常量数组更改为非常量数组在某些着色器中提供了一个小的加速。另一方面,删除其他着色器中的“const”关键字会导致性能大幅下降(渲染过程从~2ms下降到~20ms)。这种行为似乎非常不协调,我猜这是一个驱动程序错误。

我的GPU是Nvidia GTX 460,我使用的是驱动程序版本358.50(与较老的驱动程序观察到的行为类似)。

常量数组通常与制服相同。它们占用相同的存储限制,在一些较新的驱动程序(例如NVIDIA)中,如果您在编译包含常量数组的着色器后查询制服列表,您将看到该着色器为它们生成一个特殊命名的制服数组。例如:
const vec4 pos[4]=vec4[](…)
将成为一个名为
vec4\u main\u pos\u 0的统一[0]
,大小为4。因为它用于函数:
main(…)
。这意味着-我应该在使用GL\u MAX\u VERTEX\u UNIFORM\u VECTORS时计算它们?我的意思是-如果我已经浪费了所有的统一空间-那么我就不能添加一个常量float了?在官方规范中,它并没有以这种方式进行充实,但我使用过的实现结果就是这样。NV的驱动程序使行为变得更加复杂通过在全局范围内为
const
限定变量实际生成一个自动
uniform
变量来确保一致性。可能最好使用uniforms而不是全局const数组,以确保所有实现的行为一致。此外,您提到的限制仅适用于顶点着色器阶段-您在任何阶段都可以做这类事情。每一个阶段都有自己不同的限制。我只有两个阶段:)顶点和碎片。好吧,谢谢,我会记住这一点。