OpenGL着色器错误1282

use*_*713 13 c++ opengl

我正在尝试将光照添加到我当前的简单立方体场景中.在设置我的制服之后,我从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 );
Run Code Online (Sandbox Code Playgroud)

这是我的着色器: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;
}
Run Code Online (Sandbox Code Playgroud)

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;
} 
Run Code Online (Sandbox Code Playgroud)

产品和位置都是三个GLfloats的结构,光泽是浮动.我检查了句柄的所有值和我传递的值,它们似乎都有效.想法?

--EDIT:我把它缩小到glUniform4fv调用.它发生在每一个之后.我还仔细检查过program-> 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 );
Run Code Online (Sandbox Code Playgroud)

这些是执行该行时ambientProd的值.x = 0.200000003,y = 0.0,z = 0.200000003,w = 1.0

该项目的合作者移动了glUseProgram的调用.谢谢你们的帮助.

mik*_*yra 14

错误号'1282`不是很具描述性.

可能的错误代码glGetUniformLocation是:

GL_INVALID_VALUE
GL_INVALID_OPERATION
Run Code Online (Sandbox Code Playgroud)

哪个没有固定值.尝试获取错误字符串gluErrorString()或查看这些1282映射的标题.

只是在黑暗中拍摄:但是你......

  • 检查你的着色器编译没有错误?

  • 检查您的着色器是否链接没有错误?

BTW:返回类型是GLint而不是GLuint

"着色器编译和链接没有错误"嗯,这看起来很奇怪.

根据规范(参见:http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml)GL_INVALID_OPERATION只应在以下情况下生成:

  • 程序不是程序目标

  • 程序尚未成功链接

其他问题:

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

    你应该能够验证是否glIsProgram(program-getHandle())返回GL_TRUE

编辑:啊 - 我glUniform4fv在你的例子中错过了那些电话.

正确的返回类型glGetUniformLocation仍然是GLint,但我不认为这是问题.

根据规范(参见:http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml)GLUniformXX生成GL_INVALID_OPERATION了一大堆原因.对我来说,唯一可能适用的是:

  • 没有当前的程序对象

    你打电话glUseProgram (program->getHandle())之前打过电话了glUniform()吗?

  • 在你的例子中,我错过了对`glUniform()`的调用 - 规范中列出了一大堆原因.恕我直言,该计划不是活跃的,似乎唯一可能适用的程序. (5认同)
  • 哇,我真的忘了打电话给glUseProgram.TNX. (4认同)