Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 从噪波纹理导出不确定性值?_Opengl_Graphics_Glsl_Texture Mapping_Simplex Noise - Fatal编程技术网

Opengl 从噪波纹理导出不确定性值?

Opengl 从噪波纹理导出不确定性值?,opengl,graphics,glsl,texture-mapping,simplex-noise,Opengl,Graphics,Glsl,Texture Mapping,Simplex Noise,我正在努力实现。我正处于这个过程的一部分,它要求使用“噪波”纹理来导出不确定性值,这将为边缘贴图提供偏移 以下是我的圆环体边缘贴图的图片: 下面是我用Perlin函数得到的噪声纹理: 我分别在edgeTexture和noisettexture中将它们保存为纹理 现在我被困在这一部分,你必须用从“噪波”纹理导出的不确定性值来偏移边缘贴图的纹理坐标。这张图片来自于书中: offs = turbulence(s, t); offt = turbulence(1 - s, 1 - t); 我暂

我正在努力实现。我正处于这个过程的一部分,它要求使用“噪波”纹理来导出不确定性值,这将为边缘贴图提供偏移

以下是我的圆环体边缘贴图的图片:

下面是我用Perlin函数得到的噪声纹理:

我分别在
edgeTexture
noisettexture
中将它们保存为纹理

现在我被困在这一部分,你必须用从“噪波”纹理导出的不确定性值来偏移边缘贴图的纹理坐标。这张图片来自于书中:

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));
}
#版本330
输出vec4 vFragColor;
均匀的二维边缘结构;
均匀采样二维噪声结构;
在vec2 vTexCoords中平滑;
浮子湍流(浮子s、浮子t)
{
浮点数和=0;
浮标=1;
浮点数s1=1;
vec2坐标=vec2(s,t);
对于(int i=0;i<10;i++)
{
vec4噪波=纹理(噪波纹理,0.25*s1*coords);
总和+=刻度*噪声.x;
比例=比例/2;
s1=s1*2;
}
回报金额;
}
真空总管(真空)
{
浮离=湍流(vTexCoords.s,vTexCoords.t);
浮离=湍流(1-vTexCoords.s,1-vTexCoords.t);
vFragColor=纹理(边缘纹理,vTexCoords+vec2(关闭,关闭));
}


很明显,我添加到
vTexCoords
中的内容太离谱了,但我不明白为什么。我尝试过其他几种湍流函数定义,但没有一种接近预期的输出,因此我认为我的整体方法存在缺陷。非常感谢这里的任何帮助,如果我不清楚,请发表评论。圆环体所需的输出看起来就像我想象的一个粗略绘制的圆。

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

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

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

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

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

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