【问题标题】:How to handle lighting in orthographic projection in modern opengl? [closed]如何在现代opengl中处理正交投影中的照明? [关闭]
【发布时间】: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


【解决方案1】:

我通过在相机坐标空间中进行计算(即在应用投影变换之前)解决了我自己的问题。这是正确的代码:

顶点着色器:

void main()
{
    vec4 mcPos = model_matrix*vec4(vertex_position, 1.0);
    vec4 wcPos = transform_matrix*vec4(mcPos);
    gl_Position = view_matrix*wcPos;
    mc_pos = mcPos.xyz;
    wc_pos = wcPos.xyz;
}

片段着色器:

#version 330 core
out vec4 FragColor;
uniform vec3 objectColor;
in vec3 mc_pos;
in vec3 wc_pos;
void main()
{
    vec3 lightColor = vec3(0.99,0.96,0.89);
    vec3 lightPos = vec3(0,0,1);
    vec3 wc_normal = normalize(cross(dFdx(wc_pos), dFdy(wc_pos)));
    float diff = max(dot(wc_normal, lightPos), 0.0);
    vec3 diffuse = (diff) * lightColor;
    vec3 result = ( diffuse ) * objectColor;
    FragColor = vec4(result, 1.0);
}

正确的阴影

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多