当我尝试以下着色器失败时,返回-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";
答案 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精度。