Opengl 法线贴图中的照明不正确

Opengl 法线贴图中的照明不正确,opengl,mapping,glsl,normals,Opengl,Mapping,Glsl,Normals,我的OpenGL游戏引擎中有一个法线贴图,我意识到我的法线贴图着色器和视差贴图着色器在照明方面有问题。无论灯光位于何处,灯光始终来自右侧。我使用的是切线空间着色器,我不确定我传递的内容是否正确 这是我正在使用的法线贴图: 下面是渲染: 灯光似乎来自坐标3,0,3,但其实际位置为-3,0,3 任何想法 着色器: [垂直] attribute vec3 intan; varying vec3 lightDir; varying vec3 viewDir; void main() { gl_Po

我的OpenGL游戏引擎中有一个法线贴图,我意识到我的法线贴图着色器和视差贴图着色器在照明方面有问题。无论灯光位于何处,灯光始终来自右侧。我使用的是切线空间着色器,我不确定我传递的内容是否正确

这是我正在使用的法线贴图:

下面是渲染:

灯光似乎来自坐标3,0,3,但其实际位置为-3,0,3

任何想法

着色器:

[垂直]

attribute vec3 intan;

varying vec3 lightDir;
varying vec3 viewDir;

void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;

vec3 vertexPos = vec3(gl_ModelViewMatrix * gl_Vertex);

vec3 n = normalize(gl_NormalMatrix * gl_Normal);
vec3 t = normalize(gl_NormalMatrix * intan);
vec3 b = cross(n, t) ;

mat3 tbnMatrix = mat3(t.x, b.x, n.x,
                      t.y, b.y, n.y,
                      t.z, b.z, n.z);

lightDir = (gl_LightSource[1].position.xyz - vertexPos) / 1000.;
lightDir = tbnMatrix * lightDir;

viewDir = -vertexPos;
    //viewDir = 
viewDir = tbnMatrix * viewDir;
}
[论坛]

uniform sampler2D tex;
uniform sampler2D nor;

varying vec3 lightDir;
varying vec3 viewDir;

const vec4 d = vec4(0.19225,0.19225,0.19225,1.0);
const vec4 a = vec4(0.50754,0.50754,0.50754,1.0);
const vec4 s = vec4(0.508273,0.508273,0.508273,1.0);

void main()
{
vec3 l = lightDir;
float atten = max(0.0, 1.0 - dot(l, l));

l = normalize(l);

vec3 n = normalize(texture2D(nor, gl_TexCoord[0].st).xyz * 2.0 - 1.0);
vec3 v = normalize(viewDir);
vec3 h = normalize(l + v);

float nDotL = max(0.0, dot(n, l));
float nDotH = max(0.0, dot(n, h));
float power = (nDotL == 0.0) ? 0.0 : pow(nDotH, gl_FrontMaterial.shininess);

vec4 ambient = a * atten;
vec4 diffuse = d * nDotL * atten;
vec4 specular = s * power * atten;
vec4 color = ambient + diffuse + specular;

gl_FragColor = color * texture2D(tex, gl_TexCoord[0].st);
}
我想intan指定法线贴图右指向的方向。那么叉积是错误的。如果n指向曲面外而intan指向右侧,则副法线向下

请注意,如果变换法线和切线,然后进行结果的叉积,或者先进行叉积,然后变换结果,则没有区别

lightDir=gl_光源[1]。position.xyz-vertexos/1000

你为什么不把它正常化?那除以1000是没有意义的

我想intan指定法线贴图右指向的方向。那么叉积是错误的。如果n指向曲面外而intan指向右侧,则副法线向下

请注意,如果变换法线和切线,然后进行结果的叉积,或者先进行叉积,然后变换结果,则没有区别

lightDir=gl_光源[1]。position.xyz-vertexos/1000


你为什么不把它正常化?那除以1000是没有意义的。

+1表示酷地图。但是有什么想法吗?为什么不只是破解VordPo.x= -VistoPo.XI尝试,但我会有一个问题的光在另一边。+ 1的凉爽地图。但是有什么想法吗?为什么不只是破解VordPo.x= -VeloPosi.XI尝试,但我会有一个问题,在另一边的光。除以1000是我如何计算衰减。如果你看我的片段着色器,我用1减去向量长度的平方,得到最大值在0.0和0.0之间。1000表示我的灯光可以达到1000个灯光单位。我无法再深入解释了。我只知道它是有效的,除以1000就是我计算衰减的方法。如果你看我的片段着色器,我用1减去向量长度的平方,得到最大值在0.0和0.0之间。1000表示我的灯光可以达到1000个灯光单位。我无法再深入解释了。我只知道它是有效的
vec3 n = normalize(gl_NormalMatrix * gl_Normal);
vec3 t = normalize(gl_NormalMatrix * intan);
vec3 b = cross(n, t) ;