Jac*_*oen 5 c++ opengl shader lighting rotation
我有一个漫反射照明着色器,它似乎在物体不旋转时起作用.但是,当我应用旋转变换时,灯光似乎也随着对象一起旋转.这就像物体和光线保持静止但相机是围绕物体移动的相机.
这是我的顶点着色器代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这是执行轮换的代码:
scene.LoadIdentity();
scene.Translate( 0.0f, -5.0f, -20.0f );
scene.Rotate( angle, 0.0f, 1.0f, 0.0f );
object->Draw();
Run Code Online (Sandbox Code Playgroud)
我通过glUniform3f在object-> Draw()函数内发送了眼睛空间光位置.灯光位置是静态的,定义为:
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 );
Run Code Online (Sandbox Code Playgroud)
这种方法有什么问题?
编辑:glm :: 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 ) ) );
Run Code Online (Sandbox Code Playgroud)
SetViewMatrix代码:
void Scene::SetViewMatrix( const glm::mat4 &matrix ) {
viewMatrix = matrix;
TransformMatrix( matrix );
}
Run Code Online (Sandbox Code Playgroud)
然后我只是改变了我用于viewMatrix的modelviewMatrix:
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 );
Run Code Online (Sandbox Code Playgroud)
陈述1:灯光位置是静态的.
声明2:
lightEyePos = modelviewMatrix * lightPos;
这两个说法是不一致的.如果您的灯光位置应该是静态的,则不应该对其应用旋转的模型矩阵.
如果你的lightPos是以世界坐标定义的,那么你应该将它与viewMatrix
不是modelviewMatrix
.modelviewMatrix包含模型矩阵,其中包含模型的旋转(您不希望将其应用于固定光源).
归档时间: |
|
查看次数: |
3465 次 |
最近记录: |