像素着色不太顺畅

时间:2015-07-19 01:51:38

标签: c++ opengl normals pixel-shading

我正在使用简单着色(环境+漫反射)实现基本高度图。着色在片段着色器上实现,如下所示。

#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计算一个简单的漫反射组件。此变量直接从顶点着色器传递。

以下是我目前所拥有的截图:

enter image description here

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

但是,如果这是预期的,那么任何技术都可以改善我现在拥有的东西吗?

为了计算法线,我使用了以下算法: Finite difference method (Stack Overflow)

1 个答案:

答案 0 :(得分:1)

使用像素着色器无法为您提供平滑的阴影。一般情况下,每个三角形只有一个法线,可以在屏幕截图中看到平面阴影。你想要的是计算每个顶点法线加权平均值的一些方法 - 加权方法实际取决于你(here是一个可能的列表)。

here是一个SO帖子,提供用于查找加权顶点法线的伪代码。

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