gpt4 book ai didi

c++ - OpenGL:如何使光与旋转无关?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:59 25 4
gpt4 key购买 nike

我有一个漫射照明着色器,它似乎在对象不旋转时起作用。然而,当我应用旋转变换时,光线似乎也随着物体旋转。这就像物体和光线保持静止,但相机是围绕物体移动的相机。

这是我的顶点着色器代码:

#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;
}

这是执行旋转的代码:

scene.LoadIdentity();
scene.Translate( 0.0f, -5.0f, -20.0f );
scene.Rotate( angle, 0.0f, 1.0f, 0.0f );
object->Draw();

我在 object->Draw() 函数内通过 glUniform3f 发送了眼睛空间光的位置。光源位置是静态的,定义为:

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 );

这种方法有什么问题?

编辑: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 ) ) );

SetViewMatrix 代码:

void Scene::SetViewMatrix( const glm::mat4 &matrix ) {
viewMatrix = matrix;
TransformMatrix( matrix );
}

然后我就把我用的modelviewMatrix改成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 );

最佳答案

Statement 1: The light position is static.

Statement 2: lightEyePos = modelviewMatrix * lightPos;

这两个说法是不一致的。如果您的灯光位置应该是静态的,则不应对其应用旋转模型矩阵。

如果您的 lightPos 是在世界坐标中定义的,那么您应该将它与 viewMatrix 而不是 modelviewMatrix 相乘。 modelviewMatrix 包含模型矩阵,其中包含模型的旋转(您不想将其应用于固定光源)。

关于c++ - OpenGL:如何使光与旋转无关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10905035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com