问题描述
我试图用平坦的阴影渲染基于网格的地形,但是我的输出看起来很错误:
地形数据如下:
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,1);
void main(void)
{
gl_Position = projection * world * vec4(vPosition,1);
fColor = (1 - max(0,dot(sunDirection,fnormal))) * vColor;
}
太阳方向硬编码为沿Z轴的垂直方向。片段着色器只是复制给定的颜色,没有花哨。
在下面您可以看到一些生成的顶点数据。索引24是中间正方形(4 * 6)的开始,在它是左中间正方形之前,您可以根据计算的法线看到它是共面的。
所以我的问题:
-
为什么需要减去太阳方向和法向矢量之间的点积才能看到任何东西?没有它,我将得到一张完全“浅”(即鲜绿色)的图片。在我从未读过的任何教程中,我都没有看到进行此减法的必要。
-
为什么左中和右中单元格看起来一半阴影一半明亮?它们是共面的,应该共享一种颜色。
-
为什么前3个单元格完全亮了?假定顶点计算正确,但是如果需要,我也可以提供它们。
解决方法
layout(location = 0) in vec3 vPosition; layout(location = 0) in vec3 fNormal;
那是行不通的。这是位置别名,两个输入变量将从属性插槽0接收相同的数据。