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

问题描述 投票:1回答:1

当我尝试时,以下着色器失败并返回-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";
c++ android-ndk shader glsles opengl-es-3.0
1个回答
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,浮点向量和矩阵变量声明,声明必须包含精度限定符,或者必须先前声明默认的浮点精度。

© www.soinside.com 2019 - 2024. All rights reserved.