Render Fragment
Render Fragment
// This signals the loading code to prepend either #version 100 or #version 300 es
as apropriate.
#include "fragmentVersionCentroid.h"
#include "uniformWorldConstants.h"
UNIFORM vec3 VIEW_POS;
UNIFORM highp float TIME;
UNIFORM vec4 FOG_COLOR;
UNIFORM vec2 FOG_CONTROL;
UNIFORM float RENDER_DISTANCE;
UNIFORM float FAR_CHUNKS_DISTANCE;
#include "uniformShaderConstants.h"
#include "uniformRenderChunkConstants.h"
#include "util.h"
float inrect(vec2 pos, float x1, float y1, float x2, float y2, float focus){
return min(1.0, max(min(min(pos.x - x1, x2 - pos.x), min(pos.y - y1, y2 - pos.y)),
0.0) / focus);
}
float playershadow(){
vec3 lookvector=position;
lookvector.x*=1.8;
vec3 pos = lookvector + vec3(0.4, 0.4, 0.4);
vec3 dir = vec3(-1.0, (1.25) * 0.31, 0.0);
float factor = 1.0;
if (pos.x < 0.2){
factor = max(0.0, pos.x / 0.4 + 0.5);
}
pos += dir * pos.x;
float focus = .04;
float footwalk = sin((position.x - lookvector.x) * 2.0 + (position.z -
lookvector.z) * 2.0);
float handswalk = sin((position.x - lookvector.x) * 2.0 + (position.z -
lookvector.z)) * .5;
pos.yz -= vec2(.2, .4);
float body = max(inrect(pos.yz, -1.5 + footwalk*.4, -0.25, 0.75, .1, focus),
inrect(pos.yz, -1.5 - footwalk*.4, -.1, 0.75, 0.25, focus));
float hands = max(inrect(pos.yz, -0.5 + footwalk * .1, -0.5, 0.25, .1, focus),
inrect(pos.yz, -0.5 - footwalk * 0.1, -.1, 0.25, 0.5, focus));
return min(1.0, max(body, hands)) * factor;
}
#ifdef FOG
varying vec4 fogColor;
#endif
x=x*(A*x+B)/(x*(C*x+D)+E/F);
return (x-dot(x,vec3(0.1)))*1.5+0.05;}
float filmic_curve(float x) {
float A = 0.22;
float B = 0.5;
float C = 3.0;
float D = 0.5;
float E = 0.02;
float F = 0.5;
return ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F;
}
return clr;
}
void main()
{
#ifdef BYPASS_PIXEL_SHADER
gl_FragColor = vec4(0, 0, 0, 0);
return;
#else
#if USE_TEXEL_AA
highp vec4 diffuse = texture2D_AA(TEXTURE_0, uv0);
highp vec4 dxm = texture2D_AA( TEXTURE_0, vec2(uv0.x-0.1 * fact, uv0.y) );
highp vec4 dym = texture2D_AA( TEXTURE_0, vec2(uv0.x, uv0.y-0.1 * fact) );
#else
highp vec4 diffuse = texture2D(TEXTURE_0, uv0);
highp vec4 dxm = texture2D( TEXTURE_0, vec2(uv0.x-0.1 * fact, uv0.y) );
highp vec4 dym = texture2D( TEXTURE_0, vec2(uv0.x, uv0.y-0.2 * fact) );
#endif
#ifdef SEASONS_FAR
diffuse.a = 1.0;
#endif
#if USE_ALPHA_TEST
#ifdef ALPHA_TO_COVERAGE
#define ALPHA_THRESHOLD 0.05
#else
#define ALPHA_THRESHOLD 0.5
#endif
if(diffuse.a < ALPHA_THRESHOLD)
discard;
#endif
#ifdef BLEND
#else
#ifdef ALPHA_TEST
if((lp.x < 0.5 && -lp.x < 0.5 && lp.y < 0.5)){
diffuse.b = mix(diffuse.b * 1.0, diffuse.b / 1.4, pow(uv1.x, 5.5));
diffuse.rgb *= vec3(0.30);
}
#else
if((lp.x < 0.5 && -lp.x < 0.5 && lp.y < 0.5)){
diffuse.b = mix(diffuse.b * 1.0, diffuse.b / 1.4, pow(uv1.x, 5.5));
diffuse.rgb *= vec3(0.25);
}
#endif
#endif
#ifdef BLEND
#else
#ifdef ALPHA_TEST
#ifdef BLEND
#else
#ifdef ALPHA_TEST
}
}
#if defined(BLEND)
diffuse.a *= inColor.a;
#endif
#if !defined(ALWAYS_LIT)
diffuse *= texture2D( TEXTURE_1, uv1 );
#endif
#ifndef SEASONS
#if !USE_ALPHA_TEST && !defined(BLEND)
diffuse.a = inColor.a;
#endif
diffuse.rgb *= inColor.rgb;
#else
vec2 uv = inColor.xy;
diffuse.rgb *= mix(vec3(1.0,1.0,1.0), texture2D( TEXTURE_2, uv).rgb*2.0,
inColor.b);
diffuse.rgb *= inColor.aaa;
diffuse.a = 1.0;
#endif
//PHAN_CHIEU_MAT_TROI
//NUOC_CHUYEN_DONG
#ifdef BLEND
if(color.b > color.r){
diffuse = mix(diffuse,water_color,pow(nuoc_chuyen_dong/5.0, 1.5));
#ifdef BLEND
if(inColor.b > inColor.r){
diffuse.a *= 1.5;
}
#endif
#ifdef ALPHA_TEST
#endif
//ALPHA TEST
//day
if(time_ >= 0.3){
if(FOG_CONTROL.x < 0.55){
#ifdef FOG
#ifdef ALPHA_TEST
diffuse.rgb = RainSaturation(diffuse.rgb);
diffuse.rgb*= 4.0;
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.x + position.y,diffuse.rgb+0.1)*0.6;}
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.z + position.x,diffuse.rgb+0.1)*0.6;}
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.x - position.y,diffuse.rgb+0.1)*0.6;}
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.z - position.x,diffuse.rgb+0.1)*0.6;}
#endif
#endif
}
}
//night
diffuse.rgb*= 0.6;
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.x + position.y,diffuse.rgb+0.2)*1.5;}
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.z + position.x,diffuse.rgb+0.2)*1.5;}
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.x - position.y,diffuse.rgb+0.2)*1.5;}
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.z - position.x,diffuse.rgb+0.2)*1.5;}
if(uv1.y > 0.8210 && diffuse.r > 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.x + position.y,diffuse.rgb+0.5)*1.0;}
if(uv1.y > 0.8210 && diffuse.r > 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.z + position.x,diffuse.rgb+0.5)*1.0;}
if(uv1.y > 0.8210 && diffuse.r > 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.x - position.y,diffuse.rgb+0.5)*1.0;}
if(uv1.y > 0.8210 && diffuse.r > 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.z - position.x,diffuse.rgb+0.5)*1.0;}
#endif
#endif
}
}
//BLEND
//day
if(time_ >= 0.4){
if(FOG_CONTROL.x < 0.55){
#ifdef FOG
#ifdef BLEND
diffuse.rgb += ray_sun(look + position.x,diffuse.rgb+0.8)*0.5;
#else
#ifdef ALPHA_TEST
#else
diffuse.rgb = RainSaturation(diffuse.rgb);
diffuse.rgb*= 2.0;
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.x + position.z,diffuse.rgb+0.35)*0.6;}
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.z + position.x,diffuse.rgb+0.35)*0.6;}
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.x - position.z,diffuse.rgb+0.35)*0.6;}
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.z - position.x,diffuse.rgb+0.35)*0.6;}
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.x + position.z,diffuse.rgb+0.03)*1.4;}
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.z + position.x,diffuse.rgb+0.03)*1.4;}
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.x - position.z,diffuse.rgb+0.03)*1.4;}
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.z - position.x,diffuse.rgb+0.03)*1.4;}
#endif
#endif
#endif
}
}
//night
if(time_ <= 0.4){
if(FOG_CONTROL.x < 0.55){
#ifdef FOG
#ifdef BLEND
diffuse.rgb += ray_sun(look + position.x,diffuse.rgb+0.8)*0.5;
#else
#ifdef ALPHA_TEST
#else
diffuse.rgb*= 1.0;
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.x + position.z,diffuse.rgb+0.35)*0.4;}
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.z + position.x,diffuse.rgb+0.35)*0.4;}
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.x - position.z,diffuse.rgb+0.35)*0.4;}
if(uv1.y > 0.8210 && diffuse.r < 0.2 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.z - position.x,diffuse.rgb+0.35)*0.4;}
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.x + position.z,diffuse.rgb+0.03)*1.2;}
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look + position.z + position.x,diffuse.rgb+0.03)*1.2;}
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.x - position.z,diffuse.rgb+0.03)*1.2;}
if(uv1.y > 0.8210 && diffuse.r > 0.3 && lp.y > 0.5){
diffuse.rgb += ray_sun(look - position.z - position.x,diffuse.rgb+0.03)*1.2;}
#endif
#endif
#endif
}
}
#ifdef BLEND
diffuse.rgb += ray_sun(look + position.x,diffuse.rgb+0.8)*0.5;
#else
#ifdef ALPHA_TEST
#else
#endif
#endif
#ifdef BLEND
highp float sp1 = 0.5;
highp float sp2 = 1.5;
highp vec3 N = normalize(cross(dFdx(look),dFdy(look)));
highp vec3 viewDir = normalize(vec3(-4,1,0) - look);
highp vec3 reflectDir = reflect(-viewDir, N);
highp float spec = pow(max(dot(reflectDir, N), 0.0),5.0);
diffuse.rgb += sp1 *spec *sp2;
#endif
//nether 0.1
if((FOG_CONTROL.x == 0.1)){
diffuse.rgb = mix(diffuse.rgb, vec3(1.5)*FOG_COLOR.rgb*1.5, far*6.0);
diffuse.rgb *= 3.0;
}
//underwater 0.02
if((FOG_CONTROL.x == 0.02)){
highp vec3 torchinwater = vec3(2.1, 0.6, -0.6) * 0.8;
diffuse.rgb += diffuse.rgb*vec3(torchinwater)*pow(uv1.x*1.10,5.1);
}
//reflection underground
if((FOG_CONTROL.x == 0.02)){
#ifdef BLEND
diffuse.rgb += ray_sun(look + position.x,diffuse.rgb+0.8)*0.5;
#else
#ifdef ALPHA_TEST
#else
#endif
#endif
}
//day
#ifdef BLEND
if((color.b > color.r && time_ >= 0.6)){
diffuse.rgb*= watercolorday;}
#endif
//sunrise
#ifdef BLEND
if((color.b > color.r && time_ > 0.005 && time_ <= 0.6)){
diffuse.rgb*= watercolorsunrise;}
#endif
//night
#ifdef BLEND
if((color.b > color.r && time_ < 0.005)){
diffuse.rgb*= watercolornight;}
#endif
//shadows
float uY = uv1.y;
vec2 uvl=uv1;
uvl.y-=playershadow()*.6;
diffuse *= texture2D(TEXTURE_1, uvl);
if((uY<= 0.8751)){
diffuse.rgb*= shadowColor;}
//colorcycle
//fog cycle
// day
// sunrise
// night
//tonemapping
if((FOG_CONTROL.x > 0.15)){
diffuse.rgb = toneMap(diffuse.rgb)*1.0;
}
#ifdef FOG
diffuse.rgb = mix( diffuse.rgb, fogColor.rgb, fogColor.a );
#endif
gl_FragColor = diffuse;
#endif // BYPASS_PIXEL_SHADER
}