mirror of
https://github.com/overte-org/overte.git
synced 2025-04-25 17:55:36 +02:00
63 lines
2.3 KiB
GLSL
63 lines
2.3 KiB
GLSL
#version 120
|
|
|
|
//
|
|
// perlin_modulate.frag
|
|
// fragment shader
|
|
//
|
|
// Created by Andrzej Kapolka on 5/15/13.
|
|
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
|
|
//
|
|
|
|
// the texture containing our permutations and normals
|
|
uniform sampler2D permutationNormalTexture;
|
|
|
|
// the noise frequency
|
|
const float frequency = 1024.0;
|
|
|
|
// the noise amplitude
|
|
const float amplitude = 0.1;
|
|
|
|
// the position in model space
|
|
varying vec3 position;
|
|
|
|
// returns the gradient at a single corner of our sampling cube
|
|
vec3 grad(vec3 location) {
|
|
float p1 = texture2D(permutationNormalTexture, vec2(location.x / 256.0, 0.25)).r;
|
|
float p2 = texture2D(permutationNormalTexture, vec2(p1 + location.y / 256.0, 0.25)).r;
|
|
return texture2D(permutationNormalTexture, vec2(p2 + location.z / 256.0, 0.75)).xyz * 2.0 - vec3(1.0, 1.0, 1.0);
|
|
}
|
|
|
|
// returns the perlin noise value for the specified location
|
|
float perlin(vec3 location) {
|
|
vec3 floors = floor(location);
|
|
vec3 ceils = ceil(location);
|
|
vec3 fff = grad(floors);
|
|
vec3 ffc = grad(vec3(floors.x, floors.y, ceils.z));
|
|
vec3 fcf = grad(vec3(floors.x, ceils.y, floors.z));
|
|
vec3 fcc = grad(vec3(floors.x, ceils.y, ceils.z));
|
|
vec3 cff = grad(vec3(ceils.x, floors.y, floors.z));
|
|
vec3 cfc = grad(vec3(ceils.x, floors.y, ceils.z));
|
|
vec3 ccf = grad(vec3(ceils.x, ceils.y, floors.z));
|
|
vec3 ccc = grad(ceils);
|
|
vec3 ffracts = fract(location);
|
|
vec3 cfracts = ffracts - vec3(1.0, 1.0, 1.0);
|
|
vec3 params = ffracts*ffracts*(3.0 - 2.0*ffracts);
|
|
|
|
float fffv = dot(fff, ffracts);
|
|
float ffcv = dot(ffc, vec3(ffracts.x, ffracts.y, cfracts.z));
|
|
float fcfv = dot(fcf, vec3(ffracts.x, cfracts.y, ffracts.z));
|
|
float fccv = dot(fcc, vec3(ffracts.x, cfracts.y, cfracts.z));
|
|
float cffv = dot(cff, vec3(cfracts.x, ffracts.y, ffracts.z));
|
|
float cfcv = dot(cfc, vec3(cfracts.x, ffracts.y, cfracts.z));
|
|
float ccfv = dot(ccf, vec3(cfracts.x, cfracts.y, ffracts.z));
|
|
float cccv = dot(ccc, cfracts);
|
|
|
|
return mix(
|
|
mix(mix(fffv, cffv, params.x), mix(fcfv, ccfv, params.x), params.y),
|
|
mix(mix(ffcv, cfcv, params.x), mix(fccv, cccv, params.x), params.y),
|
|
params.z);
|
|
}
|
|
|
|
void main(void) {
|
|
gl_FragColor = vec4(gl_Color.rgb * (1.0 + amplitude*(perlin(position * frequency) - 1.0)), 1.0);
|
|
}
|