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.
Wo ist die '# version' Direktive für Ihren Fragment Shader? – genpfault
ausgelassen versehentlich – user2227713