Java opengl照明在每个模型上都是反向的
我有一个问题,模型中的照明看起来好像在渲染的每个模型上都是反转的。我正在照亮一个平铺区域,每个平铺封装一个8x8的较小平铺子集,因此每个较大的平铺包含4*8*8个顶点 我将Y方向的法线设置为1-尝试将其反转,但当然,这会使灯光指向另一个方向,因此场景变暗。我也试着扭转所有三角形的缠绕,但那只会产生完全混乱的混乱。我确实将法线和灯光位置传递给着色器,但我看不到任何会产生这种效果的东西。我已经拨弄了着色器,改变了各种标志等,但没有任何东西能修复它。 以前有人见过这个吗?我会寻找什么来修复它 这个项目涉及大量的代码,所以我将只发布我认为相关的内容 初始化VBO数据的数组: 片段着色器 顶点着色器Java opengl照明在每个模型上都是反向的,java,opengl,glsl,Java,Opengl,Glsl,我有一个问题,模型中的照明看起来好像在渲染的每个模型上都是反转的。我正在照亮一个平铺区域,每个平铺封装一个8x8的较小平铺子集,因此每个较大的平铺包含4*8*8个顶点 我将Y方向的法线设置为1-尝试将其反转,但当然,这会使灯光指向另一个方向,因此场景变暗。我也试着扭转所有三角形的缠绕,但那只会产生完全混乱的混乱。我确实将法线和灯光位置传递给着色器,但我看不到任何会产生这种效果的东西。我已经拨弄了着色器,改变了各种标志等,但没有任何东西能修复它。 以前有人见过这个吗?我会寻找什么来修复它 这个项目
三天后我终于明白了。我唯一的线索是,灯光不知何故“颠倒了”,所以我花了很多时间将符号改为-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);