mirror of
https://github.com/X0nk/Bliss-Shader.git
synced 2025-06-22 00:37:35 +08:00
kinda working
This commit is contained in:
@ -9,23 +9,8 @@ layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
|
||||
const ivec3 workGroups = ivec3(4, 5, 1);
|
||||
|
||||
#ifdef IS_LPV_ENABLED
|
||||
#include "/lib/blocks.glsl"
|
||||
#include "/lib/lpv_blocks.glsl"
|
||||
|
||||
|
||||
vec3 GetSceneLightColor(const in uint blockId) {
|
||||
if (blockId == 10005) return vec3(1.0);
|
||||
return vec3(0.0);
|
||||
}
|
||||
|
||||
float GetSceneLightRange(const in uint blockId) {
|
||||
if (blockId == 10005) return 12.0;
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
void GetLpvBlockMask(const in uint blockId, out float mixWeight, out uint mixMask) {
|
||||
mixWeight = 0.0;
|
||||
mixMask = 0xFFFF;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@ -34,25 +19,38 @@ void main() {
|
||||
uint blockId = uint(gl_GlobalInvocationID.x + gl_GlobalInvocationID.y * 32);
|
||||
//if (blockId >= 1280) return;
|
||||
|
||||
vec3 lightColor = vec3(0.0);
|
||||
float lightRange = 0.0;
|
||||
float mixWeight = 0.0;
|
||||
uint mixMask = 0xFFFF;
|
||||
|
||||
switch (blockId) {
|
||||
case BLOCK_GLOWSTONE:
|
||||
lightColor = vec3(0.8, 0.7, 0.1);
|
||||
lightRange = 15.0;
|
||||
break;
|
||||
case BLOCK_REDSTONE_TORCH:
|
||||
lightColor = vec3(1.0, 0.1, 0.1);
|
||||
lightRange = 7.0;
|
||||
break;
|
||||
case BLOCK_SEA_LANTERN:
|
||||
lightColor = vec3(1.0);
|
||||
lightRange = 15.0;
|
||||
break;
|
||||
case BLOCK_SOUL_TORCH:
|
||||
lightColor = vec3(0.1, 0.6, 1.0);
|
||||
lightRange = 10.0;
|
||||
break;
|
||||
case BLOCK_TORCH:
|
||||
lightColor = vec3(1.0, 0.6, 0.1);
|
||||
lightRange = 14.0;
|
||||
break;
|
||||
}
|
||||
|
||||
LpvBlockData block;
|
||||
|
||||
uint mixMask;
|
||||
float mixWeight;
|
||||
GetLpvBlockMask(blockId, mixWeight, mixMask);
|
||||
block.data = BuildBlockLpvData(mixMask, mixWeight);
|
||||
|
||||
// vec3 lightOffset = GetSceneLightOffset(lightType);
|
||||
vec3 lightColor = GetSceneLightColor(blockId);
|
||||
float lightRange = GetSceneLightRange(blockId);
|
||||
float lightSize = 0.0;//GetSceneLightSize(lightType);
|
||||
// bool lightTraced = GetLightTraced(lightType);
|
||||
// bool lightSelfTraced = GetLightSelfTraced(lightType);
|
||||
|
||||
// light.Offset = packSnorm4x8(vec4(lightOffset, 0.0));
|
||||
block.LightColor = packUnorm4x8(vec4(lightColor, 0.0));
|
||||
block.LightRangeSize = packUnorm4x8(vec4(lightRange/255.0, lightSize, 0.0, 0.0));
|
||||
// light.LightMetadata = (lightTraced ? 1u : 0u);
|
||||
// light.LightMetadata |= (lightSelfTraced ? 1u : 0u) << 1u;
|
||||
block.LightRangeSize = packUnorm4x8(vec4(lightRange/255.0, 0.0, 0.0, 0.0));
|
||||
|
||||
LpvBlockMap[blockId] = block;
|
||||
#endif
|
||||
|
@ -50,6 +50,9 @@ uniform int entityId;
|
||||
#include "/lib/bokeh.glsl"
|
||||
|
||||
#ifdef IS_LPV_ENABLED
|
||||
attribute vec3 at_midBlock;
|
||||
uniform int renderStage;
|
||||
|
||||
#include "/lib/voxel_common.glsl"
|
||||
#include "/lib/voxel_write.glsl"
|
||||
#endif
|
||||
@ -185,8 +188,18 @@ void main() {
|
||||
#endif
|
||||
|
||||
#if defined IS_LPV_ENABLED && defined MC_GL_EXT_shader_image_load_store
|
||||
// TODO: limit to blocks; entities later
|
||||
SetVoxelBlock(playerpos, blockId);
|
||||
if (
|
||||
renderStage == MC_RENDER_STAGE_TERRAIN_SOLID ||
|
||||
renderStage == MC_RENDER_STAGE_TERRAIN_CUTOUT ||
|
||||
renderStage == MC_RENDER_STAGE_TERRAIN_CUTOUT_MIPPED ||
|
||||
renderStage == MC_RENDER_STAGE_TERRAIN_TRANSLUCENT
|
||||
) {
|
||||
uint voxelId = blockId;
|
||||
if (voxelId == 0u) voxelId = 1u;
|
||||
|
||||
vec3 origin = playerpos + at_midBlock/64.0;
|
||||
SetVoxelBlock(origin, voxelId);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WAVY_PLANTS
|
||||
|
@ -131,8 +131,8 @@ void main() {
|
||||
if (any(greaterThanEqual(imgCoord, LpvSize3))) return;
|
||||
|
||||
// vec3 viewDir = gbufferModelViewInverse[2].xyz;
|
||||
vec3 lpvCenter = vec3(0.0);//GetLpvCenter(cameraPosition, viewDir);
|
||||
vec3 blockLocalPos = imgCoord - lpvCenter + 0.5;
|
||||
//vec3 lpvCenter = vec3(0.0);//GetLpvCenter(cameraPosition, viewDir);
|
||||
//vec3 blockLocalPos = imgCoord - lpvCenter + 0.5;
|
||||
|
||||
vec4 lightValue = vec4(0.0);
|
||||
uint mixMask = 0xFFFF;
|
||||
@ -161,24 +161,22 @@ void main() {
|
||||
lightValue.rgb = RgbToHsv(lightValue.rgb);
|
||||
lightValue.ba = log2(lightValue.ba + 1.0) / LpvBlockSkyRange;
|
||||
|
||||
#if LIGHTING_MODE >= LIGHTING_MODE_FLOODFILL
|
||||
if (blockId > 0 && blockId != BLOCK_EMPTY) {
|
||||
vec3 lightColor = unpackUnorm4x8(blockData.LightColor).rgb;
|
||||
vec2 lightRangeSize = unpackUnorm4x8(blockData.LightRangeSize).xy;
|
||||
float lightRange = lightRangeSize.x * 255.0;
|
||||
if (blockId > 0 && blockId != BLOCK_EMPTY) {
|
||||
vec3 lightColor = unpackUnorm4x8(blockData.LightColor).rgb;
|
||||
vec2 lightRangeSize = unpackUnorm4x8(blockData.LightRangeSize).xy;
|
||||
float lightRange = lightRangeSize.x * 255.0;
|
||||
|
||||
lightColor = RGBToLinear(lightColor);
|
||||
lightColor = RGBToLinear(lightColor);
|
||||
|
||||
// #ifdef LIGHTING_FLICKER
|
||||
// vec2 lightNoise = GetDynLightNoise(cameraPosition + blockLocalPos);
|
||||
// ApplyLightFlicker(lightColor, lightType, lightNoise);
|
||||
// #endif
|
||||
// #ifdef LIGHTING_FLICKER
|
||||
// vec2 lightNoise = GetDynLightNoise(cameraPosition + blockLocalPos);
|
||||
// ApplyLightFlicker(lightColor, lightType, lightNoise);
|
||||
// #endif
|
||||
|
||||
if (lightRange > EPSILON) {
|
||||
lightValue.rgb = Lpv_RgbToHsv(lightColor, lightRange);
|
||||
}
|
||||
if (lightRange > EPSILON) {
|
||||
lightValue.rgb = Lpv_RgbToHsv(lightColor, lightRange);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (frameCounter % 2 == 0)
|
||||
imageStore(imgLpv1, imgCoord, lightValue);
|
||||
|
Reference in New Issue
Block a user