2013-03-30 13 views
7

Ich versuche, Beleuchtung meiner aktuellen Szene eines einfachen Würfels hinzuzufügen. Nach dem Einrichten meiner Uniformen ich einen 1282-Fehler von glGetError get() für dieses Stück CodeOpenGL Shader Fehler 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); 

Hier sind meine Shadern: 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; 
} 

Die Produkte und Position sind jeweils eine Struktur von drei GLfloats und Glanz ist ein Schwimmer. Ich habe alle Werte der Griffe überprüft und die Werte, die ich übergebe, scheinen alle gültig zu sein. Ideen?

--EDIT: Ich habe es auf die glUniform4fv Anrufe eingegrenzt. Es passiert nach jedem. Ich habe auch überprüft, dass das Programm-> getHandle() auf etwas zeigt, das gültig aussieht.

Ich habe überprüft Programm-> getHandle ist ein gültiges Programm Hier werden die Werte aller Griffe sind: Programm Griff 3 ambientHandle 0 diffuseHandle 1 specularHandle 5 lightPosHandle 2 shinyHandle 4

So sie alle gut aussehen. Zum Testen kommentieren wir die Zeilen unterhalb von denen für ambientProduct. Aus Gründen der Übersichtlichkeit verwende ich explizit diese Zeile.

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

Dies sind die Werte für ambientProd zum Zeitpunkt der Ausführung dieser Zeile. x = 0.200000003, y = 0.0, z = 0.200000003, w = 1.0

Ein Mitarbeiter dieses Projekts hat den Aufruf von glUseProgram verschoben. Danke für die Hilfe Leute.

+0

Wo ist die '# version' Direktive für Ihren Fragment Shader? – genpfault

+0

ausgelassen versehentlich – user2227713

Antwort

10

Fehlernummer '1282` ist nicht sehr beschreibend.

Mögliche Fehlercodes für glGetUniformLocation sind:

GL_INVALID_VALUE 
GL_INVALID_OPERATION 

, die nicht über einen festen Wert. Versuchen Sie, die Fehlerzeichenfolge mit gluErrorString() zu erhalten, oder werfen Sie einen Blick in die Kopfzeile, auf welche dieser Karten.

Nur ein Schuss im Dunkeln: aber hast du ...

  • Ihre Shader überprüfen konnte ohne Fehler kompiliert?

  • Überprüfen Sie, ob Ihr Shader ohne Fehler verknüpft wurde?

BTW: Rückgabetyp ist GLint nicht

"Shaders kompiliert und verknüpft, ohne Fehler" Hmm GLuint, diese ungerade aussieht.

Laut Spezifikation (siehe: http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml) GL_INVALID_OPERATION nur dann erzeugt werden, wenn:

  • Programm kein objec Programm ist

  • Programm nicht erfolgreich verbunden worden

Andere Frage:

  • Sind Sie sicher, dass die getHandle() Methode der Klasse Ihr program Objekt gehört, gibt die richtige ID zurück. Ich meine diejenige, die bei der erfolgreichen Verknüpfung verwendet wurde.

    sollten Sie in der Lage sein, mit der Überprüfung zu überprüfen, ob glIsProgram(program-getHandle()) kehrt GL_TRUE

EDIT: Ah - ich diese Anrufe zu glUniform4fv in Ihrem Beispiel verpasst.

Korrekter Rückgabetyp für glGetUniformLocation ist immer noch GLint, aber ich denke nicht, dass das das Problem ist.

Nach Spezifikation (siehe: http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml) GLUniformXX generiert GL_INVALID_OPERATION für eine ganze Reihe von Gründen. Für mich ist das einzige, das scheint möglicherweise gelten soll:

  • gibt es kein aktuelles Programmobjekt

    Haben Sie glUseProgram (program->getHandle()) vor dem Versuch, rufen glUniform() zu nennen?

+0

Shaders kompiliert und ohne Fehler verknüpft und es ist der GL_INVALID_OPERATION Fehler – user2227713

+4

Ich verpasste den Aufruf an 'glUniform()' in Ihrem Beispiel - es gibt eine Fülle von Gründen in der Spezifikation aufgeführt. Meiner Meinung nach ist das Programm, das nicht das aktive Programm ist, das einzig mögliche. – mikyra

+3

Wow, ich habe wirklich vergessen, glUseProgram aufzurufen. Tnx. – anhoppe