volumetric fire shader

This commit is contained in:
austin 2022-03-02 21:10:13 -05:00
parent 90aa9fb963
commit 5fe7abf344
4 changed files with 54 additions and 75 deletions

BIN
assets/Models/flame1.fbx Normal file

Binary file not shown.

View File

@ -43,6 +43,7 @@ in vec3 FragPos;
in vec3 Normal; in vec3 Normal;
in vec2 TexCoord; in vec2 TexCoord;
in vec4 projCoord; in vec4 projCoord;
in vec4 modelCoord;
//uniforms //uniforms
uniform float time; uniform float time;
@ -52,77 +53,62 @@ layout (location = 5) uniform sampler2D volumeDepthFrontface;
layout (location = 6) uniform sampler2D volumeDepthBackface; layout (location = 6) uniform sampler2D volumeDepthBackface;
//function declarations //function declarations
vec4 openSimplex2_Conventional(vec3 X);
vec4 openSimplex2_ImproveXY(vec3 X); vec4 openSimplex2_ImproveXY(vec3 X);
float flameTex(float x, float y); float flameTex(float x, float y);
float getNoise(float scale, float timeScale);
/* /*
Main method Main method
*/ */
void main(){ void main(){
float timeS = time * 0.003; float timeS = time * 0.01;
// Normalized pixel coordinates (from 0 to 1) // Normalized pixel coordinates (from 0 to 1)
// vec2 uv = vec2(TexCoord.x,TexCoord.y);
vec3 projCoordNorm = projCoord.xyz / projCoord.w / 2.0 + 0.5; vec3 projCoordNorm = projCoord.xyz / projCoord.w / 2.0 + 0.5;
//make vec2
// vec2 finalProd = vec2((projCoord.x + 1.0)/2.0, (projCoord.y + 1.0)/2.0);
vec2 finalProd = projCoordNorm.xy; vec2 finalProd = projCoordNorm.xy;
//grab depth values
// float closeDepth = texture(volumeDepthFrontface, projCoordNorm.xy).r;
// float farDepth = texture(volumeDepthBackface, projCoordNorm.xy).r;
float closeDepth = texture(volumeDepthFrontface, finalProd.xy).r; float closeDepth = texture(volumeDepthFrontface, finalProd.xy).r;
float farDepth = texture(volumeDepthBackface, finalProd.xy).r; float farDepth = texture(volumeDepthBackface, finalProd.xy).r;
//distance between the two
// float closeDepth = texture(volumeDepthFrontface, uv).r; float volume = abs(farDepth - closeDepth);
// float farDepth = texture(volumeDepthBackface, uv).r;
float dist = farDepth - closeDepth; //based on distance of model coords from center
float dist = length(modelCoord.xyz);
float red = 0;
float green = 0;
float blue = 0;
// if(projCoordNorm.x > -0.4 && projCoordNorm.x < 0.6 && projCoordNorm.y > -0.4 && projCoordNorm.y < 0.1){ //noise
// dist = 0.1; // float noiseInX = modelCoord.x * 7.0;
// green = 1; // float noiseInZ = FragPos.y * 7.0 - timeS;
// blue = closeDepth; // float noiseInY = modelCoord.y * 7.0;
// float noise = openSimplex2_ImproveXY(vec3(noiseInX,noiseInY,noiseInZ)).x;
float noise = (getNoise(7.0,1.5 * timeS) + getNoise(10.0,1.5 * (timeS + 0.1)) + getNoise(14.0,1.5 * (timeS + 0.2)) + getNoise(20.0,3.0 * timeS)) / 4.0;
// float noise = getNoise(10.0,1.5);
// float noise = getNoise(14.0,2.0);
float vertical = -modelCoord.z;
float amountOfFire = volume * 50.0 + vertical * 2.0 + noise * 0.1;// + dist * 0.1; //should be a function of volume + noise + dist from center
// if(amountOfFire < 0.1){
// discard;
// } // }
// if(closeDepth != 1){ amountOfFire = amountOfFire * 2.0;
// blue = 1;
// }
// val = dist;
// red = projCoordNorm.x; float red = amountOfFire * 2.0;
// green = projCoordNorm.y; float green = amountOfFire * 0.8;
// blue = 0; float blue = amountOfFire * 0.2;
float alpha = amountOfFire * 3.0;
// if(mod(TexCoord.x,0.01) < 0.005){
// red = 1;
// }
// if(mod(TexCoord.y,0.01) < 0.005){
// green = 1;
// }
// if(dist != 0){
// red = 1;
// green = 1;
// blue = 1;
// }
red = dist;
green = dist;
blue = dist;
vec4 color = vec4( vec4 color = vec4(
red, red,
green, green,
blue, blue,
1.0 alpha
); );
// if(val < 0.3){ // if(val < 0.3){
@ -133,28 +119,16 @@ void main(){
fragColor = color; fragColor = color;
} }
//
//custom flame function
///
float flameTex(float x, float y){ float getNoise(float scale, float time){
//flip y float noiseInX = modelCoord.x * scale;
float t = 1.0 - y; float noiseInZ = FragPos.y * scale - time;
//calculate vertical component float noiseInY = modelCoord.y * scale;
float verticalFlameValue = pow(log(t+1.0),1.4) - step(0.5,t) * (pow((2.0 * (t - 0.5)),3.0) / pow(log(2.0),1.4)); float noise = openSimplex2_ImproveXY(vec3(noiseInX,noiseInY,noiseInZ)).x;
//calculate dist along horizontal from vertical component return noise;
float dist = abs(x-0.5);
//want to fade to nothing at dist >= vertical flame value
//use exponent to get there
//clamp range with min
float v = max(2.0 * (verticalFlameValue - dist),0.0);
//apply exponent to get value
float rVal = pow(v,1.4);
return rVal;
} }
//////////////// K.jpg's Re-oriented 4-Point BCC Noise (OpenSimplex2) //////////////// //////////////// K.jpg's Re-oriented 4-Point BCC Noise (OpenSimplex2) ////////////////
////////////////////// Output: vec4(dF/dx, dF/dy, dF/dz, value) ////////////////////// ////////////////////// Output: vec4(dF/dx, dF/dy, dF/dz, value) //////////////////////

View File

@ -22,6 +22,7 @@ out vec3 FragPos;
out vec3 Normal; out vec3 Normal;
out vec2 TexCoord; out vec2 TexCoord;
out vec4 projCoord; out vec4 projCoord;
out vec4 modelCoord;
@ -36,7 +37,7 @@ void main() {
Normal = mat3(transpose(inverse(model))) * aNormal; Normal = mat3(transpose(inverse(model))) * aNormal;
TexCoord = aTex; TexCoord = aTex;
projCoord = projection * view * model * FinalVertex; projCoord = projection * view * model * FinalVertex;
modelCoord = FinalVertex;
//set final position with opengl space //set final position with opengl space
gl_Position = projection * view * model * FinalVertex; gl_Position = projection * view * model * FinalVertex;

View File

@ -678,23 +678,27 @@ public class LoadingThread extends Thread {
Entity hair = ItemUtils.spawnBasicItem("hairshort1"); Entity hair = ItemUtils.spawnBasicItem("hairshort1");
EntityUtils.getPosition(hair).set(new Vector3f(2,0.1f,1)); EntityUtils.getPosition(hair).set(new Vector3f(2,0.1f,1));
//center flame // //center flame
Entity fire = ParticleUtils.spawnStaticBillboardParticle(); // Entity fire = ParticleUtils.spawnStaticBillboardParticle();
EntityUtils.getPosition(fire).set(new Vector3f(1,0.2f,1)); // EntityUtils.getPosition(fire).set(new Vector3f(1,0.2f,1));
EntityUtils.getScale(fire).set(0.6f); // EntityUtils.getScale(fire).set(0.6f);
Actor fireActor = EntityUtils.getActor(fire); // Actor fireActor = EntityUtils.getActor(fire);
fireActor.maskShader("particleBillboard", "Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs"); // fireActor.maskShader("particleBillboard", "Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs");
Globals.assetManager.addShaderToQueue("Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs"); // Globals.assetManager.addShaderToQueue("Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs");
//campfire // //campfire
Entity campfire = EntityUtils.spawnDrawableEntity("Models/campfire1.fbx"); Entity campfire = EntityUtils.spawnDrawableEntity("Models/campfire1.fbx");
EntityUtils.getPosition(campfire).set(1,0,1); EntityUtils.getPosition(campfire).set(1,0,1);
EntityUtils.getRotation(campfire).rotationX(-(float)Math.PI/2.0f); EntityUtils.getRotation(campfire).rotationX(-(float)Math.PI/2.0f);
Entity cube = EntityUtils.spawnDrawableEntity("Models/unitcube.fbx"); //flame
Entity cube = EntityUtils.spawnDrawableEntity("Models/flame1.fbx");
//shader mask //shader mask
EntityUtils.getActor(cube).maskShader("Cube", "Shaders/flame2/flame.vs", "Shaders/flame2/flame.fs"); EntityUtils.getActor(cube).maskShader("Sphere", "Shaders/flame2/flame.vs", "Shaders/flame2/flame.fs");
Globals.assetManager.addShaderToQueue("Shaders/flame2/flame.vs", "Shaders/flame2/flame.fs"); Globals.assetManager.addShaderToQueue("Shaders/flame2/flame.vs", "Shaders/flame2/flame.fs");
EntityUtils.getScale(cube).set(0.8f);
EntityUtils.getPosition(cube).set(1,0.08f,1);
EntityUtils.getRotation(cube).rotationX(-(float)Math.PI/2.0f);
//texture mask //texture mask
List<Texture> textureList = new LinkedList<Texture>(); List<Texture> textureList = new LinkedList<Texture>();
textureList.add(Globals.renderingEngine.getVolumeFrontfaceTexture()); textureList.add(Globals.renderingEngine.getVolumeFrontfaceTexture());
@ -702,7 +706,7 @@ public class LoadingThread extends Thread {
List<String> uniformList = new LinkedList<String>(); List<String> uniformList = new LinkedList<String>();
uniformList.add("volumeDepthFrontface"); uniformList.add("volumeDepthFrontface");
uniformList.add("volumeDepthBackface"); uniformList.add("volumeDepthBackface");
ActorTextureMask textureMask = new ActorTextureMask("Cube",textureList,uniformList); ActorTextureMask textureMask = new ActorTextureMask("Sphere",textureList,uniformList);
EntityUtils.getActor(cube).addTextureMask(textureMask); EntityUtils.getActor(cube).addTextureMask(textureMask);
//set draw volumetric //set draw volumetric
cube.putData(EntityDataStrings.DRAW_VOLUMETRIC, true); cube.putData(EntityDataStrings.DRAW_VOLUMETRIC, true);