OpenGL着色器错误1282

ojsjcaue  于 2023-08-04  发布在  其他
关注(0)|答案(3)|浏览(487)

我正试图添加照明到我的一个简单的立方体的当前场景。在设置完制服之后,我从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;
}


products和position都是一个由三个GLfloat组成的结构,而shininess是一个float。我已经检查了句柄的所有值和我传递的值,它们似乎都是有效的。有什么想法?
--编辑:我已经将其缩小到glUniform 4fv调用。它发生在每一个之后。我还仔细检查了程序->getHandle()是否指向看起来有效的东西。
我已经检查了program->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的调用。谢谢大家的帮助。

0pizxfdo

0pizxfdo1#

错误号“1282”不是很有描述性。
glGetUniformLocation的可能错误代码为:

GL_INVALID_VALUE
GL_INVALID_OPERATION

字符串
它没有固定值。尝试使用gluErrorString()获取错误字符串,或者查看头文件中哪些1282Map到了这些错误字符串。
只是在黑暗中射击:但你...

  • 检查你的着色器得到编译没有错误?
  • 检查你的着色器得到链接没有错误?

顺便说一句:返回类型是GLint而不是GLuint
“着色器编译和链接没有错误”嗯,这看起来很奇怪。
根据规范(参见:http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xmlGL_INVALID_OPERATION应仅在以下情况下生成:

  • 程序不是程序对象
  • 程序尚未成功链接

其他问题:

  • 你确定你的program对象所属的类的getHandle()方法返回正确的id。我是说成功连接的那个。

你应该能够通过检查glIsProgram(program-getHandle())是否返回GL_TRUE来验证

**编辑:**啊-我错过了你的例子中对glUniform4fv的调用。

glGetUniformLocation的正确返回类型仍然是GLint,但我不认为这是问题所在。
根据规范(参见:http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xmlGLUniformXX生成GL_INVALID_OPERATION有很多原因。对我来说,唯一可能适用的是:

  • 没有当前程序对象

在尝试呼叫glUniform()之前,您是否已呼叫glUseProgram (program->getHandle())

wa7juj8i

wa7juj8i2#

我在从GL3.3到GLES的过程中遇到了类似的问题,对于glTexImage2D调用,输出格式必须与内部格式相同。
所以我不得不改变:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);的值。
我记得在什么地方阅读过,但完全忘记了,所以我就把这个留在这里,以防万一它能帮助到别人。

r1wp621o

r1wp621o3#

通常,当您使用的programID与创建着色器时由openGL生成的programID不同时,会出现此错误号。这意味着您在绑定vertexShaderfragmentShader或您正在使用的任何其他着色器时使用的是不同的programID。

相关问题