go-opengl-pixel/examples/shaders/isometric-basics-emboss/emboss.fs.glsl

162 lines
5.0 KiB
GLSL

#version 330-core
// Using a sobel filter to create a normal map and then applying simple lighting.
// This makes the darker areas less bumpy but I like it
#define USE_LINEAR_FOR_BUMPMAP
//#define SHOW_NORMAL_MAP
//#define SHOW_ALBEDO
in vec2 texcoords;
uniform vec4 u_texbounds;
uniform sampler2D u_texture;
uniform vec2 u_resolution;
uniform float u_time;
uniform vec4 u_mouse;
out vec4 fragColor;
struct C_Sample
{
vec3 vAlbedo;
vec3 vNormal;
};
C_Sample SampleMaterial(const in vec2 uv, sampler2D sampler, const in vec2 vTextureSize, const in float fNormalScale)
{
C_Sample result;
vec2 vInvTextureSize = vec2(1.0) / vTextureSize;
vec3 cSampleNegXNegY = texture(sampler, uv + (vec2(-1.0, -1.0)) * vInvTextureSize.xy).rgb;
vec3 cSampleZerXNegY = texture(sampler, uv + (vec2( 0.0, -1.0)) * vInvTextureSize.xy).rgb;
vec3 cSamplePosXNegY = texture(sampler, uv + (vec2( 1.0, -1.0)) * vInvTextureSize.xy).rgb;
vec3 cSampleNegXZerY = texture(sampler, uv + (vec2(-1.0, 0.0)) * vInvTextureSize.xy).rgb;
vec3 cSampleZerXZerY = texture(sampler, uv + (vec2( 0.0, 0.0)) * vInvTextureSize.xy).rgb;
vec3 cSamplePosXZerY = texture(sampler, uv + (vec2( 1.0, 0.0)) * vInvTextureSize.xy).rgb;
vec3 cSampleNegXPosY = texture(sampler, uv + (vec2(-1.0, 1.0)) * vInvTextureSize.xy).rgb;
vec3 cSampleZerXPosY = texture(sampler, uv + (vec2( 0.0, 1.0)) * vInvTextureSize.xy).rgb;
vec3 cSamplePosXPosY = texture(sampler, uv + (vec2( 1.0, 1.0)) * vInvTextureSize.xy).rgb;
// convert to linear
vec3 cLSampleNegXNegY = cSampleNegXNegY * cSampleNegXNegY;
vec3 cLSampleZerXNegY = cSampleZerXNegY * cSampleZerXNegY;
vec3 cLSamplePosXNegY = cSamplePosXNegY * cSamplePosXNegY;
vec3 cLSampleNegXZerY = cSampleNegXZerY * cSampleNegXZerY;
vec3 cLSampleZerXZerY = cSampleZerXZerY * cSampleZerXZerY;
vec3 cLSamplePosXZerY = cSamplePosXZerY * cSamplePosXZerY;
vec3 cLSampleNegXPosY = cSampleNegXPosY * cSampleNegXPosY;
vec3 cLSampleZerXPosY = cSampleZerXPosY * cSampleZerXPosY;
vec3 cLSamplePosXPosY = cSamplePosXPosY * cSamplePosXPosY;
// Average samples to get albdeo colour
result.vAlbedo = ( cLSampleNegXNegY + cLSampleZerXNegY + cLSamplePosXNegY
+ cLSampleNegXZerY + cLSampleZerXZerY + cLSamplePosXZerY
+ cLSampleNegXPosY + cLSampleZerXPosY + cLSamplePosXPosY ) / 9.0;
vec3 vScale = vec3(0.3333);
#ifdef USE_LINEAR_FOR_BUMPMAP
float fSampleNegXNegY = dot(cLSampleNegXNegY, vScale);
float fSampleZerXNegY = dot(cLSampleZerXNegY, vScale);
float fSamplePosXNegY = dot(cLSamplePosXNegY, vScale);
float fSampleNegXZerY = dot(cLSampleNegXZerY, vScale);
float fSampleZerXZerY = dot(cLSampleZerXZerY, vScale);
float fSamplePosXZerY = dot(cLSamplePosXZerY, vScale);
float fSampleNegXPosY = dot(cLSampleNegXPosY, vScale);
float fSampleZerXPosY = dot(cLSampleZerXPosY, vScale);
float fSamplePosXPosY = dot(cLSamplePosXPosY, vScale);
#else
float fSampleNegXNegY = dot(cSampleNegXNegY, vScale);
float fSampleZerXNegY = dot(cSampleZerXNegY, vScale);
float fSamplePosXNegY = dot(cSamplePosXNegY, vScale);
float fSampleNegXZerY = dot(cSampleNegXZerY, vScale);
float fSampleZerXZerY = dot(cSampleZerXZerY, vScale);
float fSamplePosXZerY = dot(cSamplePosXZerY, vScale);
float fSampleNegXPosY = dot(cSampleNegXPosY, vScale);
float fSampleZerXPosY = dot(cSampleZerXPosY, vScale);
float fSamplePosXPosY = dot(cSamplePosXPosY, vScale);
#endif
// Sobel operator - http://en.wikipedia.org/wiki/Sobel_operator
vec2 vEdge;
vEdge.x = (fSampleNegXNegY - fSamplePosXNegY) * 0.25
+ (fSampleNegXZerY - fSamplePosXZerY) * 0.5
+ (fSampleNegXPosY - fSamplePosXPosY) * 0.25;
vEdge.y = (fSampleNegXNegY - fSampleNegXPosY) * 0.25
+ (fSampleZerXNegY - fSampleZerXPosY) * 0.5
+ (fSamplePosXNegY - fSamplePosXPosY) * 0.25;
result.vNormal = normalize(vec3(vEdge * fNormalScale, 1.0));
return result;
}
out vec4 fragColor;
void main()
{
vec2 uv = fragCoord.xy / u_resolution.xy;
C_Sample materialSample;
float fNormalScale = 10.0;
materialSample = SampleMaterial( uv, u_texture, u_resolution.xy, fNormalScale );
// Random Lighting...
float fLightHeight = 0.2;
float fViewHeight = 2.0;
vec3 vSurfacePos = vec3(uv, 0.0);
vec3 vViewPos = vec3(0.5, 0.5, fViewHeight);
vec3 vLightPos = vec3( vec2(sin(u_time),cos(u_time)) * 0.25 + 0.5 , fLightHeight);
if( u_mouse.z > 0.0 )
{
vLightPos = vec3(u_mouse.xy / u_resolution.xy, fLightHeight);
}
vec3 vDirToView = normalize( vViewPos - vSurfacePos );
vec3 vDirToLight = normalize( vLightPos - vSurfacePos );
float fNDotL = clamp( dot(materialSample.vNormal, vDirToLight), 0.0, 1.0);
float fDiffuse = fNDotL;
vec3 vHalf = normalize( vDirToView + vDirToLight );
float fNDotH = clamp( dot(materialSample.vNormal, vHalf), 0.0, 1.0);
float fSpec = pow(fNDotH, 10.0) * fNDotL * 0.5;
vec3 vResult = materialSample.vAlbedo * fDiffuse + fSpec;
vResult = sqrt(vResult);
#ifdef SHOW_NORMAL_MAP
vResult = materialSample.vNormal * 0.5 + 0.5;
#endif
#ifdef SHOW_ALBEDO
vResult = sqrt(materialSample.vAlbedo);
#endif
fragColor = vec4(vResult,1.0);
}