J'essaie d'ajouter de l'éclairage à ma scène actuelle d'un simple cube. Après avoir configuré mes uniformes, j'obtiens une erreur 1282 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 la brillance est un flotteur. J'ai vérifié toutes les valeurs des poignées et les valeurs que je passe et elles semblent toutes valides. Des idées?
--EDIT: Je l'ai réduit aux appels glUniform4fv. Cela arrive après chacun. J'ai également vérifié que le programme-> getHandle () pointe vers quelque chose qui semble valide.
J'ai vérifié program-> getHandle est un programme valide Voici les valeurs de toutes les poignées: Program handle 3 ambientHandle 0 diffuseHandle 1 specularHandle 5 lightPosHandle 2 shinyHandle 4
Ils ont donc tous l'air bien. Pour les tests, je commente les lignes ci-dessous celles pour ambientProduct. Pour plus de clarté, j'utilise explicitement cette ligne à la place
glUniform4f( ambientHandle, ambientProd.x, ambientProd.y, ambientProd.z, ambientProd.w );
Ce sont les valeurs de ambientProd au moment où cette ligne est exécutée. x = 0,200000003, y = 0,0, z = 0,200000003, w = 1,0
Un collaborateur de ce projet a lancé l'appel à glUseProgram. Merci pour votre aide.
Le numéro d'erreur "1282" n'est pas très descriptif.
Les codes d'erreur possibles pour glGetUniformLocation
sont:
GL_INVALID_VALUE
GL_INVALID_OPERATION
Qui n'ont pas de valeur fixe. Essayez d'obtenir la chaîne d'erreur avec gluErrorString()
ou regardez dans l'en-tête à laquelle de ces 1282
Correspond.
Juste un coup dans le noir: mais avez-vous ...
vérifier que votre shader a été compilé sans erreur?
vérifier que votre shader a été lié sans erreur?
BTW: le type de retour est GLint pas GLuint
"Shaders compilés et liés sans erreur" Hmm, cela semble étrange.
Selon les spécifications (voir: http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml ) GL_INVALID_OPERATION
Ne doit être généré que si:
le programme n'est pas un objec de programme
le programme n'a pas été lié avec succès
Autre question:
êtes-vous sûr que la méthode getHandle()
de la classe à laquelle votre objet program
appartient renvoie l'id correct. Je veux dire celui qui a été utilisé dans la liaison réussie.
vous devriez pouvoir vérifier en vérifiant si glIsProgram(program-getHandle())
renvoie GL_TRUE
EDIT: Ah - J'ai raté ces appels à glUniform4fv
Dans votre exemple.
Le type de retour correct pour glGetUniformLocation
est toujours GLint
, mais je ne pense pas que ce soit le problème.
Selon les spécifications (voir: http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml ) GLUniformXX
génère GL_INVALID_OPERATION
Pour un tas de raisons. Pour moi, le seul qui semble s'appliquer est:
il n'y a pas d'objet programme en cours
Avez-vous appelé glUseProgram (program->getHandle())
avant d'essayer d'appeler glUniform()
?
Généralement, ce numéro d'erreur se produit lorsque vous utilisez un ID de programme différent de l'ID de programme généré par openGL au moment de la création du shader. Cela signifie que vous utilisez un ID de programme différent au moment de la liaison vertexShader
ou fragmentShader
ou tout autre shader que vous utilisez.