如何将这些OpenGL着色器转换为适用于Android NDK的GLES3的OpenGL ES着色器?

时间:2019-03-02 12:57:19

标签: c++ android-ndk shader glsles opengl-es-3.0

当我尝试以下着色器失败时,返回-1。

col_attr = glGetAttribLocation(prog, "v_col");

我尝试了不同的设置,包括 切换,

gl_FragColor

outColor

#version 300 es

#version 150 core

还有更多,在我意识到自己完全迷失之前,还有很多我不知道的变量。我只需要将这些简单的着色器转换为适用于C ++的Android NDK的GLESv3即可。非常感谢所有帮助。谢谢。

原始顶点着色器

#version 150 core
in vec3 v_pos;
in vec4 v_col;
out vec4 color;
uniform mat4 projection;
uniform mat4 view;
void main(){
        color = v_col;                    
        gl_Position = projection * view * vec4(v_pos, 1.0);
}

原始片段着色器

#version 150 core
in vec4 color;
void main(){
            gl_FragColor = color;
}

更新:发现只有片段着色器在编译时失败。

新顶点着色器-编译!

return "#version 300 es                 \n"
       "in vec3 v_pos;                 \n"
       "in vec4 v_col;                 \n"
       "out vec4 color;                \n"
       "uniform mat4 projection;        \n"
       "uniform mat4 view;            \n"
       "void main()                    \n"
       "{                              \n"
       "   color = v_col;                \n"
       "   gl_Position = projection * view * vec4(v_pos, 1.0);   \n"
       "}                              \n";

新片段着色器-无法编译!

return "#version 300 es                 \n"
       "in vec4 color;                  \n"
       "out vec4 outColor;              \n"
       "void main()                     \n"
       "{                               \n"
       "   outColor = color;            \n"
       "}                               \n";

新片段着色器-编译!

return "#version 300 es                 \n"
        "precision mediump float;       \n"
       "in vec4 color;                  \n"
       "out vec4 outColor;              \n"
       "void main()                     \n"
       "{                               \n"
       "   outColor = color;            \n"
       "}                               \n";

1 个答案:

答案 0 :(得分:2)

您必须声明fragment shader output变量out vec4 outColor
此外,您还必须添加一个precision qualifier

有效的GLSL ES 3.00片段着色器为:

#version 300 es

precision mediump float; 

in vec4 color;
out vec4 outColor;

void main(){
    outColor = color;
}

版本信息(#version 300 es)也必须在顶点着色器中更改。

请参见OpenGL ES Shading Language 3.00 Specification - 4.3.6 Output Variables第42页:

  

片段输出声明如下例:

out vec4 FragmentColor;
out uint Luminosity;

请参见OpenGL ES Shading Language 3.00 Specification - 4.5.4 Default Precision Qualifiers第56页:

  

对于浮点类型,片段语言没有默认的精度限定符。因此,对于float,浮点向量和矩阵变量声明,声明必须包含精度限定符,或者必须事先声明默认的float精度。