Opengl 从噪波纹理导出不确定性值?
我正在努力实现。我正处于这个过程的一部分,它要求使用“噪波”纹理来导出不确定性值,这将为边缘贴图提供偏移 以下是我的圆环体边缘贴图的图片: 下面是我用Perlin函数得到的噪声纹理: 我分别在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); 我暂
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);