如何在GLSL(OpenGL ES 2.0)中定义常量数组?

Ger*_*eri 13 iphone opengl-es glsl fragment-shader

我只想存储每个片段计算所需的权重数组.

这个:

float weights[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1);
Run Code Online (Sandbox Code Playgroud)

只是抛出这个:

ERROR: 0:30: ']' : syntax error syntax error
ERROR: 0:30: ';' : syntax error syntax error
Run Code Online (Sandbox Code Playgroud)

Ste*_*nke 21

OpenGL ES SL 1.0规范,段落4.1.9 Arrays(第24页):

没有在声明时从着色器中初始化数组的机制.

请注意,这是故意遗漏的.根据这篇文章,OpenGL ES 2的OpenGL ES SL版本基于OpenGL SL 1.2.同一段(第20页)包含:

数组可以具有由数组构造函数构成的初始值设定项:

      float a[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1);
      float a[5] = float[](3.4, 4.2, 5.0, 5.2, 1.1);  // same thing
Run Code Online (Sandbox Code Playgroud)


小智 5

precision highp float;

const float a[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1);
Run Code Online (Sandbox Code Playgroud)

它适用于 Android KitKat 版本 (OpenGL ES 2.0)。

  • 您的设备中有什么 GPU?这看起来像是一个着色器编译器错误,因为 ES 2.0 规范明确指出:“没有在声明时从着色器内部初始化数组的机制。” 一些编译器在允许 ES 2.0 着色器中的 ES 3.0 功能方面相当自由,而不会报告错误。问题是相同的代码会在配备来自不同供应商的 GPU 的设备上失败。 (4认同)