efeitos de turbulência
DESCRIPTION
Descrição e explicação do algoritmo de Perlin para gerar ruído. Foco especialmente no exemplo do toco de madeira.TRANSCRIPT
Efeitos de turbulência
Usando o exemplo “wood.cpp” e outros envolvendo o conceito de
ruído (‘noise’)
Luiz Fernando Estevão da SilvaDRE: 107362404 Data: 21/09/2009
Observando o código// wood.vert
varying float LightIntensity;varying vec3 MCposition;
void main(){float Scale = 0.5;vec3 ECposition = vec3(gl_ModelViewMatrix * gl_Vertex);MCposition = vec3(gl_Vertex) * Scale;vec3 tnorm = normalize(vec3 (gl_NormalMatrix * gl_Normal));LightIntensity = dot(normalize(gl_LightSource[0].position - ECposition), tnorm);LightIntensity *= 1.5;gl_Position = ftransform();
}
// wood.frag
varying float LightIntensity; varying vec3 MCposition;varying vec3 pos;varying vec3 normal;uniform sampler3D Noise;
void main(void){vec3 LightWoodColor = vec3(0.6, 0.3, 0.1);vec3 DarkWoodColor = vec3(0.4, 0.2, 0.07);float RingFreq = 4.7; // “incremento do raio das circunferências”float LightGrains = 1.0; // grânulos clarosfloat DarkGrains = 0.0; // grânulos escurosfloat GrainThreshold = 0.5; // limiar de granulosidadevec3 NoiseScale = vec3(0.5, 0.1, 0.1);float Noisiness = 3.0; float GrainScale = 27.0;
vec4 matspec = gl_FrontMaterial.specular; float shininess = gl_FrontMaterial.shininess;
vec4 lightspec = gl_LightSource[0].specular;
vec3 noisevec = vec3 (texture3D(Noise, MCposition * NoiseScale) *
Noisiness);vec3 location = MCposition + noisevec;
float dist = sqrt(location.x * location.x + location.z * location.z);dist *= RingFreq;
float r = fract(dist + noisevec[0] + noisevec[1] + noisevec[2]) * 2.0;
if (r > 1.0)r = 2.0 - r;
vec3 color = mix(LightWoodColor, DarkWoodColor, r);
r = fract((MCposition.x + MCposition.z) * GrainScale + 0.5);noisevec[2] *= r;if (r < GrainThreshold)
color += LightWoodColor * LightGrains * noisevec[2];else
color -= LightWoodColor * 0.0 * noisevec[2];
color *= LightIntensity;
color = clamp(color, 0.0, 1.0); // clamp not needed for book shader
gl_FragColor = vec4 (color, 1.0);}
Um exemplo visual
• O círculo será perturbado para gerar o efeito de anel da tora de madeira.
• O ângulo irá ser varrido de 0 a 2π. O raio irá variar conforme o critério usado.
Aleatório
• A aparência de círculo é completamente perdida.
• Gera descontinuidade visualmente perceptível.
Perlin noise
• O aspecto circular apesar de modificado, guarda semelhança.
• As descontinuidades são pequenas e normalmente imperceptíveis.
Gráfico de “Perlin noise”
T (iteração)
R ( 0,5
unid)
Explicando
• A cada iteração o raio da figura se altera.
• O raio anterior é considerado. Assim não se perde a continuidade da curva.
• Quanto mais perto do 0, maior é a chance do raio aumentar, e quanto mais perto do 2, a de diminuir. (o raio 1 é o equilíbrio).
Outros exemplos
Bibliografia
• http://books.google.com.br/books?id=zkEY9RIm4WkC&pg=PA538&lpg=PA538&dq=glsl+wood+texture&source=bl&ots=tWw8GGObGY&sig=Z05SeD3TVCdlp-E0glZd-ddOiM8&hl=pt-BR&ei=6sa2Sv-6MYGo8AaO45jLDQ&sa=X&oi=book_result&ct=result&resnum=1#v=onepage&q=&f=false
• http://www.davidcornette.com/glsl/gallery.html
• http://lumina.sourceforge.net/Tutorials/Noise.html
• http://freespace.virgin.net/hugo.elias/models/m_perlin.htm