【发布时间】:2019-05-26 19:26:09
【问题描述】:
我一直在为透视投影的眼睛空间坐标中的片段着色器中进行光照计算(顶点着色器和片段着色器都已附加),并且效果很好。
但是当相同的着色器用于正交投影或(FOV)透视投影(10 度 FOV)中的视野减小时,它就不能很好地工作。阴影变得奇怪。
到目前为止,我的理解是,由于正交投影的工作方式,眼坐标导数的计算在片段着色器中变得毫无意义,并且眼坐标位置的导数始终为零,除了边缘(如果我在这里错了,请纠正我,因为我使用计算机图形和 OpenGL 的经验有限)。 我也不知道如何正确地做到这一点。如果有人能指出我正确的信息来源,那就太好了。
顶点着色器
#version 330 core
layout (location = 0) in vec3 vertex_position;
uniform mat4 transform_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;
out vec3 ec_pos;
void main()
{
gl_Position = (view_matrix*transform_matrix*model_matrix*vec4(vertex_position, 1.0));
ec_pos = gl_Position.xyz;
}
片段着色器
#version 330 core
out vec4 FragColor;
uniform vec3 objectColor;
in vec3 ec_pos;
void main()
{
vec3 lightColor = vec3(0.99,0.96,0.89);
vec3 lightPos = vec3(0,0,0,1);
vec3 ec_normal = normalize(cross(dFdx(ec_pos), dFdy(ec_pos)));
float diff = max(dot(ec_normal, lightPos), 0.0);
vec3 diffuse = diff * lightColor;
vec3 result = diffuse * objectColor;
FragColor = vec4(result, 1.0);
}
【问题讨论】:
-
“阴影变得奇怪” - 什么是有线的?
-
"在片段着色器中,眼坐标导数的计算变得毫无意义" 但是
ec_pos,尽管有您的命名约定,但并不是眼空间位置。这是剪辑空间位置。 -
我刚刚通过在世界坐标空间中移动所有计算解决了我自己的问题。
-
@NicolBolas,我是新手,很抱歉术语不正确。我将使用正确的术语编辑问题。
-
@Rabbid76,如果您看到图像,照明没有考虑表面法线。漫射照明组件在整个表面上几乎相同,产生了意想不到的阴影。
标签: c++ opengl glsl lighting orthographic