如何解决OpenGL平面阴影照明着色器问题
我试图用平坦的阴影渲染基于网格的地形,但是我的输出看起来很错误:
地形数据如下:
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接收相同的数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。