OpenGL平面阴影照明着色器问题

时间:2020-08-11 20:14:15

标签: opengl shader lighting

我试图用平坦的阴影渲染基于网格的地形,但是我的输出看起来很错误:

output

地形数据如下:

0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0

因此,中间的正方形在高度1处,是平坦的(即共面三角形),并且与地面平行,这四个NSEW正方形在高度0处为一半,在高度1处为一半,或者更确切地说为1/3,是平坦且横向的,这四个角正方形正像您想象的那样-不用担心这些角,因为我没有正确旋转接缝。

我的顶点着色器是:

#version 460

layout(location = 0) uniform mat4 projection;
layout(location = 4) uniform mat4 world;

layout(location = 0) in vec3 vPosition;
layout(location = 0) in vec3 fNormal;
layout(location = 2) in vec4 vColor;

flat out vec4 fColor;

const vec3 sunDirection = vec3(0, 0, 1);

void main(void)
{
    gl_Position = projection * world * vec4(vPosition, 1);
    fColor = (1 - max(0, dot(sunDirection, fNormal))) * vColor;
}

太阳方向硬编码为沿Z轴的垂直方向。片段着色器只是复制给定的颜色,没有花哨。

在下面您可以看到一些生成的顶点数据。索引24是中间正方形(4 * 6)的开始,在它是左中间正方形之前,您可以根据计算的法线看到它是共面的。

vertex data

所以我的问题:

  1. 为什么需要减去太阳方向和法向矢量之间的点积才能看到任何东西?没有它,我将得到一张完全“浅”(即鲜绿色)的图片。在我从未读过的任何教程中,我都没有看到进行此减法的必要。

  2. 为什么左中和右中单元格看起来一半阴影一半明亮?它们是共面的,应该共享一种颜色。

  3. 为什么中间的扁平电池没有显示为鲜绿色?再次,它与法线向量垂直共面。

  4. 为什么前3个单元格完全亮了?假定顶点计算正确,但是如果需要,我也可以提供它们。

1 个答案:

答案 0 :(得分:1)

layout(location = 0) in vec3 vPosition;
layout(location = 0) in vec3 fNormal;

那是行不通的。这是位置别名,两个输入变量将从属性插槽0接收相同的数据。

相关问题