mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2025-02-22 09:55:33 +01:00
8 moments
- Use 8 power moments - Fix compile errors with trig moments
This commit is contained in:
parent
cb87961b19
commit
4eba43b2d6
8 changed files with 104 additions and 68 deletions
|
@ -12,5 +12,6 @@ public class Samplers {
|
||||||
public static final GlTextureUnit LIGHT_SECTIONS = GlTextureUnit.T6;
|
public static final GlTextureUnit LIGHT_SECTIONS = GlTextureUnit.T6;
|
||||||
|
|
||||||
public static final GlTextureUnit ZEROTH_MOMENT = GlTextureUnit.T7;
|
public static final GlTextureUnit ZEROTH_MOMENT = GlTextureUnit.T7;
|
||||||
public static final GlTextureUnit MOMENTS = GlTextureUnit.T8;
|
public static final GlTextureUnit MOMENTS0 = GlTextureUnit.T8;
|
||||||
|
public static final GlTextureUnit MOMENTS1 = GlTextureUnit.T9;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import dev.engine_room.flywheel.backend.Samplers;
|
||||||
import dev.engine_room.flywheel.backend.compile.IndirectPrograms;
|
import dev.engine_room.flywheel.backend.compile.IndirectPrograms;
|
||||||
import dev.engine_room.flywheel.backend.gl.GlTextureUnit;
|
import dev.engine_room.flywheel.backend.gl.GlTextureUnit;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.util.Mth;
|
||||||
|
|
||||||
public class MboitFramebuffer {
|
public class MboitFramebuffer {
|
||||||
|
|
||||||
|
@ -18,7 +19,8 @@ public class MboitFramebuffer {
|
||||||
private final int vao;
|
private final int vao;
|
||||||
|
|
||||||
public int zerothMoment;
|
public int zerothMoment;
|
||||||
public int moments;
|
public int moments0;
|
||||||
|
public int moments1;
|
||||||
public int accumulate;
|
public int accumulate;
|
||||||
|
|
||||||
private int lastWidth = -1;
|
private int lastWidth = -1;
|
||||||
|
@ -44,10 +46,11 @@ public class MboitFramebuffer {
|
||||||
|
|
||||||
GL46.glNamedFramebufferTexture(fbo, GL46.GL_DEPTH_ATTACHMENT, mainRenderTarget.getDepthTextureId(), 0);
|
GL46.glNamedFramebufferTexture(fbo, GL46.GL_DEPTH_ATTACHMENT, mainRenderTarget.getDepthTextureId(), 0);
|
||||||
|
|
||||||
GL46.glNamedFramebufferDrawBuffers(fbo, new int[]{GL46.GL_COLOR_ATTACHMENT0, GL46.GL_COLOR_ATTACHMENT1});
|
GL46.glNamedFramebufferDrawBuffers(fbo, new int[]{GL46.GL_COLOR_ATTACHMENT0, GL46.GL_COLOR_ATTACHMENT1, GL46.GL_COLOR_ATTACHMENT2});
|
||||||
|
|
||||||
GL46.glClearNamedFramebufferfv(fbo, GL46.GL_COLOR, 0, new float[]{0, 0, 0, 0});
|
GL46.glClearNamedFramebufferfv(fbo, GL46.GL_COLOR, 0, new float[]{0, 0, 0, 0});
|
||||||
GL46.glClearNamedFramebufferfv(fbo, GL46.GL_COLOR, 1, new float[]{0, 0, 0, 0});
|
GL46.glClearNamedFramebufferfv(fbo, GL46.GL_COLOR, 1, new float[]{0, 0, 0, 0});
|
||||||
|
GL46.glClearNamedFramebufferfv(fbo, GL46.GL_COLOR, 2, new float[]{0, 0, 0, 0});
|
||||||
|
|
||||||
GlStateManager._glBindFramebuffer(GL46.GL_FRAMEBUFFER, fbo);
|
GlStateManager._glBindFramebuffer(GL46.GL_FRAMEBUFFER, fbo);
|
||||||
}
|
}
|
||||||
|
@ -62,10 +65,13 @@ public class MboitFramebuffer {
|
||||||
Samplers.ZEROTH_MOMENT.makeActive();
|
Samplers.ZEROTH_MOMENT.makeActive();
|
||||||
GlStateManager._bindTexture(zerothMoment);
|
GlStateManager._bindTexture(zerothMoment);
|
||||||
|
|
||||||
Samplers.MOMENTS.makeActive();
|
Samplers.MOMENTS0.makeActive();
|
||||||
GlStateManager._bindTexture(moments);
|
GlStateManager._bindTexture(moments0);
|
||||||
|
|
||||||
GL46.glNamedFramebufferDrawBuffers(fbo, new int[]{GL46.GL_COLOR_ATTACHMENT2});
|
Samplers.MOMENTS1.makeActive();
|
||||||
|
GlStateManager._bindTexture(moments1);
|
||||||
|
|
||||||
|
GL46.glNamedFramebufferDrawBuffers(fbo, new int[]{GL46.GL_COLOR_ATTACHMENT3});
|
||||||
|
|
||||||
GL46.glClearNamedFramebufferfv(fbo, GL46.GL_COLOR, 0, new float[]{0, 0, 0, 0});
|
GL46.glClearNamedFramebufferfv(fbo, GL46.GL_COLOR, 0, new float[]{0, 0, 0, 0});
|
||||||
|
|
||||||
|
@ -100,13 +106,18 @@ public class MboitFramebuffer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void delete() {
|
public void delete() {
|
||||||
GL46.glDeleteTextures(zerothMoment);
|
deleteTextures();
|
||||||
GL46.glDeleteTextures(moments);
|
|
||||||
GL46.glDeleteTextures(accumulate);
|
|
||||||
GL46.glDeleteFramebuffers(fbo);
|
GL46.glDeleteFramebuffers(fbo);
|
||||||
GL46.glDeleteVertexArrays(vao);
|
GL46.glDeleteVertexArrays(vao);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void deleteTextures() {
|
||||||
|
GL46.glDeleteTextures(zerothMoment);
|
||||||
|
GL46.glDeleteTextures(moments0);
|
||||||
|
GL46.glDeleteTextures(moments1);
|
||||||
|
GL46.glDeleteTextures(accumulate);
|
||||||
|
}
|
||||||
|
|
||||||
private void createTextures(int width, int height) {
|
private void createTextures(int width, int height) {
|
||||||
if (lastWidth == width && lastHeight == height) {
|
if (lastWidth == width && lastHeight == height) {
|
||||||
return;
|
return;
|
||||||
|
@ -115,16 +126,17 @@ public class MboitFramebuffer {
|
||||||
lastWidth = width;
|
lastWidth = width;
|
||||||
lastHeight = height;
|
lastHeight = height;
|
||||||
|
|
||||||
GL46.glDeleteTextures(zerothMoment);
|
deleteTextures();
|
||||||
GL46.glDeleteTextures(moments);
|
|
||||||
GL46.glDeleteTextures(accumulate);
|
|
||||||
|
|
||||||
zerothMoment = GL46.glCreateTextures(GL46.GL_TEXTURE_2D);
|
zerothMoment = GL46.glCreateTextures(GL46.GL_TEXTURE_2D);
|
||||||
moments = GL46.glCreateTextures(GL46.GL_TEXTURE_2D);
|
moments0 = GL46.glCreateTextures(GL46.GL_TEXTURE_2D);
|
||||||
|
moments1 = GL46.glCreateTextures(GL46.GL_TEXTURE_2D);
|
||||||
accumulate = GL46.glCreateTextures(GL46.GL_TEXTURE_2D);
|
accumulate = GL46.glCreateTextures(GL46.GL_TEXTURE_2D);
|
||||||
|
|
||||||
GL46.glTextureStorage2D(zerothMoment, 1, GL32.GL_R16F, width, height);
|
GL46.glTextureStorage2D(zerothMoment, 1, GL32.GL_R16F, width, height);
|
||||||
GL46.glTextureStorage2D(moments, 1, GL32.GL_RGBA16F, width, height);
|
GL46.glTextureStorage2D(moments0, 1, GL32.GL_RGBA16F, width, height);
|
||||||
|
GL46.glTextureStorage2D(moments1, 1, GL32.GL_RGBA16F, width, height);
|
||||||
|
|
||||||
GL46.glTextureStorage2D(accumulate, 1, GL32.GL_RGBA16F, width, height);
|
GL46.glTextureStorage2D(accumulate, 1, GL32.GL_RGBA16F, width, height);
|
||||||
|
|
||||||
// for (int tex : new int[]{zerothMoment, moments, composite}) {
|
// for (int tex : new int[]{zerothMoment, moments, composite}) {
|
||||||
|
@ -136,7 +148,38 @@ public class MboitFramebuffer {
|
||||||
// }
|
// }
|
||||||
|
|
||||||
GL46.glNamedFramebufferTexture(fbo, GL46.GL_COLOR_ATTACHMENT0, zerothMoment, 0);
|
GL46.glNamedFramebufferTexture(fbo, GL46.GL_COLOR_ATTACHMENT0, zerothMoment, 0);
|
||||||
GL46.glNamedFramebufferTexture(fbo, GL46.GL_COLOR_ATTACHMENT1, moments, 0);
|
GL46.glNamedFramebufferTexture(fbo, GL46.GL_COLOR_ATTACHMENT1, moments0, 0);
|
||||||
GL46.glNamedFramebufferTexture(fbo, GL46.GL_COLOR_ATTACHMENT2, accumulate, 0);
|
GL46.glNamedFramebufferTexture(fbo, GL46.GL_COLOR_ATTACHMENT2, moments1, 0);
|
||||||
|
GL46.glNamedFramebufferTexture(fbo, GL46.GL_COLOR_ATTACHMENT3, accumulate, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float circleToParameter(float angle) {
|
||||||
|
float x = Mth.cos(angle);
|
||||||
|
float y = Mth.sin(angle);
|
||||||
|
float result = Mth.abs(y) - Mth.abs(x);
|
||||||
|
result = (x < 0.0f) ? (2.0f - result) : result;
|
||||||
|
result = (y < 0.0f) ? (6.0f - result) : result;
|
||||||
|
result += (angle >= 2.0f * Mth.PI) ? 8.0f : 0.0f;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void computeWrappingZoneParameters(float[] out) {
|
||||||
|
computeWrappingZoneParameters(out, 0.1f * Mth.PI);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Given an angle in radians providing the size of the wrapping zone, this
|
||||||
|
function computes all constants required by the shader.*/
|
||||||
|
void computeWrappingZoneParameters(float[] p_out_wrapping_zone_parameters, float new_wrapping_zone_angle) {
|
||||||
|
p_out_wrapping_zone_parameters[0] = new_wrapping_zone_angle;
|
||||||
|
p_out_wrapping_zone_parameters[1] = Mth.PI - 0.5f * new_wrapping_zone_angle;
|
||||||
|
if (new_wrapping_zone_angle <= 0.0f) {
|
||||||
|
p_out_wrapping_zone_parameters[2] = 0.0f;
|
||||||
|
p_out_wrapping_zone_parameters[3] = 0.0f;
|
||||||
|
} else {
|
||||||
|
float zone_end_parameter = 7;
|
||||||
|
float zone_begin_parameter = circleToParameter(2.0f * Mth.PI - new_wrapping_zone_angle);
|
||||||
|
p_out_wrapping_zone_parameters[2] = 1.0f / (zone_end_parameter - zone_begin_parameter);
|
||||||
|
p_out_wrapping_zone_parameters[3] = 1.0f - zone_end_parameter * p_out_wrapping_zone_parameters[2];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,8 @@ flat in uvec2 _flw_ids;
|
||||||
#ifdef _FLW_OIT
|
#ifdef _FLW_OIT
|
||||||
#ifdef _FLW_GENERATE_MOMENTS
|
#ifdef _FLW_GENERATE_MOMENTS
|
||||||
layout (location = 0) out float _flw_zerothMoment_out;
|
layout (location = 0) out float _flw_zerothMoment_out;
|
||||||
layout (location = 1) out vec4 _flw_moments_out;
|
layout (location = 1) out vec4 _flw_moments0_out;
|
||||||
|
layout (location = 2) out vec4 _flw_moments1_out;
|
||||||
#endif
|
#endif
|
||||||
#ifdef _FLW_RESOLVE_MOMENTS
|
#ifdef _FLW_RESOLVE_MOMENTS
|
||||||
layout (location = 0) out vec4 _flw_accumulate_out;
|
layout (location = 0) out vec4 _flw_accumulate_out;
|
||||||
|
@ -133,7 +134,7 @@ void _flw_main() {
|
||||||
|
|
||||||
#ifdef _FLW_GENERATE_MOMENTS
|
#ifdef _FLW_GENERATE_MOMENTS
|
||||||
|
|
||||||
generateMoments(depth, 1 - color.a, vec4(0), _flw_zerothMoment_out, _flw_moments_out);
|
generateMoments(depth, 1 - color.a, _flw_zerothMoment_out, _flw_moments0_out, _flw_moments1_out);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef _FLW_RESOLVE_MOMENTS
|
#ifdef _FLW_RESOLVE_MOMENTS
|
||||||
|
|
|
@ -2,6 +2,16 @@
|
||||||
This header defines utility functions to deal with complex numbers and
|
This header defines utility functions to deal with complex numbers and
|
||||||
complex polynomials.*/
|
complex polynomials.*/
|
||||||
|
|
||||||
|
void sincos(float theta, out float s, out float c) {
|
||||||
|
s = sin(theta);
|
||||||
|
c = cos(theta);
|
||||||
|
}
|
||||||
|
|
||||||
|
float saturate(float a) {
|
||||||
|
return clamp(a, 0., 1.);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*! Returns the complex conjugate of the given complex number (i.e. it changes
|
/*! Returns the complex conjugate of the given complex number (i.e. it changes
|
||||||
the sign of the y-component).*/
|
the sign of the y-component).*/
|
||||||
vec2 Conjugate(vec2 Z){
|
vec2 Conjugate(vec2 Z){
|
||||||
|
@ -45,11 +55,11 @@ vec2 Cube(vec2 Z){
|
||||||
\sa SquareRoot() */
|
\sa SquareRoot() */
|
||||||
vec2 SquareRootUnsafe(vec2 Z){
|
vec2 SquareRootUnsafe(vec2 Z){
|
||||||
float ZLengthSq=dot(Z, Z);
|
float ZLengthSq=dot(Z, Z);
|
||||||
float ZLengthInv=rsqrt(ZLengthSq);
|
float ZLengthInv=inversesqrt(ZLengthSq);
|
||||||
vec2 UnnormalizedRoot=Z*ZLengthInv+vec2(1.0f, 0.0f);
|
vec2 UnnormalizedRoot=Z*ZLengthInv+vec2(1.0f, 0.0f);
|
||||||
float UnnormalizedRootLengthSq=dot(UnnormalizedRoot, UnnormalizedRoot);
|
float UnnormalizedRootLengthSq=dot(UnnormalizedRoot, UnnormalizedRoot);
|
||||||
float NormalizationFactorInvSq=UnnormalizedRootLengthSq*ZLengthInv;
|
float NormalizationFactorInvSq=UnnormalizedRootLengthSq*ZLengthInv;
|
||||||
float NormalizationFactor=rsqrt(NormalizationFactorInvSq);
|
float NormalizationFactor=inversesqrt(NormalizationFactorInvSq);
|
||||||
return NormalizationFactor*UnnormalizedRoot;
|
return NormalizationFactor*UnnormalizedRoot;
|
||||||
}
|
}
|
||||||
/*! This utility function computes one square root of the given complex value.
|
/*! This utility function computes one square root of the given complex value.
|
||||||
|
@ -65,7 +75,7 @@ vec2 SquareRoot(vec2 Z){
|
||||||
other roots can be found by multiplication by cubic roots of unity.
|
other roots can be found by multiplication by cubic roots of unity.
|
||||||
\note This function has various discontinuities.*/
|
\note This function has various discontinuities.*/
|
||||||
vec2 CubicRoot(vec2 Z){
|
vec2 CubicRoot(vec2 Z){
|
||||||
float Argument=atan2(Z.y, Z.x);
|
float Argument=atan(Z.y, Z.x);
|
||||||
float NewArgument=Argument/3.0f;
|
float NewArgument=Argument/3.0f;
|
||||||
vec2 NormalizedRoot;
|
vec2 NormalizedRoot;
|
||||||
sincos(NewArgument, NormalizedRoot.y, NormalizedRoot.x);
|
sincos(NewArgument, NormalizedRoot.y, NormalizedRoot.x);
|
||||||
|
|
|
@ -5,17 +5,7 @@
|
||||||
roots of polynomials up to degree four are defined.
|
roots of polynomials up to degree four are defined.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#include "flywheel:internal/mboit/trigonometric_moment_math.glsl"
|
#include "flywheel:internal/mboit/trigonometric_moment_math.glsl"
|
||||||
|
|
||||||
void sincos(float theta, out float s, out float c) {
|
|
||||||
s = sin(theta);
|
|
||||||
c = cos(theta);
|
|
||||||
}
|
|
||||||
|
|
||||||
float saturate(float a) {
|
|
||||||
return clamp(a, 0., 1.);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! Given coefficients of a quadratic polynomial A*x^2+B*x+C, this function
|
/*! Given coefficients of a quadratic polynomial A*x^2+B*x+C, this function
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
const float moment_bias = 0.25;
|
const float moment_bias = 0.25;
|
||||||
const float overestimation = 0.25;
|
const float overestimation = 0.25;
|
||||||
const vec4 wrapping_zone_parameters = vec4(0.);
|
const vec4 wrapping_zone_parameters = vec4(0.31415927, 2.984513, 2.7934167, -18.553917);
|
||||||
|
|
||||||
|
|
||||||
void clip(float a) {
|
void clip(float a) {
|
||||||
|
@ -28,7 +28,7 @@ void clip(float a) {
|
||||||
|
|
||||||
// jozu: The trigonometric moments and higher order power moments rely on a second render target
|
// jozu: The trigonometric moments and higher order power moments rely on a second render target
|
||||||
// which the java side is not set up to support. Trying to enable them as is will cause compile errors also.
|
// which the java side is not set up to support. Trying to enable them as is will cause compile errors also.
|
||||||
#define NUM_MOMENTS 4
|
#define NUM_MOMENTS 8
|
||||||
|
|
||||||
#define SINGLE_PRECISION 1
|
#define SINGLE_PRECISION 1
|
||||||
|
|
||||||
|
@ -40,15 +40,15 @@ void clip(float a) {
|
||||||
vector of moments.moment vector. The shader that calls this function must
|
vector of moments.moment vector. The shader that calls this function must
|
||||||
provide the required render targets.*/
|
provide the required render targets.*/
|
||||||
#if NUM_MOMENTS == 4
|
#if NUM_MOMENTS == 4
|
||||||
void generateMoments(float depth, float transmittance, vec4 wrapping_zone_parameters, out float b_0, out vec4 b)
|
void generateMoments(float depth, float transmittance, out float b_0, out vec4 b)
|
||||||
#elif NUM_MOMENTS == 6
|
#elif NUM_MOMENTS == 6
|
||||||
#if USE_R_RG_RBBA_FOR_MBOIT6
|
#if USE_R_RG_RBBA_FOR_MBOIT6
|
||||||
void generateMoments(float depth, float transmittance, vec4 wrapping_zone_parameters, out float b_0, out vec2 b_12, out vec4 b_3456)
|
void generateMoments(float depth, float transmittance, out float b_0, out vec2 b_12, out vec4 b_3456)
|
||||||
#else
|
#else
|
||||||
void generateMoments(float depth, float transmittance, vec4 wrapping_zone_parameters, out float b_0, out vec2 b_12, out vec2 b_34, out vec2 b_56)
|
void generateMoments(float depth, float transmittance, out float b_0, out vec2 b_12, out vec2 b_34, out vec2 b_56)
|
||||||
#endif
|
#endif
|
||||||
#elif NUM_MOMENTS == 8
|
#elif NUM_MOMENTS == 8
|
||||||
void generateMoments(float depth, float transmittance, vec4 wrapping_zone_parameters, out float b_0, out vec4 b_even, out vec4 b_odd)
|
void generateMoments(float depth, float transmittance, out float b_0, out vec4 b_even, out vec4 b_odd)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
transmittance = max(transmittance, 0.000001);
|
transmittance = max(transmittance, 0.000001);
|
||||||
|
@ -57,7 +57,7 @@ void generateMoments(float depth, float transmittance, vec4 wrapping_zone_parame
|
||||||
b_0 = absorbance;
|
b_0 = absorbance;
|
||||||
#if TRIGONOMETRIC
|
#if TRIGONOMETRIC
|
||||||
float phase = fma(depth, wrapping_zone_parameters.y, wrapping_zone_parameters.y);
|
float phase = fma(depth, wrapping_zone_parameters.y, wrapping_zone_parameters.y);
|
||||||
vec2 circle_point = vec2(sin(phas), cos(phase));
|
vec2 circle_point = vec2(sin(phase), cos(phase));
|
||||||
|
|
||||||
vec2 circle_point_pow2 = Multiply(circle_point, circle_point);
|
vec2 circle_point_pow2 = Multiply(circle_point, circle_point);
|
||||||
#if NUM_MOMENTS == 4
|
#if NUM_MOMENTS == 4
|
||||||
|
@ -98,10 +98,8 @@ void generateMoments(float depth, float transmittance, vec4 wrapping_zone_parame
|
||||||
#else//MOMENT_GENERATION is disabled
|
#else//MOMENT_GENERATION is disabled
|
||||||
|
|
||||||
layout (binding = 7) uniform sampler2D _flw_zeroth_moment_sampler;
|
layout (binding = 7) uniform sampler2D _flw_zeroth_moment_sampler;
|
||||||
layout (binding = 8) uniform sampler2D _flw_moments_sampler;
|
layout (binding = 8) uniform sampler2D _flw_moments0_sampler;
|
||||||
#if USE_R_RG_RBBA_FOR_MBOIT6
|
layout (binding = 9) uniform sampler2D _flw_moments1_sampler;
|
||||||
uniform sampler2D extra_moments;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*! This function is to be called from the shader that composites the
|
/*! This function is to be called from the shader that composites the
|
||||||
transparent fragments. It reads the moments and calls the appropriate
|
transparent fragments. It reads the moments and calls the appropriate
|
||||||
|
@ -120,7 +118,7 @@ void resolveMoments(out float transmittance_at_depth, out float total_transmitta
|
||||||
|
|
||||||
#if NUM_MOMENTS == 4
|
#if NUM_MOMENTS == 4
|
||||||
#if TRIGONOMETRIC
|
#if TRIGONOMETRIC
|
||||||
vec4 b_tmp = texelFetch(_flw_moments_sampler, idx0, 0);
|
vec4 b_tmp = texelFetch(_flw_moments0_sampler, idx0, 0);
|
||||||
vec2 trig_b[2];
|
vec2 trig_b[2];
|
||||||
trig_b[0] = b_tmp.xy;
|
trig_b[0] = b_tmp.xy;
|
||||||
trig_b[1] = b_tmp.zw;
|
trig_b[1] = b_tmp.zw;
|
||||||
|
@ -133,7 +131,7 @@ void resolveMoments(out float transmittance_at_depth, out float total_transmitta
|
||||||
#endif
|
#endif
|
||||||
transmittance_at_depth = computeTransmittanceAtDepthFrom2TrigonometricMoments(b_0, trig_b, depth, moment_bias, overestimation, wrapping_zone_parameters);
|
transmittance_at_depth = computeTransmittanceAtDepthFrom2TrigonometricMoments(b_0, trig_b, depth, moment_bias, overestimation, wrapping_zone_parameters);
|
||||||
#else
|
#else
|
||||||
vec4 b_1234 = texelFetch(_flw_moments_sampler, idx0, 0).xyzw;
|
vec4 b_1234 = texelFetch(_flw_moments0_sampler, idx0, 0).xyzw;
|
||||||
#if SINGLE_PRECISION
|
#if SINGLE_PRECISION
|
||||||
vec2 b_even = b_1234.yw;
|
vec2 b_even = b_1234.yw;
|
||||||
vec2 b_odd = b_1234.xz;
|
vec2 b_odd = b_1234.xz;
|
||||||
|
@ -158,14 +156,14 @@ void resolveMoments(out float transmittance_at_depth, out float total_transmitta
|
||||||
ivec2 idx2 = idx0;
|
ivec2 idx2 = idx0;
|
||||||
#if TRIGONOMETRIC
|
#if TRIGONOMETRIC
|
||||||
vec2 trig_b[3];
|
vec2 trig_b[3];
|
||||||
trig_b[0] = texelFetch(_flw_moments_sampler, idx0, 0).xy;
|
trig_b[0] = texelFetch(_flw_moments0_sampler, idx0, 0).xy;
|
||||||
#if USE_R_RG_RBBA_FOR_MBOIT6
|
#if USE_R_RG_RBBA_FOR_MBOIT6
|
||||||
vec4 tmp = texelFetch(extra_moments, idx0, 0);
|
vec4 tmp = texelFetch(extra_moments, idx0, 0);
|
||||||
trig_b[1] = tmp.xy;
|
trig_b[1] = tmp.xy;
|
||||||
trig_b[2] = tmp.zw;
|
trig_b[2] = tmp.zw;
|
||||||
#else
|
#else
|
||||||
trig_b[1] = texelFetch(_flw_moments_sampler, idx1, 0).xy;
|
trig_b[1] = texelFetch(_flw_moments1_sampler, idx1, 0).xy;
|
||||||
trig_b[2] = texelFetch(_flw_moments_sampler, idx2, 0).xy;
|
trig_b[2] = texelFetch(_flw_moments0_sampler, idx2, 0).xy;
|
||||||
#endif
|
#endif
|
||||||
#if SINGLE_PRECISION
|
#if SINGLE_PRECISION
|
||||||
trig_b[0] /= b_0;
|
trig_b[0] /= b_0;
|
||||||
|
@ -178,14 +176,14 @@ void resolveMoments(out float transmittance_at_depth, out float total_transmitta
|
||||||
#endif
|
#endif
|
||||||
transmittance_at_depth = computeTransmittanceAtDepthFrom3TrigonometricMoments(b_0, trig_b, depth, moment_bias, overestimation, wrapping_zone_parameters);
|
transmittance_at_depth = computeTransmittanceAtDepthFrom3TrigonometricMoments(b_0, trig_b, depth, moment_bias, overestimation, wrapping_zone_parameters);
|
||||||
#else
|
#else
|
||||||
vec2 b_12 = texelFetch(_flw_moments_sampler, idx0, 0).xy;
|
vec2 b_12 = texelFetch(_flw_moments0_sampler, idx0, 0).xy;
|
||||||
#if USE_R_RG_RBBA_FOR_MBOIT6
|
#if USE_R_RG_RBBA_FOR_MBOIT6
|
||||||
vec4 tmp = texelFetch(extra_moments, idx0, 0);
|
vec4 tmp = texelFetch(extra_moments, idx0, 0);
|
||||||
vec2 b_34 = tmp.xy;
|
vec2 b_34 = tmp.xy;
|
||||||
vec2 b_56 = tmp.zw;
|
vec2 b_56 = tmp.zw;
|
||||||
#else
|
#else
|
||||||
vec2 b_34 = texelFetch(_flw_moments_sampler, idx1, 0).xy;
|
vec2 b_34 = texelFetch(_flw_moments1_sampler, idx1, 0).xy;
|
||||||
vec2 b_56 = texelFetch(_flw_moments_sampler, idx2, 0).xy;
|
vec2 b_56 = texelFetch(_flw_moments0_sampler, idx2, 0).xy;
|
||||||
#endif
|
#endif
|
||||||
#if SINGLE_PRECISION
|
#if SINGLE_PRECISION
|
||||||
vec3 b_even = vec3(b_12.y, b_34.y, b_56.y);
|
vec3 b_even = vec3(b_12.y, b_34.y, b_56.y);
|
||||||
|
@ -209,8 +207,8 @@ void resolveMoments(out float transmittance_at_depth, out float total_transmitta
|
||||||
#endif
|
#endif
|
||||||
#elif NUM_MOMENTS == 8
|
#elif NUM_MOMENTS == 8
|
||||||
#if TRIGONOMETRIC
|
#if TRIGONOMETRIC
|
||||||
vec4 b_tmp = texelFetch(_flw_moments_sampler, idx0, 0);
|
vec4 b_tmp = texelFetch(_flw_moments0_sampler, idx0, 0);
|
||||||
vec4 b_tmp2 = texelFetch(_flw_moments_sampler, idx1, 0);
|
vec4 b_tmp2 = texelFetch(_flw_moments1_sampler, idx1, 0);
|
||||||
#if SINGLE_PRECISION
|
#if SINGLE_PRECISION
|
||||||
vec2 trig_b[4] = {
|
vec2 trig_b[4] = {
|
||||||
b_tmp2.xy / b_0,
|
b_tmp2.xy / b_0,
|
||||||
|
@ -229,15 +227,15 @@ void resolveMoments(out float transmittance_at_depth, out float total_transmitta
|
||||||
transmittance_at_depth = computeTransmittanceAtDepthFrom4TrigonometricMoments(b_0, trig_b, depth, moment_bias, overestimation, wrapping_zone_parameters);
|
transmittance_at_depth = computeTransmittanceAtDepthFrom4TrigonometricMoments(b_0, trig_b, depth, moment_bias, overestimation, wrapping_zone_parameters);
|
||||||
#else
|
#else
|
||||||
#if SINGLE_PRECISION
|
#if SINGLE_PRECISION
|
||||||
vec4 b_even = texelFetch(_flw_moments_sampler, idx0, 0);
|
vec4 b_even = texelFetch(_flw_moments0_sampler, idx0, 0);
|
||||||
vec4 b_odd = texelFetch(_flw_moments_sampler, idx1, 0);
|
vec4 b_odd = texelFetch(_flw_moments1_sampler, idx1, 0);
|
||||||
|
|
||||||
b_even /= b_0;
|
b_even /= b_0;
|
||||||
b_odd /= b_0;
|
b_odd /= b_0;
|
||||||
const float bias_vector[8] = { 0, 0.75, 0, 0.67666666666666664, 0, 0.63, 0, 0.60030303030303034 };
|
const float bias_vector[8] = { 0, 0.75, 0, 0.67666666666666664, 0, 0.63, 0, 0.60030303030303034 };
|
||||||
#else
|
#else
|
||||||
vec4 b_even_q = texelFetch(_flw_moments_sampler, idx0, 0);
|
vec4 b_even_q = texelFetch(_flw_moments0_sampler, idx0, 0);
|
||||||
vec4 b_odd_q = texelFetch(_flw_moments_sampler, idx1, 0);
|
vec4 b_odd_q = texelFetch(_flw_moments1_sampler, idx1, 0);
|
||||||
|
|
||||||
// Dequantize the moments
|
// Dequantize the moments
|
||||||
vec4 b_even;
|
vec4 b_even;
|
||||||
|
|
|
@ -21,7 +21,7 @@ float circleToParameter(vec2 circle_point){
|
||||||
returns 1.0, otherwise 0.0 or a linear ramp in the wrapping zone.*/
|
returns 1.0, otherwise 0.0 or a linear ramp in the wrapping zone.*/
|
||||||
float getRootWeightFactor(float reference_parameter, float root_parameter, vec4 wrapping_zone_parameters){
|
float getRootWeightFactor(float reference_parameter, float root_parameter, vec4 wrapping_zone_parameters){
|
||||||
float binary_weight_factor=(root_parameter<reference_parameter)?1.0f:0.0f;
|
float binary_weight_factor=(root_parameter<reference_parameter)?1.0f:0.0f;
|
||||||
float linear_weight_factor=saturate(mad(root_parameter, wrapping_zone_parameters.z, wrapping_zone_parameters.w));
|
float linear_weight_factor=saturate(fma(root_parameter, wrapping_zone_parameters.z, wrapping_zone_parameters.w));
|
||||||
return binary_weight_factor+linear_weight_factor;
|
return binary_weight_factor+linear_weight_factor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ float computeTransmittanceAtDepthFrom2TrigonometricMoments(float b_0, vec2 trig_
|
||||||
float D22=RealPart(b[0]-D00*Multiply(L20, Conjugate(L20))-D11*Multiply(L21, Conjugate(L21)));
|
float D22=RealPart(b[0]-D00*Multiply(L20, Conjugate(L20))-D11*Multiply(L21, Conjugate(L21)));
|
||||||
float InvD22=1.0f/D22;
|
float InvD22=1.0f/D22;
|
||||||
// Solve a linear system to get the relevant polynomial
|
// Solve a linear system to get the relevant polynomial
|
||||||
float phase = mad(depth, wrapping_zone_parameters.y, wrapping_zone_parameters.y);
|
float phase = fma(depth, wrapping_zone_parameters.y, wrapping_zone_parameters.y);
|
||||||
vec2 circle_point;
|
vec2 circle_point;
|
||||||
sincos(phase, circle_point.y, circle_point.x);
|
sincos(phase, circle_point.y, circle_point.x);
|
||||||
vec2 c[3] = {
|
vec2 c[3] = {
|
||||||
|
@ -125,7 +125,7 @@ float computeTransmittanceAtDepthFrom3TrigonometricMoments(float b_0, vec2 trig_
|
||||||
float D33=RealPart(b[0]-D00*Multiply(L30, Conjugate(L30))-D11*Multiply(L31, Conjugate(L31))-D22*Multiply(L32, Conjugate(L32)));
|
float D33=RealPart(b[0]-D00*Multiply(L30, Conjugate(L30))-D11*Multiply(L31, Conjugate(L31))-D22*Multiply(L32, Conjugate(L32)));
|
||||||
float InvD33=1.0f/D33;
|
float InvD33=1.0f/D33;
|
||||||
// Solve a linear system to get the relevant polynomial
|
// Solve a linear system to get the relevant polynomial
|
||||||
float phase = mad(depth, wrapping_zone_parameters.y, wrapping_zone_parameters.y);
|
float phase = fma(depth, wrapping_zone_parameters.y, wrapping_zone_parameters.y);
|
||||||
vec2 circle_point;
|
vec2 circle_point;
|
||||||
sincos(phase, circle_point.y, circle_point.x);
|
sincos(phase, circle_point.y, circle_point.x);
|
||||||
vec2 circle_point_pow2 = Multiply(circle_point, circle_point);
|
vec2 circle_point_pow2 = Multiply(circle_point, circle_point);
|
||||||
|
@ -230,7 +230,7 @@ float computeTransmittanceAtDepthFrom4TrigonometricMoments(float b_0, vec2 trig_
|
||||||
float D44=RealPart(b[0]-D00*Multiply(L40, Conjugate(L40))-D11*Multiply(L41, Conjugate(L41))-D22*Multiply(L42, Conjugate(L42))-D33*Multiply(L43, Conjugate(L43)));
|
float D44=RealPart(b[0]-D00*Multiply(L40, Conjugate(L40))-D11*Multiply(L41, Conjugate(L41))-D22*Multiply(L42, Conjugate(L42))-D33*Multiply(L43, Conjugate(L43)));
|
||||||
float InvD44=1.0/D44;
|
float InvD44=1.0/D44;
|
||||||
// Solve a linear system to get the relevant polynomial
|
// Solve a linear system to get the relevant polynomial
|
||||||
float phase = mad(depth, wrapping_zone_parameters.y, wrapping_zone_parameters.y);
|
float phase = fma(depth, wrapping_zone_parameters.y, wrapping_zone_parameters.y);
|
||||||
vec2 circle_point;
|
vec2 circle_point;
|
||||||
sincos(phase, circle_point.y, circle_point.x);
|
sincos(phase, circle_point.y, circle_point.x);
|
||||||
vec2 circle_point_pow2 = Multiply(circle_point, circle_point);
|
vec2 circle_point_pow2 = Multiply(circle_point, circle_point);
|
||||||
|
|
|
@ -52,13 +52,6 @@ public class ShulkerBoxVisual extends AbstractBlockEntityVisual<ShulkerBoxBlockE
|
||||||
instances = InstanceTree.create(instancerProvider(), ModelTrees.of(ModelLayers.SHULKER, PATHS_TO_PRUNE, texture, MATERIAL));
|
instances = InstanceTree.create(instancerProvider(), ModelTrees.of(ModelLayers.SHULKER, PATHS_TO_PRUNE, texture, MATERIAL));
|
||||||
lid = instances.childOrThrow("lid");
|
lid = instances.childOrThrow("lid");
|
||||||
|
|
||||||
lid.instance()
|
|
||||||
.color(255, 255, 255, 255);
|
|
||||||
|
|
||||||
instances.childOrThrow("base")
|
|
||||||
.instance()
|
|
||||||
.color(255, 255, 255, 255);
|
|
||||||
|
|
||||||
initialPose = createInitialPose();
|
initialPose = createInitialPose();
|
||||||
applyTransform(partialTick);
|
applyTransform(partialTick);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue