Mam moduł cieniujący rozproszonego, który wydaje się działać, gdy obiekt nie obraca się. Jednak, gdy stosuję transformację obrotową, światło wydaje się obracać wraz z obiektem. To jest jak obiekt, a światło pozostaje w bezruchu, ale kamera porusza się po obiekcie.OpenGL: Jak sprawić, by światło było niezależne od rotacji?
Oto mój wierzchołek kod shaderów:
#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;
}
i oto kod, który robi obrót:
scene.LoadIdentity();
scene.Translate(0.0f, -5.0f, -20.0f);
scene.Rotate(angle, 0.0f, 1.0f, 0.0f);
object->Draw();
wysłałem pozycję oka przestrzeń światła przez glUniform3f wewnątrz obiekt-> Funkcja Draw(). Pozycja światła jest statyczna i definiowana jako:
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);
Co jest nie tak z tym podejściem?
Edit: GLM :: Kod LOOKat
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)));
Kod SetViewMatrix:
void Scene::SetViewMatrix(const glm::mat4 &matrix) {
viewMatrix = matrix;
TransformMatrix(matrix);
}
Wtedy właśnie zmienił modelviewMatrix użyłem do viewMatrix:
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);
Zgaduję, że twoja pozycja światła w przestrzeni oczu jest niepoprawna. Jak to generujesz? – Tim
Mam nadzieję, że tak jest. Oto jak to zrobiłem: 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); –