web-dev-qa-db-fra.com

Erreur 1282 d'OpenGL Shader

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.

13
user2227713

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()?

14
mikyra

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.

0
suraj kumar