Ich habe einen diffusen Licht-Shader, der zu funktionieren scheint, wenn das Objekt nicht rotiert. Wenn ich jedoch die Rotationstransformation anwende, scheint sich das Licht auch mit dem Objekt zu drehen. Es ist, als würden das Objekt und das Licht still bleiben, aber die Kamera ist diejenige, die sich um das Objekt bewegt.OpenGL: Wie macht man Licht, um unabhängig von der Rotation zu sein?
Hier ist meine Vertex-Shader-Code:
#version 110
uniform mat4 projectionMatrix;
uniform mat4 modelviewMatrix;
uniform vec3 lightSource;
attribute vec3 vertex;
attribute vec3 normal;
varying vec2 texcoord;
void main() {
gl_Position = projectionMatrix * modelviewMatrix * vec4(vertex, 1.0);
vec3 N = gl_NormalMatrix * normalize(normal);
vec4 V = modelviewMatrix * vec4(vertex, 1.0);
vec3 L = normalize(lightSource - V.xyz);
float NdotL = max(0.0, dot(N, L));
gl_FrontColor = vec4(gl_Color.xyz * NdotL, 1.0);
gl_TexCoord[0] = gl_MultiTexCoord0;
}
und hier ist der Code, der die Rotation tut:
scene.LoadIdentity();
scene.Translate(0.0f, -5.0f, -20.0f);
scene.Rotate(angle, 0.0f, 1.0f, 0.0f);
object->Draw();
Ich schickte das Auge Raumlichtposition durch eine glUniform3f, in der objekt-> Draw() -Funktion. Die Lichtposition ist statisch und folgendermaßen definiert:
glm::vec4 lightPos(light.x, light.y, light.z, 1.0);
glm::vec4 lightEyePos = modelviewMatrix * lightPos;
glUniform3f(uniforms.lightSource, lightEyePos.x, lightEyePos.y, lightEyePos.z);
Was ist falsch an diesem Ansatz?
Edit: Der GLM :: LookAt Code
Scene scene;
scene.LoadMatrix(projection);
scene.SetMatrixMode(Scene::Modelview);
scene.LoadIdentity();
scene.SetViewMatrix(glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, -5.0f, -20.0f), glm::vec3(0.0f, 1.0f, 0.0f)));
Der SetViewMatrix Code:
void Scene::SetViewMatrix(const glm::mat4 &matrix) {
viewMatrix = matrix;
TransformMatrix(matrix);
}
Dann Ich habe gerade die modelviewMatrix ich zum viewMatrix verwendet:
glm::vec4 lightPos(light.x, light.y, light.z, 1.0);
glm::vec4 lightEyePos = viewMatrix * lightPos;
glUniform3f(uniforms.lightSource, lightEyePos.x, lightEyePos.y, lightEyePos.z);
Meine Vermutung ist, dass Ihre Augen-Raum-Lichtposition falsch ist. Wie generieren Sie das? – Tim
Ich hoffe, dass das der Fall ist. Hier ist, wie ich es gemacht habe: glm :: vec4 lightPos (light.x, light.y, light.z, 1.0); glm :: vec4 lightEyePos = modellansichtMatrix * lightPos; glUniform3f (uniforms.lightSource, lightEyePos.x, lightEyePos.y, lightEyePos.z); –