我想在PC上运行几个例子。问题是他们用glsl target 150编写,而我的PC只支持120版本。我非常确定程序本身很简单,不需要OpenGL 3.1的任何扩展功能。我已经找到了一些信息,说明应该采取哪些步骤来转换glsl(fe转换为属性,转换为不同的)但它仍然没有编译(实际上是否有可能以某种方式从中获得有意义的错误消息? )。
原始.vert
#version 150
in vec2 in_Position;
in vec3 in_Color;
out vec3 ex_Color;
void main(void) {
gl_Position = vec4(in_Position.x, in_Position.y, 0.0, 1.0);
ex_Color = in_Color;
}
原始.frag
#version 150
precision highp float;
in vec3 ex_Color;
out vec4 gl_FragColor;
void main(void) {
gl_FragColor = vec4(ex_Color,1.0);
}
已更改.vert
#version 120
attribute vec2 in_Position;
attribute vec3 in_Color;
varying vec3 ex_Color;
void main(void) {
gl_Position = vec4(in_Position.x, in_Position.y, 0.0, 1.0);
ex_Color = in_Color;
}
更改.frag
#version 120
precision highp float;
attribute vec3 ex_Color;
void main(void) {
gl_FragColor = vec4(ex_Color,1.0);
}
所有人都可以在这里发现问题吗?
答案 0 :(得分:4)
要获取编译/链接错误消息,您需要对着色器使用glGetShaderInfoLog
命令,对程序使用glGetProgramInfoLog
。
这些将告诉您特定错误是什么。
只是对错误可能是什么,你在片段着色器中声明了attribute
输入,我认为它应该是varying
。属性用于数据 - >顶点着色器,而变化用于顶点着色器 - >片段着色器。
glsl 120规范还提到精度限定符是“保留供将来使用”,因此它可能不适用于版本120.您可以将其删除。
但你仍然应该熟悉infolog功能,无论如何,你最终肯定会需要它们。
答案 1 :(得分:3)
您可以通过检索“信息日志”来获取编译错误:
GLuint nVertexShader, nPixelShader; // handles to objects
GLint vertCompiled, fragCompiled; // status values
GLint linked;
glCompileShader(nVertexShader);
glGetShaderiv(nVertexShader, GL_COMPILE_STATUS, &vertCompiled);
如果vertCompiled(或fragCompile)== 0,请执行此操作以查看原因:
int infologLength = 0;
int charsWritten = 0;
glGetShaderiv(nVertexShader, GL_INFO_LOG_LENGTH, &infologLength);
if (infologLength > 0)
{
GLchar* infoLog = (GLchar *)malloc(infologLength);
if (infoLog == NULL)
{
printf( "ERROR: Could not allocate InfoLog buffer");
exit(1);
}
glGetShaderInfoLog(nVertexShader, infologLength, &charsWritten, infoLog);
printf( "Shader InfoLog:\n%s", infoLog );
free(infoLog);
}
您可以对链接执行相同操作,只需检查链接== 0并按上述方式检索日志:
glLinkProgram(m_nProgram);
glGetProgramiv(m_nProgram, GL_LINK_STATUS, &linked);
答案 2 :(得分:1)
precision highp float;
这在GLSL 1.20中是不合法的。我甚至不知道为什么它放在1.50着色器中,因为精度限定符只在GLSL ES 中做有用的事情,你不能共享1.50着色器与GLSL ES。