OpenGL着色器错误1282

OpenGL着色器错误1282

问题描述

我正在尝试将照明添加到我当前的简单立方体场景中.设置我的制服后,我从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 120attribute vec4 coord3d;attribute vec3 normal3d;// output values that will be interpretated per-fragmentvarying 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 shadervarying 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的结构,而光泽是浮点.我已经检查了所有手柄的值和所传递的值,它们似乎都有效.想法?

– 编辑:我已将其缩小到Gluuniform4FV调用.它发生在每个之后.另外,我仔细检查了程序 – > gethandle()指向看起来有效的东西.

我已经检查了程序 – > Gethandle是一个有效的程序这是所有手柄的值:程序处理3AmbientHandle 0漫步者1SpecularHandle 5LightPoshandle 2ShinyHandle 4

所以它们看起来都不错.为了进行测试,我正在评论下面的线路生产线.为了清楚起见,我明确使用此行

glUniform4f( ambientHandle, ambientProd.x, ambientProd.y, ambientProd.z, ambientProd.w );

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

该项目的合作者移动了GluSeprogragry的呼吁.感谢您的帮助.

推荐答案

错误编号´1282`不是很好的描述性.

glGetUniformLocation可能的错误代码为:

GL_INVALID_VALUEGL_INVALID_OPERATION

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

只是黑暗中的镜头:但是你…

检查着您的着色器没有任何错误?

检查着您的着色器没有错误?

btw:返回类型是闪光而不是gluint

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

根据规格(请参阅: http://www.opengl. org/sdk/docs/man/xhtml/glgetuniformlocation.xml )GL_INVALID_OPERATION才能生成:

程序不是程序objec

程序尚未成功链接

其他问题:

您确定类的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出于很多原因.对我来说,唯一可能适用的唯一一个是:

没有当前程序对象

您是否在尝试调用glUniform()?

之前致电glUseProgram (program->getHandle())其他推荐答案

通常,当您使用与OpenGL生成的程序ID在创建着色器时生成的程序ID时,此错误编号会发生.这意味着您在绑定vertexShader或fragmentShader或其他正在使用的其他着色器时使用了其他programID.

本文地址:https://www.itbaoku.cn/post/490260.html


比丘资源网 » OpenGL着色器错误1282

发表回复

提供最优质的资源集合

立即查看 了解详情