Ale*_*llo 3 android opengl-es glsl opengl-es-2.0
我正在尝试在我的OpenGL ES 2.0引擎中实现在线教程(lighthouse3d.com)中的一些着色器.
问题是由于某种原因,在main()范围内声明的任何变量都会导致整个着色器失败.例如,这失败了:
void main(){
vec4 color;
gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
但这很完美:
void main(){
//vec4 color;
gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
我的顶点着色器也会发生同样的事情.(编辑:nvm,似乎只发生片段着色器)使用任何类型的非常量值的唯一方法是使用属性,变化,制服等,例如,这可以作为你会期望:
uniform sampler2D texture;
varying lowp vec4 fragcol;
varying lowp vec2 texco;
void main(){
gl_FragColor = fragcol * texture2D(texture, texco);
}
Run Code Online (Sandbox Code Playgroud)
此外,我在寻找有关GLSL ES(或任何此版本调用)的文档或资源时遇到了很多麻烦.我能找到的就是:http://old.siggraph.org/publications/2006cn/course16/KhronosSpecs/ESLanguageSpec1.10.11.pdf
这是我能找到的与变量声明相关的全部内容:
[snip]没有默认类型.所有变量和函数声明都必须具有声明的类型和可选的限定符.通过指定其类型后跟一个或多个用逗号分隔的名称来声明变量.[snip]
而这正是我所做的:
声明类型:vec4
后跟一个或多个名字:颜色 ;
vec4 color
Run Code Online (Sandbox Code Playgroud)
我很无能为力
编辑: GLES20.glGetError()给出错误1282
GLSL ES与传统GLSL的不同之处在于它需要精确修饰符才能指定完整类型.你有没有尝试过,例如:
void main(){
lowp vec4 color;
gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
你也可以把这样的东西放到源文件的顶部:
precision highp float;
Run Code Online (Sandbox Code Playgroud)
要设置默认精度,以便稍后省略.
要获得有关编译GLSL的错误的详细信息,您可以使用glGetProgramInfoLog(在帮助下glGetProgramiv).大多数GL实现返回有意义的错误和行号.我很遗憾地使用Java,但在C语言中你可能会:
glCompileShader(shader);
// check whether compilation was successful; if not
// then dump the log to the console
GLint status;
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
if(!status)
{
GLint logLength;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
if (logLength > 0)
{
GLchar *log = (GLchar *)malloc(logLength);
glGetShaderInfoLog(shader, logLength, &logLength, log);
printf("Shader compile log:\n%s", log);
free(log);
}
}
Run Code Online (Sandbox Code Playgroud)