首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL着色器错误1282

OpenGL着色器错误1282
EN

Stack Overflow用户
提问于 2013-03-31 03:48:47
回答 2查看 96.9K关注 0票数 18

我正在尝试添加照明到我当前的场景中一个简单的立方体。设置好制服后,这段代码的glGetError()出现了1282错误

代码语言:javascript
复制
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

代码语言:javascript
复制
#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

代码语言:javascript
复制
// 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组成的结构,而shininess是一个浮点。我检查了句柄的所有值和我传递的值,它们似乎都是有效的。想法?

--EDIT:我已经将范围缩小到glUniform4fv调用。它发生在每一次之后。此外,我还仔细检查了程序->getHandle()是否指向了看起来有效的内容。

我已经检查了program->getHandle是一个有效的程序,下面是所有句柄的值: program handle 3 ambientHandle 0 diffuseHandle 1 specularHandle 5 lightPosHandle 2 shinyHandle 4

所以他们看起来都很棒。为了测试,我注释掉了ambientProduct的下面几行代码。为了清楚起见,我显式地使用了这一行

代码语言:javascript
复制
glUniform4f( ambientHandle, ambientProd.x, ambientProd.y, ambientProd.z, ambientProd.w );

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

此项目的一个合作者移动了对glUseProgram的调用。感谢大家的帮助。

EN

回答 2

Stack Overflow用户

发布于 2013-03-31 04:03:10

错误号“1282`”的描述性不强。

glGetUniformLocation可能的错误代码为:

代码语言:javascript
复制
GL_INVALID_VALUE
GL_INVALID_OPERATION

没有固定的值。尝试使用gluErrorString()获取错误字符串,或者查看这些1282映射到的报头。

只是胡说八道:但是你……

  • 检查您的着色器是否编译无误?
  • 检查您的着色器是否链接无误?

顺便说一句:返回类型是GLint而不是GLuint

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

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

objec

  • program未成功链接
  • 程序不是程序

其他问题:

  • 你确定你的program对象所属的类的getHandle()方法返回正确的id吗?我的意思是在成功的链接中使用的那个。

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

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

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

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

  • 当前没有程序对象

在尝试调用glUniform()之前,您是否调用了glUseProgram (program->getHandle())

票数 23
EN

Stack Overflow用户

发布于 2019-03-25 18:30:17

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15722803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档