Java opengl照明在每个模型上都是反向的

Java opengl照明在每个模型上都是反向的,java,opengl,glsl,Java,Opengl,Glsl,我有一个问题,模型中的照明看起来好像在渲染的每个模型上都是反转的。我正在照亮一个平铺区域,每个平铺封装一个8x8的较小平铺子集,因此每个较大的平铺包含4*8*8个顶点 我将Y方向的法线设置为1-尝试将其反转,但当然,这会使灯光指向另一个方向,因此场景变暗。我也试着扭转所有三角形的缠绕,但那只会产生完全混乱的混乱。我确实将法线和灯光位置传递给着色器,但我看不到任何会产生这种效果的东西。我已经拨弄了着色器,改变了各种标志等,但没有任何东西能修复它。 以前有人见过这个吗?我会寻找什么来修复它 这个项目

我有一个问题,模型中的照明看起来好像在渲染的每个模型上都是反转的。我正在照亮一个平铺区域,每个平铺封装一个8x8的较小平铺子集,因此每个较大的平铺包含4*8*8个顶点

我将Y方向的法线设置为1-尝试将其反转,但当然,这会使灯光指向另一个方向,因此场景变暗。我也试着扭转所有三角形的缠绕,但那只会产生完全混乱的混乱。我确实将法线和灯光位置传递给着色器,但我看不到任何会产生这种效果的东西。我已经拨弄了着色器,改变了各种标志等,但没有任何东西能修复它。 以前有人见过这个吗?我会寻找什么来修复它

这个项目涉及大量的代码,所以我将只发布我认为相关的内容

初始化VBO数据的数组:

片段着色器

顶点着色器


三天后我终于明白了。我唯一的线索是,灯光不知何故“颠倒了”,所以我花了很多时间将符号改为-to+,反之亦然,并改变了各种乘法顺序。最后,错误不在我的着色器中。我在顶点着色器中传递给ModelViewMatrix的值的计算顺序错误

        Matrix4f.mul(model, camera, modelview); 
        shader.setUniform(iModelView, modelview);
应该是:

        Matrix4f.mul(camera, model, modelview); 
        shader.setUniform(iModelView, modelview);

你能不能也提供你的顶点着色器代码?只是一个想法,但可能是因为你在漫反射计算中使用了光照位置的标准化坐标,而不仅仅是正常世界坐标?如果使用这个,任何不以原点为中心的物体都可能不会被点亮。我首先将法线绘制为一种颜色,例如FragColor=vec4Normal*0.5+0.5,1,然后关注LightVector*CameraPos,它是常量,应该在预先计算中传递,但我发现转置/反向乘法非常奇怪。然后绘制灯位和s,以检查位置是否正确。其中至少有一种方法是错误的,在漫反射工作之前,给出不正确的漫反射照明离开规格,最快的检查方法是将矢量绘制为颜色。此外,由于线性插值,您需要在片段着色器中重新规格化法线。我也发布了顶点着色器代码。这些都是很好的调试建议-不允许说谢谢。。。。
#version 430

in vec3 Position;
in vec3 Normal;
in vec2 TexCoord;

//uniform sampler2D Tex1;
layout(binding=0) uniform sampler2D Tex1;

struct LightPos {
    vec4 LightVector;
    mat4 CameraPos;
};
uniform LightPos SetLight;

struct LightInfo {
    vec4 Position; //light pos in eye coords
    vec3 Intensity; //ads light intensity 
};
uniform LightInfo Light;

struct MaterialInfo {
    vec3 Ka; //ambient reflectivity
    vec3 Kd; //diffuse reflectivity
    vec3 Ks; //specular reflectivity
    float Shininess; //specular shininess factor
};
uniform MaterialInfo Material;

layout ( location = 0 ) out vec4 FragColor;

void phongModel (vec3 position, vec3 norm, out vec3 ambanddiff, out vec3 spec)
{

    vec4 LightPosition = SetLight.LightVector * SetLight.CameraPos;

    vec3 s = normalize( vec3(LightPosition) - position);
    vec3 v = normalize( -position.xyz );
    vec3 r = reflect( -s, norm );
    vec3 ambient = Light.Intensity * Material.Ka;
    float sDotN = max( dot( s, norm ), 0.0);
    vec3 diffuse = Light.Intensity * Material.Kd * sDotN;
    spec = vec3(0.0);

    if ( sDotN > 0.0 ) 
        spec = Light.Intensity * Material.Ks * pow(max( dot(r,v), 0.0), Material.Shininess);

    ambanddiff = ambient + diffuse;
}

void main(void) 
{
    vec3 ambanddiff, spec;
    vec4 texColor = texture( Tex1, TexCoord );

    phongModel (Position, Normal, ambanddiff, spec);
    FragColor = vec4(ambanddiff, 1.0) * texColor + vec4(spec, 1.0); 
}
#version 430

layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexNormal;
layout (location = 2) in vec2 VertexTexCoord;

out vec3 Position;
out vec3 Normal;
out vec2 TexCoord;

out vec4 MVPPos;

uniform mat4 ModelViewMatrix;
uniform mat3 NormalMatrix;
uniform mat4 ProjectionMatrix;
uniform mat4 MVP;

void main()
{
    TexCoord = VertexTexCoord;
    Normal = normalize( NormalMatrix * VertexNormal );
    Position = vec3( ModelViewMatrix * vec4(VertexPosition,1.0) );
    //gl_Position = MVP * vec4(VertexPosition,1.0);
    MVPPos = MVP * vec4(VertexPosition,1.0);
    gl_Position = MVPPos;
}
        Matrix4f.mul(model, camera, modelview); 
        shader.setUniform(iModelView, modelview);
        Matrix4f.mul(camera, model, modelview); 
        shader.setUniform(iModelView, modelview);