OIT start
This commit is contained in:
parent
0e073689c4
commit
2f0af2f096
55
assets/Shaders/oit/composite.fs
Normal file
55
assets/Shaders/oit/composite.fs
Normal file
@ -0,0 +1,55 @@
|
||||
#version 420 core
|
||||
|
||||
// shader outputs
|
||||
layout (location = 0) out vec4 frag;
|
||||
|
||||
// color accumulation buffer
|
||||
layout (binding = 0) uniform sampler2D accum;
|
||||
|
||||
// revealage threshold buffer
|
||||
layout (binding = 1) uniform sampler2D reveal;
|
||||
|
||||
// epsilon number
|
||||
const float EPSILON = 0.00001f;
|
||||
|
||||
// caluclate floating point numbers equality accurately
|
||||
bool isApproximatelyEqual(float a, float b)
|
||||
{
|
||||
return abs(a - b) <= (abs(a) < abs(b) ? abs(b) : abs(a)) * EPSILON;
|
||||
}
|
||||
|
||||
// get the max value between three values
|
||||
float max3(vec3 v)
|
||||
{
|
||||
return max(max(v.x, v.y), v.z);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
// fragment coordination
|
||||
ivec2 coords = ivec2(gl_FragCoord.xy);
|
||||
|
||||
// fragment revealage
|
||||
float revealage = texelFetch(reveal, coords, 0).r;
|
||||
|
||||
// save the blending and color texture fetch cost if there is not a transparent fragment
|
||||
if (isApproximatelyEqual(revealage, 1.0f)){
|
||||
discard;
|
||||
}
|
||||
|
||||
// fragment color
|
||||
vec4 accumulation = texelFetch(accum, coords, 0);
|
||||
|
||||
// suppress overflow
|
||||
if (isinf(max3(abs(accumulation.rgb)))){
|
||||
accumulation.rgb = vec3(accumulation.a);
|
||||
}
|
||||
|
||||
// prevent floating point precision bug
|
||||
vec3 average_color = accumulation.rgb / max(accumulation.a, EPSILON);
|
||||
|
||||
// blend pixels
|
||||
frag = vec4(average_color, 1.0f - revealage);
|
||||
// frag = vec4(accumulation.rgb, 1.0f - revealage);
|
||||
// frag = vec4(0,0,0,0);
|
||||
}
|
||||
9
assets/Shaders/oit/composite.vs
Normal file
9
assets/Shaders/oit/composite.vs
Normal file
@ -0,0 +1,9 @@
|
||||
#version 420 core
|
||||
|
||||
// shader inputs
|
||||
layout (location = 0) in vec3 position;
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = vec4(position, 1.0f);
|
||||
}
|
||||
30
assets/Shaders/screentexture/drawChannel/drawChannel.fs
Normal file
30
assets/Shaders/screentexture/drawChannel/drawChannel.fs
Normal file
@ -0,0 +1,30 @@
|
||||
#version 330 core
|
||||
out vec4 FragColor;
|
||||
|
||||
in vec2 TexCoords;
|
||||
|
||||
uniform sampler2D screenTexture;
|
||||
|
||||
uniform float channel;
|
||||
|
||||
void main(){
|
||||
switch(int(channel)){
|
||||
case 0:
|
||||
FragColor = vec4(texture(screenTexture, TexCoords).r,0,0,1);
|
||||
break;
|
||||
case 1:
|
||||
FragColor = vec4(0,texture(screenTexture, TexCoords).g,0,1);
|
||||
break;
|
||||
case 2:
|
||||
FragColor = vec4(0,0,texture(screenTexture, TexCoords).b,1);
|
||||
break;
|
||||
case 3:
|
||||
FragColor = vec4(texture(screenTexture, TexCoords).a,texture(screenTexture, TexCoords).a,texture(screenTexture, TexCoords).a,1);
|
||||
break;
|
||||
case 4:
|
||||
FragColor = vec4(vec3(texture(screenTexture, TexCoords)),1.0);
|
||||
default:
|
||||
FragColor = vec4(1,1,1,1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
10
assets/Shaders/screentexture/drawChannel/drawChannel.vs
Normal file
10
assets/Shaders/screentexture/drawChannel/drawChannel.vs
Normal file
@ -0,0 +1,10 @@
|
||||
#version 330 core
|
||||
layout (location = 0) in vec2 aPos;
|
||||
layout (location = 1) in vec2 aTexCoords;
|
||||
|
||||
out vec2 TexCoords;
|
||||
|
||||
void main(){
|
||||
gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0);
|
||||
TexCoords = aTexCoords;
|
||||
}
|
||||
9
assets/Shaders/screentexture/drawDepth/drawDepth.fs
Normal file
9
assets/Shaders/screentexture/drawDepth/drawDepth.fs
Normal file
@ -0,0 +1,9 @@
|
||||
#version 330 core
|
||||
out vec4 FragColor;
|
||||
|
||||
in vec2 TexCoords;
|
||||
|
||||
|
||||
void main(){
|
||||
vec4(vec3(gl_FragCoord.z), 1.0);
|
||||
}
|
||||
10
assets/Shaders/screentexture/drawDepth/drawDepth.vs
Normal file
10
assets/Shaders/screentexture/drawDepth/drawDepth.vs
Normal file
@ -0,0 +1,10 @@
|
||||
#version 330 core
|
||||
layout (location = 0) in vec2 aPos;
|
||||
layout (location = 1) in vec2 aTexCoords;
|
||||
|
||||
out vec2 TexCoords;
|
||||
|
||||
void main(){
|
||||
gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0);
|
||||
TexCoords = aTexCoords;
|
||||
}
|
||||
@ -30,13 +30,16 @@ THE FLAME FUNCTION IS ONE CREATED BY ME BLENDING A LOG2 INTO A EXPONENTIAL.
|
||||
*/
|
||||
|
||||
//version
|
||||
#version 330 core
|
||||
#version 420 core
|
||||
|
||||
//macros
|
||||
#extension GL_ARB_explicit_uniform_location : enable
|
||||
|
||||
//output
|
||||
out vec4 fragColor;
|
||||
// out vec4 fragColor;
|
||||
|
||||
layout (location = 0) out vec4 accum;
|
||||
layout (location = 1) out float reveal;
|
||||
|
||||
//input
|
||||
in vec3 FragPos;
|
||||
@ -49,6 +52,7 @@ in vec4 modelCoord;
|
||||
uniform float time;
|
||||
|
||||
//layout uniforms
|
||||
layout (location = 3) uniform sampler2D shadowMap;
|
||||
layout (location = 5) uniform sampler2D volumeDepthFrontface;
|
||||
layout (location = 6) uniform sampler2D volumeDepthBackface;
|
||||
|
||||
@ -104,6 +108,8 @@ void main(){
|
||||
float blue = 0.7366;
|
||||
float alpha = volume * 10.0;
|
||||
|
||||
// alpha = 0.5;
|
||||
|
||||
// float red = volume * 10.0;
|
||||
// float green = volume * 10.0;
|
||||
// float blue = volume * 10.0;
|
||||
@ -115,13 +121,26 @@ void main(){
|
||||
blue,
|
||||
alpha
|
||||
);
|
||||
|
||||
|
||||
// weight function
|
||||
float weight = clamp(pow(min(1.0, color.a * 10.0) + 0.01, 3.0) * 1e8 * pow(1.0 - gl_FragCoord.z * 0.9, 3.0), 1e-2, 3e3);
|
||||
|
||||
// weight = 1.0;
|
||||
|
||||
// store pixel color accumulation
|
||||
accum = vec4(color.rgb * color.a, color.a) * weight;
|
||||
|
||||
// store pixel revealage threshold
|
||||
reveal = color.a;
|
||||
// reveal = 1.0;
|
||||
|
||||
// if(val < 0.3){
|
||||
// discard;
|
||||
// }
|
||||
|
||||
// Output to screen
|
||||
fragColor = color;
|
||||
// fragColor = color;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
//Vertex Shader
|
||||
#version 330 core
|
||||
#version 420 core
|
||||
|
||||
|
||||
|
||||
@ -40,5 +40,8 @@ void main() {
|
||||
modelCoord = FinalVertex;
|
||||
|
||||
//set final position with opengl space
|
||||
gl_Position = projection * view * model * FinalVertex;
|
||||
vec4 outVec = projection * view * model * FinalVertex;
|
||||
// outVec.z = outVec.z - 0.1f;
|
||||
// outVec.z = -0.9;
|
||||
gl_Position = outVec;
|
||||
}
|
||||
|
||||
@ -732,6 +732,8 @@ public class LoadingThread extends Thread {
|
||||
EntityUtils.getActor(water).addTextureMask(RenderUtils.generateVolumetricTextureMask("Cube"));
|
||||
//set draw volumetric
|
||||
water.putData(EntityDataStrings.DRAW_VOLUMETRIC, true);
|
||||
water.removeData(EntityDataStrings.DRAW_SOLID_PASS);
|
||||
water.putData(EntityDataStrings.DRAW_TRANSPARENT_PASS, true);
|
||||
|
||||
|
||||
// goblin = CreatureUtils.spawnBasicCreature("Goblin");
|
||||
|
||||
@ -16,6 +16,8 @@ public class EntityDataStrings {
|
||||
public static final String DATA_STRING_MODEL_PATH = "modelPath";
|
||||
public static final String DATA_STRING_ACTOR = "actor";
|
||||
public static final String DATA_STRING_DRAW = "drawFlag";
|
||||
public static final String DRAW_SOLID_PASS = "drawSolidPass";
|
||||
public static final String DRAW_TRANSPARENT_PASS = "drawTransparentPass";
|
||||
public static final String DRAW_CAST_SHADOW = "castShadow";
|
||||
public static final String DRAW_VOLUMETRIC = "drawVolumetric";
|
||||
|
||||
|
||||
@ -48,6 +48,7 @@ public class EntityUtils {
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_ROTATION, new Quaternionf().identity());
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_SCALE, new Vector3f(1,1,1));
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_DRAW, true);
|
||||
rVal.putData(EntityDataStrings.DRAW_SOLID_PASS, true);
|
||||
Globals.entityManager.registerEntity(rVal);
|
||||
Globals.entityManager.registerDrawableEntity(rVal);
|
||||
return rVal;
|
||||
@ -60,6 +61,7 @@ public class EntityUtils {
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_ROTATION, new Quaternionf().rotateAxis((float)0, new Vector3f(1,0,0)));
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_SCALE, new Vector3f(1,1,1));
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_DRAW, true);
|
||||
rVal.putData(EntityDataStrings.DRAW_SOLID_PASS, true);
|
||||
Globals.entityManager.registerEntity(rVal);
|
||||
Globals.entityManager.registerDrawableEntity(rVal);
|
||||
return rVal;
|
||||
|
||||
@ -73,10 +73,22 @@ import static org.lwjgl.opengl.GL11.GL_FOG_MODE;
|
||||
import static org.lwjgl.opengl.GL11.GL_FOG_START;
|
||||
import static org.lwjgl.opengl.GL11.GL_LINEAR;
|
||||
import static org.lwjgl.opengl.GL11.GL_NEAREST;
|
||||
import static org.lwjgl.opengl.GL11.GL_LESS;
|
||||
import static org.lwjgl.opengl.GL11.GL_LEQUAL;
|
||||
import static org.lwjgl.opengl.GL11.GL_EQUAL;
|
||||
import static org.lwjgl.opengl.GL11.GL_GREATER;
|
||||
import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA;
|
||||
import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA;
|
||||
import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
|
||||
import static org.lwjgl.opengl.GL11.GL_TRIANGLES;
|
||||
import static org.lwjgl.opengl.GL11.GL_FALSE;
|
||||
import static org.lwjgl.opengl.GL11.GL_ONE;
|
||||
import static org.lwjgl.opengl.GL11.GL_ZERO;
|
||||
import static org.lwjgl.opengl.GL11.GL_COLOR;
|
||||
import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_COLOR;
|
||||
import static org.lwjgl.opengl.GL11.GL_ALWAYS;
|
||||
import static org.lwjgl.opengl.GL11.glDepthFunc;
|
||||
import static org.lwjgl.opengl.GL11.glDepthMask;
|
||||
import static org.lwjgl.opengl.GL11.glBindTexture;
|
||||
import static org.lwjgl.opengl.GL11.glBlendFunc;
|
||||
import static org.lwjgl.opengl.GL11.glClear;
|
||||
@ -91,15 +103,22 @@ import static org.lwjgl.opengl.GL13.GL_TEXTURE1;
|
||||
import static org.lwjgl.opengl.GL13.GL_TEXTURE2;
|
||||
import static org.lwjgl.opengl.GL13.GL_TEXTURE3;
|
||||
import static org.lwjgl.opengl.GL13.glActiveTexture;
|
||||
import static org.lwjgl.opengl.GL14.GL_FUNC_ADD;
|
||||
import static org.lwjgl.opengl.GL20.glGetUniformLocation;
|
||||
import static org.lwjgl.opengl.GL20.glUniformMatrix4fv;
|
||||
import static org.lwjgl.opengl.GL20.glUseProgram;
|
||||
import static org.lwjgl.opengl.GL20.glUniform1f;
|
||||
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
|
||||
import static org.lwjgl.opengl.GL30.GL_RENDERBUFFER;
|
||||
import static org.lwjgl.opengl.GL30.GL_COLOR_ATTACHMENT0;
|
||||
import static org.lwjgl.opengl.GL30.GL_COLOR_ATTACHMENT1;
|
||||
import static org.lwjgl.opengl.GL30.glBindFramebuffer;
|
||||
import static org.lwjgl.opengl.GL30.glBindRenderbuffer;
|
||||
import static org.lwjgl.opengl.GL30.glBindVertexArray;
|
||||
import static org.lwjgl.opengl.GL30.glBlitFramebuffer;
|
||||
import static org.lwjgl.opengl.GL30.glClearBufferfv;
|
||||
import static org.lwjgl.opengl.GL40.glBlendFunci;
|
||||
import static org.lwjgl.opengl.GL40.glBlendEquation;
|
||||
import static org.lwjgl.system.MemoryUtil.NULL;
|
||||
|
||||
public class RenderingEngine {
|
||||
@ -108,14 +127,27 @@ public class RenderingEngine {
|
||||
|
||||
public static final int GL_DEFAULT_FRAMEBUFFER = 0;
|
||||
public static final int GL_DEFAULT_RENDERBUFFER = 0;
|
||||
static Texture screenTextureColor;
|
||||
static Texture screenTextureDepth;
|
||||
static Framebuffer screenFramebuffer;
|
||||
static Renderbuffer screenRenderbuffer;
|
||||
static int screenTextureVAO;
|
||||
static ShaderProgram screenTextureShaders;
|
||||
|
||||
static ShaderProgram drawChannel;
|
||||
|
||||
//depth framebuffer/shader for shadow mapping
|
||||
static ShaderProgram lightDepthShaderProgram;
|
||||
static Framebuffer lightDepthBuffer;
|
||||
|
||||
//framebuffers for transparent textures
|
||||
static float[] transparencyAccumulatorClear;
|
||||
static Texture transparencyAccumulatorTexture;
|
||||
static float[] transparencyRevealageClear;
|
||||
static Texture transparencyRevealageTexture;
|
||||
static Framebuffer transparencyBuffer;
|
||||
static ShaderProgram oitCompositeProgram;
|
||||
|
||||
static Matrix4f nearVolumeProjectionMatrix = new Matrix4f();
|
||||
static Matrix4f midVolumeProjectionMatrix = new Matrix4f();
|
||||
static Matrix4f farVolumeProjectionMatrix = new Matrix4f();
|
||||
@ -223,10 +255,17 @@ public class RenderingEngine {
|
||||
// screenTextureShaders = ShaderProgram.loadSpecificShader("/Shaders/screentexture/drawDepthBuffer/drawDepthBuffer.vs", "/Shaders/screentexture/drawDepthBuffer/drawDepthBuffer.fs");
|
||||
|
||||
//generate framebuffers
|
||||
screenFramebuffer = FramebufferUtils.generateScreensizeTextureFramebuffer();
|
||||
screenTextureColor = FramebufferUtils.generateScreenTextureColor(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
screenTextureDepth = FramebufferUtils.generateScreenTextureDepth(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
screenFramebuffer = FramebufferUtils.generateScreenTextureFramebuffer(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, screenTextureColor, screenTextureDepth);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, GL_DEFAULT_FRAMEBUFFER);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, GL_DEFAULT_RENDERBUFFER);
|
||||
|
||||
//
|
||||
//Channel debug program
|
||||
//
|
||||
drawChannel = ShaderProgram.loadSpecificShader("/Shaders/screentexture/drawChannel/drawChannel.vs", "/Shaders/screentexture/drawChannel/drawChannel.fs");
|
||||
|
||||
//
|
||||
//create light depth framebuffer/shader for shadowmapping
|
||||
//
|
||||
@ -244,10 +283,19 @@ public class RenderingEngine {
|
||||
volumeDepthBackfaceFramebuffer = FramebufferUtils.generateDepthBuffer(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, volumeDepthBackfaceTexture);
|
||||
volumeDepthFrontfaceTexture = FramebufferUtils.generateDepthBufferTexture(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
volumeDepthFrontfaceFramebuffer = FramebufferUtils.generateDepthBuffer(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, volumeDepthFrontfaceTexture);
|
||||
|
||||
//
|
||||
//Transparency framebuffers
|
||||
//
|
||||
transparencyAccumulatorClear = new float[]{0.0f, 0.0f, 0.0f, 0.0f};
|
||||
transparencyAccumulatorTexture = FramebufferUtils.generateOITAccumulatorTexture(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
transparencyRevealageClear = new float[]{1.0f, 0.0f, 0.0f, 0.0f};
|
||||
transparencyRevealageTexture = FramebufferUtils.generateOITRevealageTexture(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
transparencyBuffer = FramebufferUtils.generateOITFramebuffer(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, transparencyAccumulatorTexture, transparencyRevealageTexture, screenTextureDepth);
|
||||
oitCompositeProgram = ShaderProgram.loadSpecificShader("Shaders/oit/composite.vs", "Shaders/oit/composite.fs");
|
||||
|
||||
//projection matrices
|
||||
nearVolumeProjectionMatrix.setPerspective((float)(Globals.verticalFOV * Math.PI /180.0f), (float)Globals.WINDOW_WIDTH / (float)Globals.WINDOW_HEIGHT, 0.1f, 100);
|
||||
// midVolumeProjectionMatrix.setPerspective((float)(Globals.verticalFOV * Math.PI /180.0f), (float)Globals.WINDOW_WIDTH / (float)Globals.WINDOW_HEIGHT, 0.01f, 7);
|
||||
// farVolumeProjectionMatrix.setPerspective((float)(Globals.verticalFOV * Math.PI /180.0f), (float)Globals.WINDOW_WIDTH / (float)Globals.WINDOW_HEIGHT, 0.1f, 50);
|
||||
|
||||
|
||||
//instantiate light manager
|
||||
@ -489,16 +537,22 @@ public class RenderingEngine {
|
||||
//bind screen fbo
|
||||
screenFramebuffer.bind();
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthFunc(GL_LESS);
|
||||
glDepthMask(true);
|
||||
glViewport(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
|
||||
///
|
||||
/// R E N D E R I N G S T U F F
|
||||
///
|
||||
//Sets the background color.
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
|
||||
//
|
||||
// Pass One: Solids
|
||||
//
|
||||
|
||||
//
|
||||
// D R A W A L L E N T I T I E S
|
||||
//
|
||||
@ -506,15 +560,14 @@ public class RenderingEngine {
|
||||
modelTransformMatrix = new Matrix4f();
|
||||
for(Entity currentEntity : Globals.entityManager.getDrawable()){
|
||||
Vector3d position = EntityUtils.getPosition(currentEntity);
|
||||
if((boolean)currentEntity.getData(EntityDataStrings.DATA_STRING_DRAW) && drawPoint(cameraPos,new Vector3f((float)position.x,(float)position.y,(float)position.z))){
|
||||
if(
|
||||
(boolean)currentEntity.getData(EntityDataStrings.DATA_STRING_DRAW) &&
|
||||
currentEntity.getData(EntityDataStrings.DRAW_SOLID_PASS) != null &&
|
||||
drawPoint(cameraPos,new Vector3f((float)position.x,(float)position.y,(float)position.z))
|
||||
){
|
||||
//fetch actor
|
||||
Actor currentActor = EntityUtils.getActor(currentEntity);
|
||||
currentActor.incrementAnimationTime(0.001);
|
||||
//increment animations
|
||||
//this is incremented in the shadow calculations
|
||||
// if(currentActor.getCurrentAnimation() != null){
|
||||
// currentActor.incrementAnimationTime(deltaTime * 500);
|
||||
// }
|
||||
//calculate camera-modified vector3f
|
||||
Vector3f cameraModifiedPosition = new Vector3f((float)position.x,(float)position.y,(float)position.z).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera));
|
||||
//calculate and apply model transform
|
||||
@ -525,22 +578,77 @@ public class RenderingEngine {
|
||||
currentActor.applyModelMatrix(modelTransformMatrix);
|
||||
//draw
|
||||
currentActor.draw();
|
||||
|
||||
// Model currentModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(currentEntity));
|
||||
// if(currentModel != null){
|
||||
// if(currentModel.currentAnimation != null){
|
||||
// currentModel.incrementTime(deltaTime * 500);
|
||||
// }
|
||||
// currentModel.modelMatrix = new Matrix4f();
|
||||
// currentModel.modelMatrix.translate(new Vector3f(EntityUtils.getEntityPosition(currentEntity)).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera)).sub(new Vector3f(0,1,0)));
|
||||
// currentModel.modelMatrix.rotate(EntityUtils.getEntityRotation(currentEntity));
|
||||
// currentModel.modelMatrix.scale(EntityUtils.getEntityScale(currentEntity));
|
||||
// currentModel.draw();
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Pass Two: Transparency Accumulator + Revealage
|
||||
//
|
||||
glDepthMask(false);
|
||||
glDepthFunc(GL_LESS);
|
||||
// glDepthFunc(GL_GREATER);
|
||||
// glDepthFunc(GL_ALWAYS);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunci(0, GL_ONE, GL_ONE);
|
||||
glBlendFunci(1, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
|
||||
glBlendEquation(GL_FUNC_ADD);
|
||||
|
||||
transparencyBuffer.bind();
|
||||
glClearBufferfv(GL_COLOR,0,transparencyAccumulatorClear);
|
||||
glClearBufferfv(GL_COLOR,1,transparencyRevealageClear);
|
||||
|
||||
|
||||
for(Entity currentEntity : Globals.entityManager.getDrawable()){
|
||||
Vector3d position = EntityUtils.getPosition(currentEntity);
|
||||
if(
|
||||
(boolean)currentEntity.getData(EntityDataStrings.DATA_STRING_DRAW) &&
|
||||
currentEntity.getData(EntityDataStrings.DRAW_TRANSPARENT_PASS) != null &&
|
||||
drawPoint(cameraPos,new Vector3f((float)position.x,(float)position.y,(float)position.z))
|
||||
){
|
||||
//fetch actor
|
||||
Actor currentActor = EntityUtils.getActor(currentEntity);
|
||||
currentActor.incrementAnimationTime(0.001);
|
||||
//calculate camera-modified vector3f
|
||||
Vector3f cameraModifiedPosition = new Vector3f((float)position.x,(float)position.y,(float)position.z).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera));
|
||||
//calculate and apply model transform
|
||||
modelTransformMatrix.identity();
|
||||
modelTransformMatrix.translate(cameraModifiedPosition);
|
||||
modelTransformMatrix.rotate(EntityUtils.getRotation(currentEntity));
|
||||
modelTransformMatrix.scale(EntityUtils.getScale(currentEntity));
|
||||
currentActor.applyModelMatrix(modelTransformMatrix);
|
||||
//draw
|
||||
currentActor.draw();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Pass Three: Composite transparency on top of solids
|
||||
//
|
||||
glDepthFunc(GL_ALWAYS);
|
||||
// glDepthMask(false);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
|
||||
screenFramebuffer.bind();
|
||||
Globals.renderingEngine.setActiveShader(oitCompositeProgram);
|
||||
|
||||
glBindVertexArray(screenTextureVAO);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE3);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, transparencyAccumulatorTexture.getTexturePointer());
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, transparencyRevealageTexture.getTexturePointer());
|
||||
|
||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||
glBindVertexArray(0);
|
||||
|
||||
// glBindVertexArray(0);
|
||||
}
|
||||
@ -732,6 +840,18 @@ public class RenderingEngine {
|
||||
glBindTexture(GL_TEXTURE_2D, volumeDepthBackfaceTexture.getTexturePointer());
|
||||
} else if(outputFramebuffer == 3){
|
||||
glBindTexture(GL_TEXTURE_2D, volumeDepthFrontfaceTexture.getTexturePointer());
|
||||
} else if(outputFramebuffer == 4){
|
||||
glBindTexture(GL_TEXTURE_2D, transparencyAccumulatorTexture.getTexturePointer());
|
||||
} else if(outputFramebuffer == 5){
|
||||
glBindTexture(GL_TEXTURE_2D, transparencyRevealageTexture.getTexturePointer());
|
||||
} else if(outputFramebuffer == 6){
|
||||
Globals.renderingEngine.setActiveShader(drawChannel);
|
||||
glUniform1f(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "channel"),0);
|
||||
glBindTexture(GL_TEXTURE_2D, transparencyRevealageTexture.getTexturePointer());
|
||||
} else if(outputFramebuffer == 7){
|
||||
Globals.renderingEngine.setActiveShader(drawChannel);
|
||||
glUniform1f(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "channel"),4);
|
||||
glBindTexture(GL_TEXTURE_2D, screenTextureDepth.getTexturePointer());
|
||||
}
|
||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||
glBindVertexArray(0);
|
||||
@ -766,6 +886,8 @@ public class RenderingEngine {
|
||||
//set the viewport to shadow map size
|
||||
glViewport(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthFunc(GL_LESS);
|
||||
glDepthMask(true);
|
||||
|
||||
//stop rendering front faces
|
||||
GL15.glEnable(GL15.GL_CULL_FACE);
|
||||
@ -966,7 +1088,7 @@ public class RenderingEngine {
|
||||
|
||||
public static void incrementOutputFramebuffer(){
|
||||
outputFramebuffer++;
|
||||
if(outputFramebuffer > 3){
|
||||
if(outputFramebuffer > 7){
|
||||
outputFramebuffer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@ import electrosphere.logger.LoggerInterface;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import org.lwjgl.opengl.GL30;
|
||||
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
|
||||
import static org.lwjgl.opengl.GL30.GL_DRAW_FRAMEBUFFER;
|
||||
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER_COMPLETE;
|
||||
import static org.lwjgl.opengl.GL30.glBindFramebuffer;
|
||||
import static org.lwjgl.opengl.GL30.glCheckFramebufferStatus;
|
||||
|
||||
@ -4,9 +4,13 @@ import electrosphere.logger.LoggerInterface;
|
||||
import electrosphere.main.Globals;
|
||||
import electrosphere.renderer.texture.Texture;
|
||||
|
||||
import java.nio.IntBuffer;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.lwjgl.BufferUtils;
|
||||
|
||||
import static org.lwjgl.opengl.GL11.GL_DEPTH_COMPONENT;
|
||||
import static org.lwjgl.opengl.GL11.GL_FLOAT;
|
||||
import static org.lwjgl.opengl.GL11.GL_LINEAR;
|
||||
@ -31,13 +35,20 @@ import static org.lwjgl.opengl.GL11.glTexParameterfv;
|
||||
import static org.lwjgl.opengl.GL11.glTexParameteri;
|
||||
import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE;
|
||||
import static org.lwjgl.opengl.GL13.GL_CLAMP_TO_BORDER;
|
||||
import static org.lwjgl.opengl.GL20.glDrawBuffers;
|
||||
import static org.lwjgl.opengl.GL30.GL_COLOR_ATTACHMENT0;
|
||||
import static org.lwjgl.opengl.GL30.GL_COLOR_ATTACHMENT1;
|
||||
import static org.lwjgl.opengl.GL30.GL_DEPTH24_STENCIL8;
|
||||
import static org.lwjgl.opengl.GL30.GL_DEPTH_ATTACHMENT;
|
||||
import static org.lwjgl.opengl.GL30.GL_DEPTH_STENCIL_ATTACHMENT;
|
||||
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
|
||||
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER_COMPLETE;
|
||||
import static org.lwjgl.opengl.GL30.GL_RENDERBUFFER;
|
||||
import static org.lwjgl.opengl.GL30.GL_RGBA16F;
|
||||
import static org.lwjgl.opengl.GL30.GL_HALF_FLOAT;
|
||||
import static org.lwjgl.opengl.GL30.GL_R8;
|
||||
import static org.lwjgl.opengl.GL30.GL_RED;
|
||||
import static org.lwjgl.opengl.GL30.glBindFramebuffer;
|
||||
import static org.lwjgl.opengl.GL30.glBindRenderbuffer;
|
||||
import static org.lwjgl.opengl.GL30.glCheckFramebufferStatus;
|
||||
import static org.lwjgl.opengl.GL30.glFramebufferRenderbuffer;
|
||||
@ -51,8 +62,58 @@ import static org.lwjgl.system.MemoryUtil.NULL;
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class FramebufferUtils {
|
||||
|
||||
public static Texture generateScreenTextureColor(int width, int height){
|
||||
int texturePtr = glGenTextures();
|
||||
glBindTexture(GL_TEXTURE_2D,texturePtr);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
//these make sure the texture actually clamps to the borders of the quad
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
Texture texture = new Texture(texturePtr);
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
public static Texture generateScreenTextureDepth(int width, int height){
|
||||
int texturePtr = glGenTextures();
|
||||
glBindTexture(GL_TEXTURE_2D,texturePtr);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
|
||||
|
||||
Texture texture = new Texture(texturePtr);
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
|
||||
public static Framebuffer generateScreenTextureFramebuffer(int width, int height, Texture colorTexture, Texture depthTexture){
|
||||
Framebuffer buffer = new Framebuffer();
|
||||
buffer.bind();
|
||||
//texture
|
||||
// int texture = glGenTextures();
|
||||
// glBindTexture(GL_TEXTURE_2D,texture);
|
||||
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
|
||||
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
// //these make sure the texture actually clamps to the borders of the quad
|
||||
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
buffer.setTexturePointer(colorTexture.getTexturePointer());
|
||||
//bind texture to fbo
|
||||
int mipMapLevel = 0;
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture.getTexturePointer(), mipMapLevel);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture.getTexturePointer(), mipMapLevel);
|
||||
//check make sure compiled
|
||||
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
|
||||
System.out.println("Framebuffer is not complete!");
|
||||
}
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
public static Framebuffer generateScreensizeTextureFramebuffer(){
|
||||
Framebuffer buffer = new Framebuffer();
|
||||
buffer.bind();
|
||||
@ -202,5 +263,61 @@ public class FramebufferUtils {
|
||||
return buffer;
|
||||
}
|
||||
|
||||
public static Texture generateOITAccumulatorTexture(int width, int height){
|
||||
int texturePtr = glGenTextures();
|
||||
glBindTexture(GL_TEXTURE_2D,texturePtr);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_HALF_FLOAT, NULL);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
||||
Texture texture = new Texture(texturePtr);
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
public static Texture generateOITRevealageTexture(int width, int height){
|
||||
int texturePtr = glGenTextures();
|
||||
glBindTexture(GL_TEXTURE_2D,texturePtr);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, width, height, 0, GL_RED, GL_FLOAT, NULL);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
||||
Texture texture = new Texture(texturePtr);
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
public static Framebuffer generateOITFramebuffer(int width, int height, Texture accumulatorTex, Texture revealageTex, Texture depthTexture){
|
||||
Framebuffer buffer = new Framebuffer();
|
||||
buffer.bind();
|
||||
|
||||
|
||||
//texture
|
||||
buffer.setTexturePointer(accumulatorTex.getTexturePointer());
|
||||
|
||||
//bind texture to fbo
|
||||
int mipMapLevel = 0;
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, accumulatorTex.getTexturePointer(), mipMapLevel);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, revealageTex.getTexturePointer(), mipMapLevel);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture.getTexturePointer(), mipMapLevel);
|
||||
|
||||
// const GLenum transparentDrawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
|
||||
// glDrawBuffers(2, transparentDrawBuffers);
|
||||
IntBuffer drawBuffers = BufferUtils.createIntBuffer(2);
|
||||
drawBuffers.put(GL_COLOR_ATTACHMENT0);
|
||||
drawBuffers.put(GL_COLOR_ATTACHMENT1);
|
||||
drawBuffers.flip();
|
||||
glDrawBuffers(drawBuffers);
|
||||
|
||||
//check make sure compiled
|
||||
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
|
||||
System.out.println("Framebuffer is not complete!");
|
||||
}
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user