更新时间:2022-10-27 09:21:29
错误编号'1282`不是很描述。
glGetUniformLocation
的可能的错误代码是:
GL_INVALID_VALUE
GL_INVALID_OPERATION
其中没有固定值。尝试使用 gluErrorString()
获取错误字符串,或者查看 1282
地图的标题。
只是在黑暗中拍摄:
检查您的着色器是否已正确链接?
/ ul>BTW:返回类型是GLint不是GLuint
着色器编译和链接没有错误 。
根据规范(请参阅: http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml ) GL_INVALID_OPERATION
只应在以下情况下生成:
程式不是程式目标
其他问题:
您确定程序
对象所属类的 getHandle()
方法返回权利ID。我的意思是在成功链接中使用的那个。
你应该能够检查 glIsProgram(program-getHandle
返回 GL_TRUE
strong> EDIT: Ah - 我错过了在您的示例中对 glUniform4fv
的调用。
类型 glGetUniformLocation
仍然 GLint
,但我不认为这是问题。
根据规范(请参阅: http://www.opengl。 org / sdk / docs / man / xhtml / glUniform.xml ) GLUniformXX
产生 GL_INVALID_OPERATION
束原因。对我来说,可能似乎适用的唯一一个是:
没有当前的程序对象
在尝试调用 glUniform()之前调用
glUseProgram(program-> getHandle())
code>?
I am trying to add lighting to my current scene of a simple cube. After setting up my uniforms I get a 1282 error from glGetError() for this piece of code
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 );
Here are my shaders: 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;
}
The products and position are each a struct of three GLfloats and shininess is a float. I have checked all of the values of the handles and the values I am passing and they all seem valid. Ideas?
--EDIT: I have narrowed it to the glUniform4fv calls. It happens after each one. Also I have double checked that the program->getHandle() is pointing to something that looks valid.
I have checked program->getHandle is a valid program Here are the values of all handles: Program handle 3 ambientHandle 0 diffuseHandle 1 specularHandle 5 lightPosHandle 2 shinyHandle 4
So they all look good. For testing I am commenting out the lines below the ones for ambientProduct. For clarity I am explicitly using this line instead
glUniform4f( ambientHandle, ambientProd.x, ambientProd.y, ambientProd.z, ambientProd.w );
These are the values for ambientProd at the time that line is executed. x = 0.200000003, y = 0.0, z = 0.200000003, w = 1.0
A collaborator on this project moved the call for glUseProgram. Thanks for the help folks.
Error number ´1282` is not very descriptive.
Possible error codes for glGetUniformLocation
are:
GL_INVALID_VALUE
GL_INVALID_OPERATION
Which don't have a fixed value. Try to get the error string with gluErrorString()
or take a look in the header to which of those 1282
maps.
Just a shot in the dark: but did you ...
check your shader got compiled without error?
check your shader got linked without error?
BTW: return type is GLint not GLuint
"Shaders compiled and linked without error" Hmm, this looks odd.
According to spec (see: http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml) GL_INVALID_OPERATION
should only be generated if:
program is not a program objec
program has not been successfully linked
Other question:
are you sure the getHandle()
method of the class your program
Object belongs to returns the right id. I mean the one that was used in the sucessfully linking.
you should be able to verify with checking if glIsProgram(program-getHandle())
returns GL_TRUE
EDIT: Ah - I missed those calls to glUniform4fv
in your example.
Correct return type for glGetUniformLocation
is still GLint
, but I don't think thats the problem.
According to spec (see: http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml) GLUniformXX
generates GL_INVALID_OPERATION
for a whole bunch of reasons. To me the only one that possibly seems to apply is:
there is no current program object
Did you call glUseProgram (program->getHandle())
prior to trying to calling glUniform()
?