4

我正在尝试实现Sketchy Drawings。我在这个过程的一部分,它要求使用噪声纹理来导出不确定性值,这将为边缘图提供偏移量。

这是我的圆环边缘图的图片:

在此处输入图像描述

这是我按照建议使用 Perlin 函数得到的噪声纹理:

在此处输入图像描述

我将它们分别保存为edgeTexture纹理noiseTexture

现在我被困在你必须通过从噪声纹理导出的不确定值来偏移边缘贴图的纹理坐标的部分。这张图片来自书中:

在此处输入图像描述

offs = turbulence(s, t); 
offt = turbulence(1 - s, 1 - t);

我暂时忽略了 2x2 矩阵。这是我当前的片段着色器尝试及其产生的结果:

#version 330

out vec4 vFragColor;

uniform sampler2D edgeTexture;
uniform sampler2D noiseTexture;

smooth in vec2 vTexCoords;

float turbulence(float s, float t) 
{
    float sum = 0;
    float scale = 1;
    float s1 = 1;
    vec2 coords = vec2(s,t);

    for (int i=0; i < 10; i++)
    {
        vec4 noise = texture(noiseTexture, 0.25 * s1 * coords);
        sum += scale * noise.x;
        scale = scale / 2;
        s1 = s1 * 2;
    }

    return sum;
}

void main( void )
{
    float off_s = turbulence(vTexCoords.s, vTexCoords.t);
    float off_t = turbulence(1 - vTexCoords.s, 1 - vTexCoords.t);

    vFragColor = texture(edgeTexture, vTexCoords + vec2(off_s, off_t));
}

在此处输入图像描述

显然,我的补充是vTexCoords很遥远的,但我不明白为什么。我尝试了其他几个湍流函数定义,但没有一个接近所需的输出,所以我认为我的整体方法在某个地方存在缺陷。非常感谢这里的任何帮助,如果我不清楚,请发表评论。环面所需的输出看起来就像我想象的一个粗略绘制的圆圈。

4

1 回答 1

1

您的湍流函数将返回 (0,1) 范围内的值。首先,您需要更改它以使值以 0 为中心。这应该在函数的循环内完成,否则您最终会得到一个奇怪的分布。所以首先,我认为你应该改变这一行:

vec4 noise = texture(noiseTexture, 0.25 * s1 * coords);

vec4 noise = texture(noiseTexture, 0.25 * s1 * coords) * 2.0 - 1.0;

然后,您需要缩放偏移量,这样您就不会对距离正在绘制的片段太远的边缘纹理进行采样。改变:

vFragColor = texture(edgeTexture, vTexCoords + vec2(off_s, off_t));

vFragColor = texture(edgeTexture, vTexCoords + vec2(off_s, off_t) * off_scale);

其中off_scale是通过实验选择的一些小值(可能在 0.05 左右)。

于 2014-03-23T23:33:27.617 回答