Update #18 - Final release, added PBR shaders

This commit is contained in:
LAX1DUDE
2023-04-07 16:48:33 -07:00
parent af6d2ffc18
commit b2274a25b0
497 changed files with 28342 additions and 1014 deletions

View File

@ -0,0 +1,120 @@
/*
* Copyright (c) 2023 LAX1DUDE. All Rights Reserved.
*
* WITH THE EXCEPTION OF PATCH FILES, MINIFIED JAVASCRIPT, AND ALL FILES
* NORMALLY FOUND IN AN UNMODIFIED MINECRAFT RESOURCE PACK, YOU ARE NOT ALLOWED
* TO SHARE, DISTRIBUTE, OR REPURPOSE ANY FILE USED BY OR PRODUCED BY THE
* SOFTWARE IN THIS REPOSITORY WITHOUT PRIOR PERMISSION FROM THE PROJECT AUTHOR.
*
* NOT FOR COMMERCIAL OR MALICIOUS USE
*
* (please read the 'LICENSE' file this repo's root directory for more info)
*
*/
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING
#ifndef _HAS_PBR_IMAGE_BASED_LIGHTING_FUNCTION
#define _HAS_PBR_IMAGE_BASED_LIGHTING_FUNCTION
vec3 eaglercraftIBL_NoBlur(in vec3 albedo, in vec3 irradiance, in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec, in vec3 materials) {
if(materials.g < 0.25) {
return albedo * irradiance * 0.1;
}else {
float roughness = 1.0 - materials.r * 0.85;
float NdotV = dot(normalVec, -viewDir);
float fresnel = pow(max(1.0 - NdotV, 0.0), 5.0);
vec3 kD = vec3(0.05);
vec3 F;
if(materials.g < 0.9) {
F = vec3(materials.g + (max(1.0 - roughness, materials.g) - materials.g) * fresnel);
kD = (1.0 - F) * albedo / 3.141592;
}else if(materials.g < 0.964) {
vec2 lutUV = vec2(0.25, (materials.g - 0.9) * 15.625);
vec3 mN = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
lutUV.x += 0.5;
vec3 mK = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
fresnel = 1.0 - fresnel;
mK *= mK;
mK += mN * mN;
vec3 nv = mN * fresnel * 2.0;
fresnel *= fresnel;
vec3 num = mK - nv + fresnel;
vec3 den = mK + nv + fresnel;
vec3 r = num / den;
mK *= fresnel;
mK += 1.0;
num = mK - nv;
den = mK + nv;
r += num / den;
r = clamp(r * 0.5, vec3(0.0), vec3(1.0));
F = r * r;
}else {
F = (1.0 - albedo) + albedo * fresnel;
kD = vec3(0.05);
}
vec2 brdf2f = vec2(max(NdotV, 0.0), roughness);
brdf2f = 1.0 - brdf2f;
brdf2f *= brdf2f;
brdf2f = 1.0 - brdf2f;
brdf2f = textureLod(u_brdfLUT, brdf2f, 0.0).rg;
return kD * albedo * irradiance + envMapSample * (F * brdf2f.r + brdf2f.g);
}
}
#endif
#endif
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_SPECULAR
#ifndef _HAS_PBR_IMAGE_BASED_LIGHTING_SPECULAR_FUNCTION
#define _HAS_PBR_IMAGE_BASED_LIGHTING_SPECULAR_FUNCTION
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_PREFETCH
vec3 eaglercraftIBL_Specular(in vec3 albedo, in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec, in vec3 materials, vec3 metalN, vec3 metalK) {
#else
vec3 eaglercraftIBL_Specular(in vec3 albedo, in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec, in vec3 materials) {
#endif
float NdotV = dot(normalVec, -viewDir);
float roughness = 1.0 - materials.r * 0.85;
float fresnel = pow(max(1.0 - NdotV, 0.0), 5.0);
vec3 F;
if(materials.g < 0.9) {
F = vec3(materials.g + (max(1.0 - roughness, materials.g) - materials.g) * fresnel);
}else if(materials.g < 0.964) {
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_PREFETCH
vec3 mN = metalN;
vec3 mK = metalK;
#else
vec2 lutUV = vec2(0.25, (materials.g - 0.9) * 15.625);
vec3 mN = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
lutUV.x += 0.5;
vec3 mK = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
#endif
fresnel = 1.0 - fresnel;
mK *= mK;
mK += mN * mN;
vec3 nv = mN * fresnel * 2.0;
fresnel *= fresnel;
vec3 num = mK - nv + fresnel;
vec3 den = mK + nv + fresnel;
vec3 r = num / den;
mK *= fresnel;
mK += 1.0;
num = mK - nv;
den = mK + nv;
r += num / den;
r = clamp(r * 0.5, vec3(0.0), vec3(1.0));
F = r * r;
}else {
F = (1.0 - albedo) + albedo * fresnel;
}
vec2 brdf2f = vec2(max(NdotV, 0.0), roughness);
brdf2f = 1.0 - brdf2f;
brdf2f *= brdf2f;
brdf2f = 1.0 - brdf2f;
brdf2f = textureLod(u_brdfLUT, brdf2f, 0.0).rg;
return envMapSample * (F * brdf2f.r + brdf2f.g);
}
#endif
#endif

View File

@ -0,0 +1,86 @@
/*
* Copyright (c) 2023 LAX1DUDE. All Rights Reserved.
*
* WITH THE EXCEPTION OF PATCH FILES, MINIFIED JAVASCRIPT, AND ALL FILES
* NORMALLY FOUND IN AN UNMODIFIED MINECRAFT RESOURCE PACK, YOU ARE NOT ALLOWED
* TO SHARE, DISTRIBUTE, OR REPURPOSE ANY FILE USED BY OR PRODUCED BY THE
* SOFTWARE IN THIS REPOSITORY WITHOUT PRIOR PERMISSION FROM THE PROJECT AUTHOR.
*
* NOT FOR COMMERCIAL OR MALICIOUS USE
*
* (please read the 'LICENSE' file this repo's root directory for more info)
*
*/
#ifdef LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#ifndef _HAS_PBR_LIGHTING_FUNCTION
#define _HAS_PBR_LIGHTING_FUNCTION
#ifdef LIB_INCLUDE_PBR_LIGHTING_PREFETCH
#define PREFETCH_METALS(albedo, materialG1f, metalN3f, metalK3f)\
if(materialG1f >= 0.9 && materialG1f < 0.964) {\
metalK3f.xy = vec2(0.25, (materialG1f - 0.9) * 15.625);\
metalN3f = textureLod(u_metalsLUT, metalK3f.xy, 0.0).rgb;\
metalK3f.x += 0.5;\
metalK3f = textureLod(u_metalsLUT, metalK3f.xy, 0.0).rgb;\
}
#endif
#ifdef LIB_INCLUDE_PBR_LIGHTING_PREFETCH
vec3 eaglercraftLighting(in vec3 albedo, in vec3 radiance, in vec3 viewDir, in vec3 lightDir, in vec3 normalVec, in vec3 materials, in vec3 metalN, in vec3 metalK) {
#else
vec3 eaglercraftLighting(in vec3 albedo, in vec3 radiance, in vec3 viewDir, in vec3 lightDir, in vec3 normalVec, in vec3 materials) {
#endif
float roughness = 1.0 - materials.r * 0.85;
vec3 H = normalize(viewDir + lightDir);
vec3 NdotHVL = max(normalVec * mat3(H, viewDir, lightDir), vec3(0.0));
float NDF = roughness * roughness;
NDF *= NDF;
float denom = NdotHVL.x * NdotHVL.x * (NDF - 1.0) + 1.0;
NDF /= denom * denom * 3.141592;
float gs = roughness + 1.0;
gs *= gs * 0.125;
vec2 Ndot = NdotHVL.yz;
Ndot /= Ndot * (1.0 - gs) + gs;
NDF *= Ndot.x * Ndot.y;
float fresnel = pow(max(1.0 - NdotHVL.x, 0.0), 5.0);
vec3 kD = vec3(0.03);
vec3 F;
if(materials.g < 0.9) {
F = vec3(materials.g + (1.0 - materials.g) * fresnel);
kD = (1.0 - F) * albedo / 3.141592;
}else if(materials.g < 0.964) {
#ifdef LIB_INCLUDE_PBR_LIGHTING_PREFETCH
vec3 mN = metalN;
vec3 mK = metalK;
#else
vec2 lutUV = vec2(0.25, (materials.g - 0.9) * 15.625);
vec3 mN = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
lutUV.x += 0.5;
vec3 mK = textureLod(u_metalsLUT, lutUV, 0.0).rgb * length(albedo);
#endif
fresnel = 1.0 - fresnel;
mK *= mK;
mK += mN * mN;
vec3 nv = mN * fresnel * 2.0;
fresnel *= fresnel;
vec3 num = mK - nv + fresnel;
vec3 den = mK + nv + fresnel;
vec3 r = num / den;
mK *= fresnel;
mK += 1.0;
num = mK - nv;
den = mK + nv;
r += num / den;
r = clamp(r * 0.5, vec3(0.0), vec3(1.0));
F = r * r;
}else {
F = albedo + (1.0 - albedo) * fresnel;
}
denom = 4.0 * NdotHVL.y * NdotHVL.z + 0.0001;
return (kD + (NDF * F / denom)) * radiance * NdotHVL.z;
}
#endif
#endif

View File

@ -0,0 +1,218 @@
/*
* Copyright (c) 2023 LAX1DUDE. All Rights Reserved.
*
* WITH THE EXCEPTION OF PATCH FILES, MINIFIED JAVASCRIPT, AND ALL FILES
* NORMALLY FOUND IN AN UNMODIFIED MINECRAFT RESOURCE PACK, YOU ARE NOT ALLOWED
* TO SHARE, DISTRIBUTE, OR REPURPOSE ANY FILE USED BY OR PRODUCED BY THE
* SOFTWARE IN THIS REPOSITORY WITHOUT PRIOR PERMISSION FROM THE PROJECT AUTHOR.
*
* NOT FOR COMMERCIAL OR MALICIOUS USE
*
* (please read the 'LICENSE' file this repo's root directory for more info)
*
*/
#ifdef LIB_INCLUDE_WAVING_BLOCKS_FUNCTION
#ifndef _HAS_INCLUDED_WAVING_BLOCKS
#define _HAS_INCLUDED_WAVING_BLOCKS
#define _WAVING_BLOCK_TYPE_LEAF_BLOCK 1
#define _WAVING_BLOCK_TYPE_LEAF_BLOCK_F 1.0
#define _WAVING_BLOCK_TYPE_TALL_GRASS 2
#define _WAVING_BLOCK_TYPE_TALL_GRASS_F 2.0
#define _WAVING_BLOCK_TYPE_CROPS 3
#define _WAVING_BLOCK_TYPE_CROPS_F 3.0
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM 4
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM_F 4.0
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_TOP 5
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_TOP_F 5.0
#define _WAVING_BLOCK_TYPE_PLANT 6
#define _WAVING_BLOCK_TYPE_PLANT_F 6.0
#define _WAVING_BLOCK_TYPE_SUGARCANE 7
#define _WAVING_BLOCK_TYPE_SUGARCANE_F 7.0
#define _WAVING_BLOCK_TYPE_VINES 8
#define _WAVING_BLOCK_TYPE_VINES_F 8.0
#define _WAVING_BLOCK_TYPE_WATER_STILL 9
#define _WAVING_BLOCK_TYPE_WATER_STILL_F 9.0
#define _WAVING_BLOCK_TYPE_WATER_FLOW 10
#define _WAVING_BLOCK_TYPE_WATER_FLOW_F 10.0
#define _WAVING_BLOCK_TYPE_LILYPAD 11
#define _WAVING_BLOCK_TYPE_LILYPAD_F 11.0
#define _WAVING_BLOCK_TYPE_FIRE_FLOOR 12
#define _WAVING_BLOCK_TYPE_FIRE_FLOOR_F 12.0
#define _WAVING_BLOCK_TYPE_FIRE_WALL 13
#define _WAVING_BLOCK_TYPE_FIRE_WALL_F 13.0
// ignore wall fire for now, they clip
#define _WAVING_BLOCK_MIN _WAVING_BLOCK_TYPE_LEAF_BLOCK_F
#define _WAVING_BLOCK_MAX _WAVING_BLOCK_TYPE_FIRE_FLOOR_F
#ifndef FAKE_SIN
#error the FAKE_SIN function must be defined to use waving blocks
#endif
#define _WAVING_BLOCK_COORD_DERIVE_HACK 0.001
#define _WAVING_BLOCK_COORD_DERIVE_HACK_05 0.0005
#define _WAVING_BLOCK_COORD_DERIVE_HACK_INV 1000.0
vec3 _computeWavingBlockNoise(in vec3 pos, in vec3 amp1, in float timer) {
float fac, fac2;
fac = dot(vec4(pos, timer), vec4(0.5, 0.5, 0.5, 0.0027));
FAKE_SIN(fac, fac2)
fac2 *= 0.04;
fac2 += 0.04;
vec3 vf0, d0;
vf0 = timer * vec3(0.0127, 0.0089, 0.0114);
FAKE_SIN(vf0, d0);
d0.xyz += d0.yzx;
d0.xyz += timer * vec3(0.0063, 0.0224, 0.0015);
d0.y += pos.z;
d0.xz += pos.y;
d0.xz += pos.zx;
d0.xz -= pos.xz;
vec3 ret;
FAKE_SIN(d0, ret)
ret *= fac2;
return ret * amp1;
}
vec3 _computeWavingBlockNoise(in vec3 pos, in vec3 vf_a, in vec3 vf_b, in vec3 amp1, in vec3 amp2, in float timer) {
float fac, fac2;
fac = dot(vec4(pos, timer), vec4(0.5, 0.5, 0.5, 0.0027));
FAKE_SIN(fac, fac2)
fac2 *= 0.04;
fac2 += 0.04;
vec3 vf0, d0;
vf0 = timer * vec3(0.0127, 0.0089, 0.0114);
FAKE_SIN(vf0, d0);
d0.xyz += d0.yzx;
d0.xyz += timer * vec3(0.0063, 0.0224, 0.0015);
d0.y += pos.z;
d0.xz += pos.y;
d0.xz += pos.zx;
d0.xz -= pos.xz;
vec3 ret;
FAKE_SIN(d0, ret)
ret *= fac2;
vec3 move = ret * amp1;
vec3 pos2 = move + pos;
fac = dot(vec4(pos2, timer), vec4(0.5, 0.5, 0.5, 0.0027));
FAKE_SIN(fac, fac2)
fac2 *= 0.04;
fac2 += 0.04;
vf0 = timer * vf_a;
FAKE_SIN(vf0, d0);
d0.xyz += d0.yzx;
d0.xyz += timer * vf_b;
d0.y += pos2.z;
d0.xz += pos2.y;
d0.xz += pos2.zx;
d0.xz -= pos2.xz;
FAKE_SIN(d0, ret)
ret *= fac2;
move += ret * amp2;
return move;
}
vec3 _computeWavingBlockById(in vec3 realPos, in vec3 referencePos, in vec4 wavingBlockParam, in float type) {
int typeInt = int(type);
highp float refY, fractY1, fractY2;
refY = referencePos.y;
switch(typeInt) {
case _WAVING_BLOCK_TYPE_CROPS:
refY += 0.0625625;
case _WAVING_BLOCK_TYPE_TALL_GRASS:
case _WAVING_BLOCK_TYPE_PLANT:
case _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM:
case _WAVING_BLOCK_TYPE_FIRE_FLOOR:
// check if it is the bottom half of the block,
// if vertex is at Y = 0.0 then don't offset
fractY1 = fract(refY + _WAVING_BLOCK_COORD_DERIVE_HACK_05);
fractY2 = fract(refY - _WAVING_BLOCK_COORD_DERIVE_HACK_05);
if(fractY2 > fractY1) {
return vec3(0.0);
}
default:
break;
}
vec3 ret = vec3(0.0);
switch(typeInt) {
case _WAVING_BLOCK_TYPE_LEAF_BLOCK:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0040, 0.0064, 0.0043),
vec3(0.0035, 0.0037, 0.0041),
vec3(1.0, 0.2, 1.0),
vec3(0.5, 0.1, 0.5),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_TALL_GRASS:
case _WAVING_BLOCK_TYPE_CROPS:
ret = _computeWavingBlockNoise(
referencePos,
vec3(1.0, 0.2, 1.0),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_PLANT:
case _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM:
case _WAVING_BLOCK_TYPE_DOUBLE_PLANT_TOP:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0041, 0.007, 0.0044),
vec3(0.0038, 0.024, 0.0),
vec3(0.8, 0.0, 0.8),
vec3(0.4, 0.0, 0.4),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_SUGARCANE:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.3, 0.0, 0.3),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_VINES:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0040, 0.0064, 0.0043),
vec3(0.0035, 0.0037, 0.0041),
vec3(0.5, 0.3, 0.5),
vec3(0.25, 0.2, 0.25),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_WATER_STILL:
break;
case _WAVING_BLOCK_TYPE_WATER_FLOW:
break;
case _WAVING_BLOCK_TYPE_FIRE_FLOOR:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0105, 0.0096, 0.0087),
vec3(0.0063, 0.0097, 0.0156),
vec3(1.2, 0.4, 1.2),
vec3(0.8, 0.8, 0.8),
wavingBlockParam.y);
break;
default:
break;
}
return ret;
}
#define COMPUTE_WAVING_BLOCKS(pos4f, amount, range, block1f, modelMatrix, viewMatrix, modelViewMatrix, wavingBlockOffset, wavingBlockParam)\
if(block1f >= _WAVING_BLOCK_MIN && block1f <= _WAVING_BLOCK_MAX) {\
pos4f = modelMatrix * pos4f;\
pos4f.xyz /= pos4f.w;\
pos4f.w = 1.0;\
if(dot(pos4f.xyz, pos4f.xyz) < range * range) {\
pos4f.xyz += _computeWavingBlockById(pos4f.xyz, pos4f.xyz + wavingBlockOffset, wavingBlockParam, block1f) * amount;\
}\
pos4f = viewMatrix * pos4f;\
}else {\
pos4f = modelViewMatrix * pos4f;\
}
#endif
#endif