-1

我正在实现一个带有简单阴影(环境+漫反射)的基本高度图。着色是在片段着色器上实现的,如下图所示。

#version 330

in  vec3 fragNormal;
out vec4 outColor;

uniform vec3 lightDirection;
uniform vec3 lightColor;
uniform vec3 objectColor;

void main()
{
    float ambientStrength = 0.1f;
    vec3 ambientColor = ambientStrength * lightColor;

    vec3 norm = normalize(fragNormal);
    float diff = max(dot(norm, -normalize(lightDirection)), 0.0f);
    vec3 diffuseColor = diff * lightColor;

    outColor = vec4((ambientColor + diffuseColor) * objectColor, 1);
}

我所做的是基于正常的 fragNormal 计算一个简单的漫反射分量。此变量直接从顶点着色器传递。

这是我目前拥有的屏幕截图:

在此处输入图像描述

这是带有像素着色的高度图的预期结果吗?我对表面不是很光滑的事实有点恼火。

但是,如果这是预期的,那么有什么技术可以改善我目前拥有的东西吗?

为了计算法线,我使用了以下算法: 有限差分法(堆栈溢出)

4

1 回答 1

1

使用像素着色器并不能免费为您提供平滑的着色。一般来说,每个三角形只有一个法线会给您在屏幕截图中看到的平坦阴影。您想要的是某种计算每个顶点法线加权平均值的方法 - 加权方法实际上取决于您(这里是可能性列表)。

这是一个 SO 帖子,给出用于查找加权顶点法线的伪代码。

您发布的方法似乎是一种快速逼近高度图上某个点的法线的方法。这个页面似乎表明做一些类似的事情(计算一个点周围的法线之和)来实现类似的平滑效果,同时仍然使用有限差分。

于 2015-07-19T02:34:04.980 回答