Renderer/assets/Shaders/entities/clouds/clouds.fs
austin b1230ea07c
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
cloud work
2024-11-25 15:40:44 -05:00

103 lines
2.7 KiB
GLSL

#version 450 core
//macros
#extension GL_ARB_explicit_uniform_location : enable
//output
out vec4 fragColor;
//input
in vec3 FragPos;
in vec3 Normal;
in vec2 TexCoord;
in vec4 projCoord;
in vec4 modelCoord;
//uniforms
uniform float time;
uniform mat4 model;
uniform vec3 viewPos;
const float CONTACT_TEST_MARGIN = -0.001;
/*
Main method
*/
void main(){
float timeS = time * 0.01;
// Normalized pixel coordinates (from 0 to 1)
vec3 projCoordNorm = projCoord.xyz / projCoord.w / 2.0 + 0.5;
//make vec2
vec2 finalProd = projCoordNorm.xy;
//get vector that describes the movement through the cube
vec3 viewDir = normalize(viewPos - FragPos);
//need to transform to model space
//get inverse of model transform
mat4 inverseModel = inverse(model);
//apply to view dir
vec4 modelViewDir = normalize(inverseModel * vec4(viewDir,1.0));
//where the vector first hits the cube
vec4 contactPoint = modelCoord;
float red = 1.0;
float green = 1.0;
float blue = 1.0;
red = modelViewDir.x;
green = modelViewDir.y;
blue = modelViewDir.z;
//need to calculate exit point
//if we hit one of the X edges
vec4 backPoint = vec4(1.0);
if(abs(contactPoint.x)-1.0>CONTACT_TEST_MARGIN){
red = 1.0;
//discard if backface
if(sign(contactPoint.x)!=sign(modelViewDir.x)){
discard;
}
//calculate distance to nearest face
float distX = 2.0;
//this is some really weird logic that I believe works to calculate distance to nearest face
float distY = abs(sign(modelViewDir.y) - contactPoint.y);
float distZ = abs(sign(modelViewDir.z) - contactPoint.z);
//calculate number of times to add viewDir to get dist
float scaleX = distX / modelViewDir.x;
float scaleY = distY / modelViewDir.y;
float scaleZ = distZ / modelViewDir.z;
//this is the smallest distance of all of them
float minScale = min(scaleX,min(scaleY,scaleZ));
backPoint = contactPoint + (modelViewDir * minScale);
float dist = length(abs(vec3(contactPoint) - vec3(backPoint)))/1.0;
red = green = blue = dist;
} else if(abs(contactPoint.y)-1.0>CONTACT_TEST_MARGIN){
green = 1.0;
//discard if backface
if(sign(contactPoint.y)!=sign(modelViewDir.y)){
discard;
}
} else if(abs(contactPoint.z)-1.0>CONTACT_TEST_MARGIN){
blue = 1.0;
//discard if backface
if(sign(contactPoint.z)!=sign(modelViewDir.z)){
discard;
}
}
vec4 color = vec4(
red,
green,
blue,
0.3
);
fragColor = color;
}