gpt4 book ai didi

opengl - 如何计算法线矩阵?

转载 作者:行者123 更新时间:2023-12-03 13:42:01 32 4
gpt4 key购买 nike

我的正常矩阵有些麻烦。

vs.glsl

#version 440

in vec3 vPosition;
in vec3 vNormal;

out vec4 eyeCordFs;
out vec4 eyeNormalFs;

uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;

void main()
{
mat4 modelView = view * model;
mat4 normalMatrix = view * transpose(inverse(model));
vec4 eyeNorm = normalize(normalMatrix * vec4(vNormal, 0.0));
vec4 eyeCord= modelView * vec4(vPosition, 1.0);

eyeCordFs = eyeCord;
eyeNormalFs = eyeNorm;

gl_Position = proj * modelView * vec4( vPosition,1.0);
}


fs.glsl

#version 440

in vec4 eyeCordFs;
in vec4 eyeNormalFs;

out vec3 outputColor;

uniform vec4 lightPos;

void main()
{
vec4 s = normalize(lightPos - eyeCordFs) ;
vec4 r = reflect(-s,eyeNormalFs);
vec4 v = normalize(-eyeCordFs);
float spec = max( dot(v,r),0.0 );
float diff = max(dot(eyeNormalFs,s),0.0);

vec3 diffColor = diff * vec3(1,0,0);
vec3 specColor = pow(spec,3) * vec3(1,1,1);
vec3 ambientColor = vec3(0.1,0.1,0.1);

outputColor = diffColor + 0.5 * specColor + ambientColor;
}


这样的输出看起来像


这对我来说似乎有点奇怪。但是我知道我没有缩放任何东西,所以我认为我可以使用modelView矩阵来变换法线。

所以我换了线

vec4 eyeNorm = normalize(normalMatrix * vec4(vNormal, 0.0));




vec4 eyeNorm = normalize(modelView * vec4(vNormal, 0.0));


现在输出看起来像这样



看起来是正确的。我是用错误的方式计算 normalMatrix吗?

最佳答案

法线矩阵是modelview矩阵的转置逆。所以在GLSL中

mat4 normalMatrix = transpose(inverse(modelView));


但是,不应在着色器中计算法线矩阵。在着色器中这样做会浪费很多宝贵的GPU周期。矩阵求逆开始并不便宜,在着色器中执行矩阵求反会迫使GPU一次又一次地为每个顶点执行计算。在CPU上对其进行预先计算,然后将其统一传递。

关于opengl - 如何计算法线矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21079623/

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