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