簡體   English   中英

OpenGLES 3.0:“全局初始化器中只能使用常量”

[英]OpenGLES 3.0: “Only consts can be used in a global initializer ”

我是本書 <OpenGL ES 3.0 cookbook> 第 2 章的新手,但在安裝演示 APP 時遇到此錯誤:

2020-12-06 16:16:10.888 7549-7578/com.demo.hellosquare E/glOpenGLES3Native: Could not compile shader 35633:
ERROR: 0:6: 'RadianAngle' : Only consts can be used in a global initializer 
ERROR: 0:6: 'RadianAngle' : Only consts can be used in a global initializer 
ERROR: 0:6: 'RadianAngle' : Only consts can be used in a global initializer 
ERROR: 0:6: 'RadianAngle' : Only consts can be used in a global initializer 
ERROR: 4 compilation errors.  No code generated.

問題是,我不明白該消息試圖告訴我什么(谷歌沒有相關結果)。

代碼中涉及“RadianAngle”的地方如下:

在我的單個 CPP 文件的頂部,我聲明:

GLuint radianAngle;

然后我的着色器也在同一個文件的頂部:

static const char vertexShader[] =
    "#version 300 es                                          \n"
    "in vec4        VertexPosition;                           \n"
    "in vec4        VertexColor;                              \n"
    "uniform float  RadianAngle;                              \n"

    "out vec4       TriangleColor;                            \n"
    "mat2 rotation = mat2(cos(RadianAngle),sin(RadianAngle),  \
                 -sin(RadianAngle),cos(RadianAngle)); \n"
    "void main() {                                            \n"
    "  gl_Position   = mat4(rotation)*VertexPosition;         \n"
    "  TriangleColor = VertexColor;                           \n"
    "}\n";

最后在我的渲染函數中(將通過 JNI 調用)在同一個文件中:

radianAngle          = glGetUniformLocation(programID, "RadianAngle");
glUniform1f(radianAngle, radian);

奇怪的是,我完全從書中復制,嘆息..

該問題與該行有關:

mat2 rotation = mat2(cos(RadianAngle),sin(RadianAngle),
                     -sin(RadianAngle),cos(RadianAngle));

rotation是全局 scope 中的一個變量。 全局變量只能用常量表達式初始化。 RadianAngle不是常數,因為它是一個統一變量。 這會導致錯誤:

錯誤:0:6:“RadianAngle”:全局初始化程序中只能使用常量

錯誤發生 4 次,因為RadianAnglerotation的初始化程序中使用了 4 次。

您必須在main中設置rotation值:

mat2 rotation;

void main()
{
    rotation = mat2(cos(RadianAngle),sin(RadianAngle),
                    -sin(RadianAngle),cos(RadianAngle));

    // [...]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM