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
|
||||||
#version 330 core
|
#version 420 core
|
||||||
|
|
||||||
//macros
|
//macros
|
||||||
#extension GL_ARB_explicit_uniform_location : enable
|
#extension GL_ARB_explicit_uniform_location : enable
|
||||||
|
|
||||||
//output
|
//output
|
||||||
out vec4 fragColor;
|
// out vec4 fragColor;
|
||||||
|
|
||||||
|
layout (location = 0) out vec4 accum;
|
||||||
|
layout (location = 1) out float reveal;
|
||||||
|
|
||||||
//input
|
//input
|
||||||
in vec3 FragPos;
|
in vec3 FragPos;
|
||||||
@ -49,6 +52,7 @@ in vec4 modelCoord;
|
|||||||
uniform float time;
|
uniform float time;
|
||||||
|
|
||||||
//layout uniforms
|
//layout uniforms
|
||||||
|
layout (location = 3) uniform sampler2D shadowMap;
|
||||||
layout (location = 5) uniform sampler2D volumeDepthFrontface;
|
layout (location = 5) uniform sampler2D volumeDepthFrontface;
|
||||||
layout (location = 6) uniform sampler2D volumeDepthBackface;
|
layout (location = 6) uniform sampler2D volumeDepthBackface;
|
||||||
|
|
||||||
@ -104,6 +108,8 @@ void main(){
|
|||||||
float blue = 0.7366;
|
float blue = 0.7366;
|
||||||
float alpha = volume * 10.0;
|
float alpha = volume * 10.0;
|
||||||
|
|
||||||
|
// alpha = 0.5;
|
||||||
|
|
||||||
// float red = volume * 10.0;
|
// float red = volume * 10.0;
|
||||||
// float green = volume * 10.0;
|
// float green = volume * 10.0;
|
||||||
// float blue = volume * 10.0;
|
// float blue = volume * 10.0;
|
||||||
@ -115,13 +121,26 @@ void main(){
|
|||||||
blue,
|
blue,
|
||||||
alpha
|
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){
|
// if(val < 0.3){
|
||||||
// discard;
|
// discard;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// Output to screen
|
// Output to screen
|
||||||
fragColor = color;
|
// fragColor = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
//Vertex Shader
|
//Vertex Shader
|
||||||
#version 330 core
|
#version 420 core
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -40,5 +40,8 @@ void main() {
|
|||||||
modelCoord = FinalVertex;
|
modelCoord = FinalVertex;
|
||||||
|
|
||||||
//set final position with opengl space
|
//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"));
|
EntityUtils.getActor(water).addTextureMask(RenderUtils.generateVolumetricTextureMask("Cube"));
|
||||||
//set draw volumetric
|
//set draw volumetric
|
||||||
water.putData(EntityDataStrings.DRAW_VOLUMETRIC, true);
|
water.putData(EntityDataStrings.DRAW_VOLUMETRIC, true);
|
||||||
|
water.removeData(EntityDataStrings.DRAW_SOLID_PASS);
|
||||||
|
water.putData(EntityDataStrings.DRAW_TRANSPARENT_PASS, true);
|
||||||
|
|
||||||
|
|
||||||
// goblin = CreatureUtils.spawnBasicCreature("Goblin");
|
// 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_MODEL_PATH = "modelPath";
|
||||||
public static final String DATA_STRING_ACTOR = "actor";
|
public static final String DATA_STRING_ACTOR = "actor";
|
||||||
public static final String DATA_STRING_DRAW = "drawFlag";
|
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_CAST_SHADOW = "castShadow";
|
||||||
public static final String DRAW_VOLUMETRIC = "drawVolumetric";
|
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_ROTATION, new Quaternionf().identity());
|
||||||
rVal.putData(EntityDataStrings.DATA_STRING_SCALE, new Vector3f(1,1,1));
|
rVal.putData(EntityDataStrings.DATA_STRING_SCALE, new Vector3f(1,1,1));
|
||||||
rVal.putData(EntityDataStrings.DATA_STRING_DRAW, true);
|
rVal.putData(EntityDataStrings.DATA_STRING_DRAW, true);
|
||||||
|
rVal.putData(EntityDataStrings.DRAW_SOLID_PASS, true);
|
||||||
Globals.entityManager.registerEntity(rVal);
|
Globals.entityManager.registerEntity(rVal);
|
||||||
Globals.entityManager.registerDrawableEntity(rVal);
|
Globals.entityManager.registerDrawableEntity(rVal);
|
||||||
return 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_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_SCALE, new Vector3f(1,1,1));
|
||||||
rVal.putData(EntityDataStrings.DATA_STRING_DRAW, true);
|
rVal.putData(EntityDataStrings.DATA_STRING_DRAW, true);
|
||||||
|
rVal.putData(EntityDataStrings.DRAW_SOLID_PASS, true);
|
||||||
Globals.entityManager.registerEntity(rVal);
|
Globals.entityManager.registerEntity(rVal);
|
||||||
Globals.entityManager.registerDrawableEntity(rVal);
|
Globals.entityManager.registerDrawableEntity(rVal);
|
||||||
return 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_FOG_START;
|
||||||
import static org.lwjgl.opengl.GL11.GL_LINEAR;
|
import static org.lwjgl.opengl.GL11.GL_LINEAR;
|
||||||
import static org.lwjgl.opengl.GL11.GL_NEAREST;
|
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_ONE_MINUS_SRC_ALPHA;
|
||||||
import static org.lwjgl.opengl.GL11.GL_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_TEXTURE_2D;
|
||||||
import static org.lwjgl.opengl.GL11.GL_TRIANGLES;
|
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.glBindTexture;
|
||||||
import static org.lwjgl.opengl.GL11.glBlendFunc;
|
import static org.lwjgl.opengl.GL11.glBlendFunc;
|
||||||
import static org.lwjgl.opengl.GL11.glClear;
|
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_TEXTURE2;
|
||||||
import static org.lwjgl.opengl.GL13.GL_TEXTURE3;
|
import static org.lwjgl.opengl.GL13.GL_TEXTURE3;
|
||||||
import static org.lwjgl.opengl.GL13.glActiveTexture;
|
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.glGetUniformLocation;
|
||||||
import static org.lwjgl.opengl.GL20.glUniformMatrix4fv;
|
import static org.lwjgl.opengl.GL20.glUniformMatrix4fv;
|
||||||
import static org.lwjgl.opengl.GL20.glUseProgram;
|
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_FRAMEBUFFER;
|
||||||
import static org.lwjgl.opengl.GL30.GL_RENDERBUFFER;
|
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.glBindFramebuffer;
|
||||||
import static org.lwjgl.opengl.GL30.glBindRenderbuffer;
|
import static org.lwjgl.opengl.GL30.glBindRenderbuffer;
|
||||||
import static org.lwjgl.opengl.GL30.glBindVertexArray;
|
import static org.lwjgl.opengl.GL30.glBindVertexArray;
|
||||||
import static org.lwjgl.opengl.GL30.glBlitFramebuffer;
|
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;
|
import static org.lwjgl.system.MemoryUtil.NULL;
|
||||||
|
|
||||||
public class RenderingEngine {
|
public class RenderingEngine {
|
||||||
@ -108,14 +127,27 @@ public class RenderingEngine {
|
|||||||
|
|
||||||
public static final int GL_DEFAULT_FRAMEBUFFER = 0;
|
public static final int GL_DEFAULT_FRAMEBUFFER = 0;
|
||||||
public static final int GL_DEFAULT_RENDERBUFFER = 0;
|
public static final int GL_DEFAULT_RENDERBUFFER = 0;
|
||||||
|
static Texture screenTextureColor;
|
||||||
|
static Texture screenTextureDepth;
|
||||||
static Framebuffer screenFramebuffer;
|
static Framebuffer screenFramebuffer;
|
||||||
static Renderbuffer screenRenderbuffer;
|
static Renderbuffer screenRenderbuffer;
|
||||||
static int screenTextureVAO;
|
static int screenTextureVAO;
|
||||||
static ShaderProgram screenTextureShaders;
|
static ShaderProgram screenTextureShaders;
|
||||||
|
|
||||||
|
static ShaderProgram drawChannel;
|
||||||
|
|
||||||
|
//depth framebuffer/shader for shadow mapping
|
||||||
static ShaderProgram lightDepthShaderProgram;
|
static ShaderProgram lightDepthShaderProgram;
|
||||||
static Framebuffer lightDepthBuffer;
|
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 nearVolumeProjectionMatrix = new Matrix4f();
|
||||||
static Matrix4f midVolumeProjectionMatrix = new Matrix4f();
|
static Matrix4f midVolumeProjectionMatrix = new Matrix4f();
|
||||||
static Matrix4f farVolumeProjectionMatrix = 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");
|
// screenTextureShaders = ShaderProgram.loadSpecificShader("/Shaders/screentexture/drawDepthBuffer/drawDepthBuffer.vs", "/Shaders/screentexture/drawDepthBuffer/drawDepthBuffer.fs");
|
||||||
|
|
||||||
//generate framebuffers
|
//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);
|
glBindFramebuffer(GL_FRAMEBUFFER, GL_DEFAULT_FRAMEBUFFER);
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, GL_DEFAULT_RENDERBUFFER);
|
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
|
//create light depth framebuffer/shader for shadowmapping
|
||||||
//
|
//
|
||||||
@ -244,10 +283,19 @@ public class RenderingEngine {
|
|||||||
volumeDepthBackfaceFramebuffer = FramebufferUtils.generateDepthBuffer(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, volumeDepthBackfaceTexture);
|
volumeDepthBackfaceFramebuffer = FramebufferUtils.generateDepthBuffer(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, volumeDepthBackfaceTexture);
|
||||||
volumeDepthFrontfaceTexture = FramebufferUtils.generateDepthBufferTexture(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
volumeDepthFrontfaceTexture = FramebufferUtils.generateDepthBufferTexture(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||||
volumeDepthFrontfaceFramebuffer = FramebufferUtils.generateDepthBuffer(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, volumeDepthFrontfaceTexture);
|
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
|
//projection matrices
|
||||||
nearVolumeProjectionMatrix.setPerspective((float)(Globals.verticalFOV * Math.PI /180.0f), (float)Globals.WINDOW_WIDTH / (float)Globals.WINDOW_HEIGHT, 0.1f, 100);
|
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
|
//instantiate light manager
|
||||||
@ -489,16 +537,22 @@ public class RenderingEngine {
|
|||||||
//bind screen fbo
|
//bind screen fbo
|
||||||
screenFramebuffer.bind();
|
screenFramebuffer.bind();
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDepthFunc(GL_LESS);
|
||||||
|
glDepthMask(true);
|
||||||
glViewport(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
glViewport(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||||
|
|
||||||
///
|
///
|
||||||
/// R E N D E R I N G S T U F F
|
/// R E N D E R I N G S T U F F
|
||||||
///
|
///
|
||||||
//Sets the background color.
|
//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);
|
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
|
// 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();
|
modelTransformMatrix = new Matrix4f();
|
||||||
for(Entity currentEntity : Globals.entityManager.getDrawable()){
|
for(Entity currentEntity : Globals.entityManager.getDrawable()){
|
||||||
Vector3d position = EntityUtils.getPosition(currentEntity);
|
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
|
//fetch actor
|
||||||
Actor currentActor = EntityUtils.getActor(currentEntity);
|
Actor currentActor = EntityUtils.getActor(currentEntity);
|
||||||
currentActor.incrementAnimationTime(0.001);
|
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
|
//calculate camera-modified vector3f
|
||||||
Vector3f cameraModifiedPosition = new Vector3f((float)position.x,(float)position.y,(float)position.z).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera));
|
Vector3f cameraModifiedPosition = new Vector3f((float)position.x,(float)position.y,(float)position.z).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera));
|
||||||
//calculate and apply model transform
|
//calculate and apply model transform
|
||||||
@ -525,22 +578,77 @@ public class RenderingEngine {
|
|||||||
currentActor.applyModelMatrix(modelTransformMatrix);
|
currentActor.applyModelMatrix(modelTransformMatrix);
|
||||||
//draw
|
//draw
|
||||||
currentActor.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);
|
// glBindVertexArray(0);
|
||||||
}
|
}
|
||||||
@ -732,6 +840,18 @@ public class RenderingEngine {
|
|||||||
glBindTexture(GL_TEXTURE_2D, volumeDepthBackfaceTexture.getTexturePointer());
|
glBindTexture(GL_TEXTURE_2D, volumeDepthBackfaceTexture.getTexturePointer());
|
||||||
} else if(outputFramebuffer == 3){
|
} else if(outputFramebuffer == 3){
|
||||||
glBindTexture(GL_TEXTURE_2D, volumeDepthFrontfaceTexture.getTexturePointer());
|
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);
|
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
@ -766,6 +886,8 @@ public class RenderingEngine {
|
|||||||
//set the viewport to shadow map size
|
//set the viewport to shadow map size
|
||||||
glViewport(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
glViewport(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDepthFunc(GL_LESS);
|
||||||
|
glDepthMask(true);
|
||||||
|
|
||||||
//stop rendering front faces
|
//stop rendering front faces
|
||||||
GL15.glEnable(GL15.GL_CULL_FACE);
|
GL15.glEnable(GL15.GL_CULL_FACE);
|
||||||
@ -966,7 +1088,7 @@ public class RenderingEngine {
|
|||||||
|
|
||||||
public static void incrementOutputFramebuffer(){
|
public static void incrementOutputFramebuffer(){
|
||||||
outputFramebuffer++;
|
outputFramebuffer++;
|
||||||
if(outputFramebuffer > 3){
|
if(outputFramebuffer > 7){
|
||||||
outputFramebuffer = 0;
|
outputFramebuffer = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import electrosphere.logger.LoggerInterface;
|
|||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import org.lwjgl.opengl.GL30;
|
import org.lwjgl.opengl.GL30;
|
||||||
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
|
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.GL_FRAMEBUFFER_COMPLETE;
|
||||||
import static org.lwjgl.opengl.GL30.glBindFramebuffer;
|
import static org.lwjgl.opengl.GL30.glBindFramebuffer;
|
||||||
import static org.lwjgl.opengl.GL30.glCheckFramebufferStatus;
|
import static org.lwjgl.opengl.GL30.glCheckFramebufferStatus;
|
||||||
|
|||||||
@ -4,9 +4,13 @@ import electrosphere.logger.LoggerInterface;
|
|||||||
import electrosphere.main.Globals;
|
import electrosphere.main.Globals;
|
||||||
import electrosphere.renderer.texture.Texture;
|
import electrosphere.renderer.texture.Texture;
|
||||||
|
|
||||||
|
import java.nio.IntBuffer;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
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_DEPTH_COMPONENT;
|
||||||
import static org.lwjgl.opengl.GL11.GL_FLOAT;
|
import static org.lwjgl.opengl.GL11.GL_FLOAT;
|
||||||
import static org.lwjgl.opengl.GL11.GL_LINEAR;
|
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.GL11.glTexParameteri;
|
||||||
import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE;
|
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.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_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_DEPTH24_STENCIL8;
|
||||||
import static org.lwjgl.opengl.GL30.GL_DEPTH_ATTACHMENT;
|
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_DEPTH_STENCIL_ATTACHMENT;
|
||||||
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
|
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
|
||||||
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER_COMPLETE;
|
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER_COMPLETE;
|
||||||
import static org.lwjgl.opengl.GL30.GL_RENDERBUFFER;
|
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.glBindRenderbuffer;
|
||||||
import static org.lwjgl.opengl.GL30.glCheckFramebufferStatus;
|
import static org.lwjgl.opengl.GL30.glCheckFramebufferStatus;
|
||||||
import static org.lwjgl.opengl.GL30.glFramebufferRenderbuffer;
|
import static org.lwjgl.opengl.GL30.glFramebufferRenderbuffer;
|
||||||
@ -51,8 +62,58 @@ import static org.lwjgl.system.MemoryUtil.NULL;
|
|||||||
* @author amaterasu
|
* @author amaterasu
|
||||||
*/
|
*/
|
||||||
public class FramebufferUtils {
|
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(){
|
public static Framebuffer generateScreensizeTextureFramebuffer(){
|
||||||
Framebuffer buffer = new Framebuffer();
|
Framebuffer buffer = new Framebuffer();
|
||||||
buffer.bind();
|
buffer.bind();
|
||||||
@ -202,5 +263,61 @@ public class FramebufferUtils {
|
|||||||
return buffer;
|
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