GLSL程序木材纹理的抗锯齿

时间:2015-10-07 15:46:09

标签: opengl glsl shader antialiasing procedural-generation

所以我一直在钻研&#34;纹理&amp;建模:程序方法&#34;最近开始在GLSL中编写我的第一个程序纹理。然而,让我头疼的是抗锯齿这个主题。很明显,如何在非常规则的模式(使用积分进行分析平均)或频谱合成(频率钳制)这样的简单情况下进行操作,但无论何时其他方法,都没有一种方法可行。< / p>

我有以下代码,它只是程序木(树)纹理的一部分:

vec4 TreeTexCompute(in vec2 sp)
{
    const float holeFrequency = 1.0;
    const vec2 holeThreshold = vec2(0.6, 0.85);

    vec2 vfw = fwidth(sp);
    float fw = max(vfw.x, vfw.y);

    float holeNyquist = 0.5 * holeFrequency * (1.0 / fw);

    // Upper bound for the frequencies in the function to compute 'hole' below
    float holeHighestFreq = 1.0 / (0.5 * (holeThreshold.y-holeThreshold.x));

    // Spawn a hole where gnoise has its "maximum" values
    float hole = smoothstep(holeThreshold.x, holeThreshold.y, gnoise(vec3(sp*holeFrequency, -3.75))*0.5 + 0.5);

    // Gradually fade out the hole as we approach the nyquist frequency
    float t = mix(hole, 0.0, smoothstep(0.5*holeNyquist, holeNyquist, holeHighestFreq));

    return vec4(t, t, t, 1.0);
}

它做的是随机放置小孔#34;通过将Perlin风格的渐变噪声(float gnoise(vec3))的输出提供给smoothstep函数,仅在gnoise的最大值附近创建亮点。 当我们接近奈奎斯特频率时,通过将此值逐渐淡化为黑色来完成抗锯齿。 然而,似乎淡出过早发生。相机基本上必须触摸纹理表面才能看到任何孔。这看起来并不正确,当我禁用淡出时,我看不到任何锯齿,直到我离得更远。

那么我做错了什么?我考虑了一段时间的频率计算,但发现它们没有任何问题。奈奎斯特频率是采样率的一半,并且用于计算“孔”的函数的最高频率(实际上限)。 gnoise的最大频率(我相信约为2.0)和smoothstep的结果(如果我理解正确的话,它大约是其斜坡宽度的倒数)。

顺便说一句:你会说什么是对抗随机放置的洞纹理的首选方法?完全淡出它们是我唯一能想到的,但它并没有&# 39;看起来非常令人满意。超级采样我认为只是一个黑客,并没有真正解决问题。我使用类似的方法将拉伸梯度噪声馈送到smoothstep函数以生成木材纹理的许多其他特征,包括更大的裂缝,所以我真的需要良好的抗锯齿效果。

0 个答案:

没有答案