Ho uno shader di illuminazione diffuso che sembra funzionare quando l'oggetto non ruota. Tuttavia, quando applico la trasformazione di rotazione, anche la luce sembra ruotare insieme all'oggetto. È come l'oggetto e la luce rimane ferma ma la fotocamera è quella che si muove attorno all'oggetto.OpenGL: come rendere la luce indipendente dalla rotazione?
Ecco la mia vertex codice dello shader:
#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;
}
Ed ecco il codice che fa la rotazione:
scene.LoadIdentity();
scene.Translate(0.0f, -5.0f, -20.0f);
scene.Rotate(angle, 0.0f, 1.0f, 0.0f);
object->Draw();
ho mandato la posizione della luce occhio-spazio attraverso una glUniform3f, all'interno del object-> Funzione Draw(). La posizione della luce è statica e definita come:
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);
Cosa c'è di sbagliato in questo approccio?
Edit: La GLM :: Codice 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)));
Il codice SetViewMatrix:
void Scene::SetViewMatrix(const glm::mat4 &matrix) {
viewMatrix = matrix;
TransformMatrix(matrix);
}
Poi ho appena cambiato il modelviewMatrix ho usato per il 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);
La mia ipotesi è che la posizione della luce dello spazio degli occhi non sia corretta. Come stai generando questo? – Tim
Spero davvero che sia così. Ecco come l'ho fatto: 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); –