当我尝试时,以下着色器失败并返回-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";
你要声明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
,浮点向量和矩阵变量声明,声明必须包含精度限定符,或者必须先前声明默认的浮点精度。