OpenGL Shader erreur 1282
Je suis en train d'ajouter de l'éclairage de ma scène d'un simple cube. Après la mise en place de mon uniforme, je reçois un 1282 erreur de glGetError() pour ce morceau de 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 );
Voici mes 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;
}
Les produits et la position sont chacun une structure de trois GLfloats et de brillance est un float. J'ai vérifié toutes les valeurs de plus, les poignées et les valeurs que je suis de passage et ils semblent tous valides. Des idées?
--EDIT:
J'ai rétréci à la glUniform4fv appels. Il arrive après chacun d'eux. J'ai également vérifié que le programme->getHandle() pointe vers quelque chose qui ressemble valide.
J'ai vérifié programme->getHandle est un programme valide
Voici les valeurs de toutes les poignées:
Programme de la poignée 3
ambientHandle 0
diffuseHandle 1
specularHandle 5
lightPosHandle 2
shinyHandle 4
Ainsi, ils ont tous l'air bien. Pour le test je suis en commentant les lignes ci-dessous ceux pour ambientProduct. Pour plus de clarté je suis explicitement à l'aide de cette ligne au lieu
glUniform4f( ambientHandle, ambientProd.x, ambientProd.y, ambientProd.z, ambientProd.w );
Ce sont ces valeurs pour ambientProd à l'époque que la ligne est exécutée.
x = 0.200000003, y = 0,0, z = 0.200000003, w = 1.0
Un collaborateur sur ce projet transféré l'appel pour glUseProgram. Merci pour l'aide les gars.
#version
directive pour votre fragment shader?omis accidentellement
OriginalL'auteur user2227713 | 2013-03-30
Vous devez vous connecter pour publier un commentaire.
Numéro d'erreur 1282 " n'est pas très descriptif.
Codes d'erreur possibles pour
glGetUniformLocation
sont:Qui n'ont pas une valeur fixe. Essayez d'obtenir de la chaîne d'erreur avec
gluErrorString()
ou de prendre un coup d'oeil dans l'en-tête auquel de ces1282
cartes.Juste un coup de feu dans l'obscurité: mais avez-vous ...
vérifier votre shader ai compilé sans erreur?
vérifier votre shader suis lié sans erreur?
BTW: le type de retour est GLint pas GLuint
"Shaders compilé et lié sans erreur" Hmm, ce qui semble étrange.
Selon spec (voir: http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml)
GL_INVALID_OPERATION
ne doit être généré si:programme n'est pas un programme objectifs
programme n'a pas été correctement lié
Autre question:
êtes-vous sûr que le
getHandle()
la méthode de la classe de votreprogram
Objet appartient retourne l'id de droite. Je veux dire celui qui a été utilisé dans le succès de la liaison.vous devriez être en mesure de vérifier de vérifier si
glIsProgram(program-getHandle())
retourneGL_TRUE
EDIT: Ah - j'ai raté ces appels à
glUniform4fv
dans votre exemple.Corriger le type de retour pour
glGetUniformLocation
est encoreGLint
, mais je ne pense pas que c'est le problème.Selon spec (voir: http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml)
GLUniformXX
génèreGL_INVALID_OPERATION
pour tout un tas de raisons. Pour moi le seul qui, éventuellement, semble à appliquer est:ce n'est pas un objet de programme
Avez-vous appeler
glUseProgram (program->getHandle())
avant de tenter d'appelglUniform()
?J'ai manqué l'appel à
glUniform()
dans votre exemple, il y a un wohle tas de raisons indiquées dans la spécification. À mon humble avis, le programme n'étant pas à l'actif d'un semblant la seule qui éventuellement s'applique.Wow, j'ai vraiment oublié d'appeler glUseProgram. Tnx.
OriginalL'auteur mikyra