OpenGL-Shader-Fehler 1282
Ich versuche, fügen Sie Lichteffekte hinzu, um meine aktuellen Szene, in der ein einfacher Würfel. Nach der Einrichtung meiner Uniformen habe ich bekommen 1282 Fehler von glGetError() für dieses Stück 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 );
Hier sind meine Shader:
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;
}
Produkte und positionieren Sie jeweils eine Struktur, die von drei GLfloats und Glanz ist ein float. Ich habe alle Werte von den Griffen und die Werte, die ich bin übergeben und Sie scheinen alle gültig. Ideen?
--EDIT:
Ich habe verengt es die glUniform4fv Anrufe. Es passiert nach jeder. Auch ich habe überprüft, dass das Programm->getHandle() verweist auf etwas, das aussieht gültig.
Habe ich überprüft-Programm->getHandle ist ein gültiges Programm
Hier sind die Werte aller handles:
Programm Griff 3
ambientHandle 0
diffuseHandle 1
specularHandle 5
lightPosHandle 2
shinyHandle 4
So dass Sie alle gut Aussehen. Zum testen bin ich auskommentieren der Zeilen unterhalb der für ambientProduct. Für Klarheit bin ich ausdrücklich mit dieser Linie statt
glUniform4f( ambientHandle, ambientProd.x, ambientProd.y, ambientProd.z, ambientProd.w );
Diese sind die Werte für ambientProd an der Zeit, dass die Zeile ausgeführt wird.
x = 0.200000003, y = 0.0, z = 0.200000003, w = 1.0
Mitarbeiter an diesem Projekt verschoben, der Aufruf für glUseProgram. Danke für die Hilfe Leute.
- Wo ist der
#version
Richtlinie für Ihre fragment-shader? - versehentlich ausgefiltert
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fehler Nummer 1282 " ist nicht sehr aussagekräftig.
Möglichen Fehlercodes für
glGetUniformLocation
sind:Die nicht über einen festen Wert. Versuchen Sie, den Fehler-string mit
gluErrorString()
oder werfen Sie einen Blick in die header, welche dieser1282
Karten.Nur ein Schuss im Dunkeln: doch hast du ...
überprüfen Sie Ihre shader habe kompiliert, ohne Fehler?
überprüfen Sie Ihre shader bekam verbunden, ohne Fehler?
BTW: return-type Glitzern nicht GLuint
"Shader kompiliert und verbunden, ohne dass der Fehler" Hmm, das sieht seltsam aus.
Gemäß Spezifikation (siehe: http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml)
GL_INVALID_OPERATION
sollten nur erzeugt werden, wenn:Programm ist kein Programm erhalten
Programm wurde nicht erfolgreich verknüpft
Andere Frage:
sind Sie sicher, dass die
getHandle()
- Methode der Klasseprogram
Objekt gehört gibt die richtige id. Ich meine die, die verwendet wurde, in dem erfolgreich zu verknüpfen.sollten Sie in der Lage sein, zu überprüfen, zu überprüfen, ob
glIsProgram(program-getHandle())
zurückGL_TRUE
EDIT: Ah - ich vermißte diese Anrufe zu
glUniform4fv
in deinem Beispiel.Richtige Rückgabetyp für
glGetUniformLocation
nochGLint
, aber ich glaube nicht, dass das das problem ist.Gemäß Spezifikation (siehe: http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml)
GLUniformXX
generiertGL_INVALID_OPERATION
für eine ganze Reihe von Gründen. Für mich die einzige, die möglicherweise scheint zu gelten:gibt es keine aktuelle Programm-Objekt
Hast, Ruf Sie an
glUseProgram (program->getHandle())
vor zu versuchen, den AufrufglUniform()
?glUniform()
in Ihrem Beispiel - es gibt eine komplette Reihe von Gründen aufgeführt, die in der spec. IMHO das Programm nicht aktiv ist scheinbar der einzige, der möglicherweise gilt.In der Regel diese Fehlernummer tritt auf, wenn Sie mit einer anderen programID aus dem programID generiert openGL die zum Zeitpunkt der Erstellung der shader. Es bedeutet, dass Sie mit einer anderen programID an der Zeit, verbindliche
vertexShader
oderfragmentShader
oder was auch immer andere shader, die Sie verwenden.