我正在尝试将光照添加到我当前的简单立方体场景中。在设置我的制服后,我从glGetError()获得了这段代码的1282错误
GLuint ambientHandle = glGetUniformLocation(program->getHandle(), "ambientProduct");
glUniform4fv( ambientHandle, 1, ambientProduct );
GLuint diffuseHandle = glGetUniformLocation(program->getHandle(), "diffuseProduct");
glUniform4fv( diffuseHandle, 1, diffuseProduct );
GLuint specularHandle = glGetUniformLocation(program->getHandle(), "specularProduct");
glUniform4fv( specularHandle, 1, specularProduct );
GLuint lightPosHandle = glGetUniformLocation(program->getHandle(), "lightPosition");
glUniform4fv( lightPosHandle, 1, light.position );
GLuint shinyHandle = glGetUniformLocation(program->getHandle(), "shininess");
glUniform1f( shinyHandle, materialShininess );
以下是我的着色器: vertex.glsl
#version 120
attribute vec4 coord3d;
attribute vec3 normal3d;
// output values that will be interpretated per-fragment
varying vec3 fN;
varying vec3 fE;
varying vec3 fL;
uniform vec4 lightPosition;
uniform mat4 mTransform;
void main()
{
fN = normal3d;
fE = coord3d.xyz;
fL = lightPosition.xyz;
if( lightPosition.w != 0.0 ) {
fL = lightPosition.xyz - coord3d.xyz;
}
gl_Position = mTransform*coord3d;
}
fragment.glsl
// per-fragment interpolated values from the vertex shader
varying vec3 fN;
varying vec3 fL;
varying vec3 fE;
uniform vec4 ambientProduct, diffuseProduct, specularProduct;
uniform mat4 mTransform;
uniform vec4 lightPosition;
uniform float shininess;
void main()
{
// Normalize the input lighting vectors
vec3 N = normalize(fN);
vec3 E = normalize(fE);
vec3 L = normalize(fL);
vec3 H = normalize( L + E );
vec4 ambient = ambientProduct;
float Kd = max(dot(L, N), 0.0);
vec4 diffuse = Kd*diffuseProduct;
float Ks = pow(max(dot(N, H), 0.0), shininess);
vec4 specular = Ks*specularProduct;
// discard the specular highlight if the light's behind the vertex
if( dot(L, N) < 0.0 ) {
specular = vec4(0.0, 0.0, 0.0, 1.0);
}
gl_FragColor = ambient + diffuse + specular;
gl_FragColor.a = 1.0;
}
产品和位置都是三个GLfloats的结构,光泽是一个浮子。我检查了句柄的所有值和我传递的值,它们似乎都有效。想法?
- 编辑: 我把它缩小到glUniform4fv调用。它发生在每一个之后。另外,我已经仔细检查过program-&gt; getHandle()是否指向看起来有效的东西。
我检查了程序 - > getHandle是一个有效的程序 以下是所有句柄的值: 程序句柄3 ambientHandle 0 diffuseHandle 1 specularHandle 5 lightPosHandle 2 shinyHandle 4
所以他们都很好看。为了测试我正在评论ambientProduct的下面的行。为清楚起见,我明确使用此行代替
glUniform4f( ambientHandle, ambientProd.x, ambientProd.y, ambientProd.z, ambientProd.w );
这些是执行该行时ambientProd的值。 x = 0.200000003,y = 0.0,z = 0.200000003,w = 1.0
该项目的合作者移动了glUseProgram的调用。谢谢你的帮助。
答案 0 :(得分:14)
错误编号'1282`不是很具描述性。
glGetUniformLocation
的可能错误代码为:
GL_INVALID_VALUE
GL_INVALID_OPERATION
哪个没有固定值。尝试使用gluErrorString()
获取错误字符串,或查看其中1282
映射的标题。
在黑暗中只是一枪:但是你......
检查您的着色器是否编译没有错误?
检查您的着色器是否已无误链接?
BTW:返回类型是GLint而不是GLuint
“着色器编译和链接没有错误”嗯,这看起来很奇怪。
根据规范(参见:http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml){} {}仅应在以下情况下生成:
程序不是程序目标
程序尚未成功链接
其他问题:
您确定GL_INVALID_OPERATION
对象所属的类的getHandle()
方法返回正确的ID。我指的是成功连接中使用的那个。
您应该能够核实program
是否返回glIsProgram(program-getHandle())
编辑:啊 - 我在你的例子中错过了对GL_TRUE
的电话。
glUniform4fv
的正确返回类型仍为glGetUniformLocation
,但我不认为这是问题所在。
根据规范(请参阅:http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml)GLint
生成GLUniformXX
有很多原因。对我来说,唯一可能适用的是:
没有当前的程序对象
在尝试拨打GL_INVALID_OPERATION
之前,您是否致电glUseProgram (program->getHandle())
了?
答案 1 :(得分:0)
通常,当您使用与创建着色器时openGL生成的programID不同的programID时,会出现此错误号。这意味着在绑定vertexShader
或fragmentShader
或其他正在使用的着色器时,您正在使用其他programID。