shadow map properly rendering
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
This commit is contained in:
parent
9c4fef260d
commit
f9d3541ce8
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_FragDepth = gl_FragCoord.z;
|
// gl_FragDepth = gl_FragCoord.z;
|
||||||
}
|
}
|
||||||
@ -1,3 +1,3 @@
|
|||||||
#maven.buildNumber.plugin properties file
|
#maven.buildNumber.plugin properties file
|
||||||
#Thu Aug 29 22:01:29 EDT 2024
|
#Mon Sep 02 15:21:11 EDT 2024
|
||||||
buildNumber=305
|
buildNumber=315
|
||||||
|
|||||||
45
src/main/java/electrosphere/menu/debug/ImGuiRenderer.java
Normal file
45
src/main/java/electrosphere/menu/debug/ImGuiRenderer.java
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
package electrosphere.menu.debug;
|
||||||
|
|
||||||
|
import electrosphere.engine.Globals;
|
||||||
|
import electrosphere.renderer.pipelines.ShadowMapPipeline;
|
||||||
|
import electrosphere.renderer.ui.imgui.ImGuiWindow;
|
||||||
|
import electrosphere.renderer.ui.imgui.ImGuiWindow.ImGuiWindowCallback;
|
||||||
|
import imgui.ImGui;
|
||||||
|
|
||||||
|
public class ImGuiRenderer {
|
||||||
|
|
||||||
|
//window for viewing information about loggers
|
||||||
|
protected static ImGuiWindow rendererWindow;
|
||||||
|
|
||||||
|
//stores far plane
|
||||||
|
private static float[] farPlaneArr = new float[]{1};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the windows in this file
|
||||||
|
*/
|
||||||
|
protected static void createRendererWindows(){
|
||||||
|
createRendererWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* loggers view
|
||||||
|
*/
|
||||||
|
protected static void createRendererWindow(){
|
||||||
|
rendererWindow = new ImGuiWindow("Renderer");
|
||||||
|
rendererWindow.setCallback(new ImGuiWindowCallback() {
|
||||||
|
@Override
|
||||||
|
public void exec() {
|
||||||
|
if(ImGui.collapsingHeader("Shadow Map Pipeline")){
|
||||||
|
ShadowMapPipeline shadowMapPipeline = Globals.renderingEngine.getShadowMapPipeline();
|
||||||
|
if(ImGui.sliderFloat("Far Plane Distance", farPlaneArr, 1, 100)){
|
||||||
|
shadowMapPipeline.setFarPlane(farPlaneArr[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
rendererWindow.setOpen(false);
|
||||||
|
Globals.renderingEngine.getImGuiPipeline().addImGuiWindow(rendererWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -47,6 +47,7 @@ public class ImGuiWindowMacros {
|
|||||||
ImGuiAI.createAIDebugWindow();
|
ImGuiAI.createAIDebugWindow();
|
||||||
ImGuiAudio.createAudioDebugMenu();
|
ImGuiAudio.createAudioDebugMenu();
|
||||||
ImGuiLogger.createLoggersWindows();
|
ImGuiLogger.createLoggersWindows();
|
||||||
|
ImGuiRenderer.createRendererWindows();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -161,6 +162,10 @@ public class ImGuiWindowMacros {
|
|||||||
if(ImGui.button("Loggers")){
|
if(ImGui.button("Loggers")){
|
||||||
ImGuiLogger.loggersWindow.setOpen(true);
|
ImGuiLogger.loggersWindow.setOpen(true);
|
||||||
}
|
}
|
||||||
|
//logger state control
|
||||||
|
if(ImGui.button("Renderers")){
|
||||||
|
ImGuiRenderer.rendererWindow.setOpen(true);
|
||||||
|
}
|
||||||
//close button
|
//close button
|
||||||
if(ImGui.button("Close")){
|
if(ImGui.button("Close")){
|
||||||
mainDebugWindow.setOpen(false);
|
mainDebugWindow.setOpen(false);
|
||||||
|
|||||||
@ -340,7 +340,7 @@ public class RenderingEngine {
|
|||||||
screenTextureDepth = FramebufferUtils.generateScreenTextureDepth(openGLState, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
screenTextureDepth = FramebufferUtils.generateScreenTextureDepth(openGLState, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||||
screenFramebuffer = FramebufferUtils.generateScreenTextureFramebuffer(openGLState, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, screenTextureColor, screenTextureDepth);
|
screenFramebuffer = FramebufferUtils.generateScreenTextureFramebuffer(openGLState, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, screenTextureColor, screenTextureDepth);
|
||||||
defaultFramebuffer.bind(openGLState);
|
defaultFramebuffer.bind(openGLState);
|
||||||
// glBindRenderbuffer(GL_RENDERBUFFER, GL_DEFAULT_RENDERBUFFER);
|
glBindRenderbuffer(GL_RENDERBUFFER, GL_DEFAULT_RENDERBUFFER);
|
||||||
Globals.renderingEngine.checkError();
|
Globals.renderingEngine.checkError();
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -637,6 +637,14 @@ public class RenderingEngine {
|
|||||||
return renderPipelineState;
|
return renderPipelineState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the shadow map pipeline
|
||||||
|
* @return The shadow map pipeline
|
||||||
|
*/
|
||||||
|
public ShadowMapPipeline getShadowMapPipeline(){
|
||||||
|
return this.shadowMapPipeline;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the current opengl state
|
* Gets the current opengl state
|
||||||
* @return
|
* @return
|
||||||
|
|||||||
@ -103,6 +103,9 @@ public class Framebuffer {
|
|||||||
return glCheckNamedFramebufferStatus(framebufferPointer,GL40.GL_FRAMEBUFFER) == 0;
|
return glCheckNamedFramebufferStatus(framebufferPointer,GL40.GL_FRAMEBUFFER) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks the status of the framebuffer
|
||||||
|
*/
|
||||||
public void checkStatus(){
|
public void checkStatus(){
|
||||||
if(this.isError()){
|
if(this.isError()){
|
||||||
LoggerInterface.loggerRenderer.WARNING("Framebuffer [glError] - " + RenderingEngine.getErrorInEnglish(Globals.renderingEngine.getError()));
|
LoggerInterface.loggerRenderer.WARNING("Framebuffer [glError] - " + RenderingEngine.getErrorInEnglish(Globals.renderingEngine.getError()));
|
||||||
@ -226,8 +229,6 @@ public class Framebuffer {
|
|||||||
* @param texturePointer The depth attachment's pointer
|
* @param texturePointer The depth attachment's pointer
|
||||||
*/
|
*/
|
||||||
public void setDepthAttachment(OpenGLState openGLState, Texture depthTexture){
|
public void setDepthAttachment(OpenGLState openGLState, Texture depthTexture){
|
||||||
openGLState.glBindFramebuffer(GL40.GL_FRAMEBUFFER, this.framebufferPointer);
|
|
||||||
this.depthTexture = depthTexture;
|
|
||||||
if(this.framebufferPointer == Framebuffer.DEFAULT_FRAMEBUFFER_POINTER){
|
if(this.framebufferPointer == Framebuffer.DEFAULT_FRAMEBUFFER_POINTER){
|
||||||
throw new IllegalStateException("Trying to attach image to default frame buffer!");
|
throw new IllegalStateException("Trying to attach image to default frame buffer!");
|
||||||
}
|
}
|
||||||
@ -237,7 +238,9 @@ public class Framebuffer {
|
|||||||
if(!GL40.glIsTexture(depthTexture.getTexturePointer())){
|
if(!GL40.glIsTexture(depthTexture.getTexturePointer())){
|
||||||
throw new IllegalStateException("Tried to attach incomplete texture to framebuffer!");
|
throw new IllegalStateException("Tried to attach incomplete texture to framebuffer!");
|
||||||
}
|
}
|
||||||
GL40.glFramebufferTexture2D(GL40.GL_FRAMEBUFFER, GL40.GL_DEPTH_ATTACHMENT, GL40.GL_TEXTURE_2D, depthTexture.getTexturePointer(), 0);
|
this.depthTexture = depthTexture;
|
||||||
|
openGLState.glBindFramebuffer(GL40.GL_FRAMEBUFFER, this.framebufferPointer);
|
||||||
|
GL40.glFramebufferTexture2D(GL40.GL_FRAMEBUFFER, GL40.GL_DEPTH_ATTACHMENT, GL40.GL_TEXTURE_2D, this.depthTexture.getTexturePointer(), 0);
|
||||||
Globals.renderingEngine.checkError();
|
Globals.renderingEngine.checkError();
|
||||||
Globals.renderingEngine.defaultFramebuffer.bind(openGLState);
|
Globals.renderingEngine.defaultFramebuffer.bind(openGLState);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package electrosphere.renderer.framebuffer;
|
|||||||
|
|
||||||
import electrosphere.engine.Globals;
|
import electrosphere.engine.Globals;
|
||||||
import electrosphere.renderer.OpenGLState;
|
import electrosphere.renderer.OpenGLState;
|
||||||
|
import electrosphere.renderer.pipelines.ShadowMapPipeline;
|
||||||
import electrosphere.renderer.texture.Texture;
|
import electrosphere.renderer.texture.Texture;
|
||||||
|
|
||||||
import java.nio.IntBuffer;
|
import java.nio.IntBuffer;
|
||||||
@ -51,6 +52,7 @@ public class FramebufferUtils {
|
|||||||
//these make sure the texture actually clamps to the borders of the quad
|
//these make sure the texture actually clamps to the borders of the quad
|
||||||
texture.setWrap(openGLState, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
texture.setWrap(openGLState, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
texture.setWrap(openGLState, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
texture.setWrap(openGLState, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
texture.setBorderColor(openGLState, new float[]{0,0,0,1});
|
||||||
|
|
||||||
//guarantees that the texture object has actually been created (calling gen buffers does not guarantee object creation)
|
//guarantees that the texture object has actually been created (calling gen buffers does not guarantee object creation)
|
||||||
texture.bind(openGLState);
|
texture.bind(openGLState);
|
||||||
@ -68,6 +70,7 @@ public class FramebufferUtils {
|
|||||||
//these make sure the texture actually clamps to the borders of the quad
|
//these make sure the texture actually clamps to the borders of the quad
|
||||||
texture.setWrap(openGLState, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
texture.setWrap(openGLState, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
texture.setWrap(openGLState, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
texture.setWrap(openGLState, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
texture.setBorderColor(openGLState, new float[]{0,0,0,1});
|
||||||
|
|
||||||
//guarantees that the texture object has actually been created (calling gen buffers does not guarantee object creation)
|
//guarantees that the texture object has actually been created (calling gen buffers does not guarantee object creation)
|
||||||
texture.bind(openGLState);
|
texture.bind(openGLState);
|
||||||
@ -86,6 +89,7 @@ public class FramebufferUtils {
|
|||||||
//these make sure the texture actually clamps to the borders of the quad
|
//these make sure the texture actually clamps to the borders of the quad
|
||||||
texture.setWrap(openGLState, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
texture.setWrap(openGLState, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
texture.setWrap(openGLState, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
texture.setWrap(openGLState, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
texture.setBorderColor(openGLState, new float[]{0,0,0,1});
|
||||||
|
|
||||||
//guarantees that the texture object has actually been created (calling gen buffers does not guarantee object creation)
|
//guarantees that the texture object has actually been created (calling gen buffers does not guarantee object creation)
|
||||||
texture.bind(openGLState);
|
texture.bind(openGLState);
|
||||||
@ -98,35 +102,18 @@ public class FramebufferUtils {
|
|||||||
|
|
||||||
public static Framebuffer generateScreenTextureFramebuffer(OpenGLState openGLState, int width, int height, Texture colorTexture, Texture depthTexture){
|
public static Framebuffer generateScreenTextureFramebuffer(OpenGLState openGLState, int width, int height, Texture colorTexture, Texture depthTexture){
|
||||||
Framebuffer buffer = new Framebuffer();
|
Framebuffer buffer = new Framebuffer();
|
||||||
//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);
|
|
||||||
//bind texture to fbo
|
//bind texture to fbo
|
||||||
buffer.setMipMapLevel(0);
|
buffer.setMipMapLevel(0);
|
||||||
buffer.attachTexture(openGLState,colorTexture);
|
buffer.attachTexture(openGLState,colorTexture);
|
||||||
buffer.setDepthAttachment(openGLState,depthTexture);
|
buffer.setDepthAttachment(openGLState,depthTexture);
|
||||||
//check make sure compiled
|
//check make sure compiled
|
||||||
buffer.checkStatus();
|
buffer.checkStatus();
|
||||||
|
Globals.renderingEngine.defaultFramebuffer.bind(openGLState);
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Framebuffer generateScreenTextureFramebuffer(OpenGLState openGLState, int width, int height, Texture colorTexture){
|
public static Framebuffer generateScreenTextureFramebuffer(OpenGLState openGLState, int width, int height, Texture colorTexture){
|
||||||
Framebuffer buffer = new Framebuffer();
|
Framebuffer buffer = new Framebuffer();
|
||||||
//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);
|
|
||||||
//bind texture to fbo
|
//bind texture to fbo
|
||||||
buffer.setMipMapLevel(0);
|
buffer.setMipMapLevel(0);
|
||||||
buffer.attachTexture(openGLState,colorTexture);
|
buffer.attachTexture(openGLState,colorTexture);
|
||||||
@ -161,6 +148,7 @@ public class FramebufferUtils {
|
|||||||
Globals.renderingEngine.checkError();
|
Globals.renderingEngine.checkError();
|
||||||
//check make sure compiled
|
//check make sure compiled
|
||||||
buffer.checkStatus();
|
buffer.checkStatus();
|
||||||
|
Globals.renderingEngine.defaultFramebuffer.bind(openGLState);
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,14 +193,10 @@ public class FramebufferUtils {
|
|||||||
buffer.bind();
|
buffer.bind();
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||||
Globals.renderingEngine.checkError();
|
Globals.renderingEngine.checkError();
|
||||||
Globals.renderingEngine.checkError();
|
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int depthMapWidth = 4096;
|
|
||||||
static int depthMapHeight = 4096;
|
|
||||||
|
|
||||||
public static Framebuffer generateDepthBuffer(OpenGLState openGLState){
|
public static Framebuffer generateDepthBuffer(OpenGLState openGLState){
|
||||||
Framebuffer buffer = new Framebuffer();
|
Framebuffer buffer = new Framebuffer();
|
||||||
buffer.bind(openGLState);
|
buffer.bind(openGLState);
|
||||||
@ -220,7 +204,7 @@ public class FramebufferUtils {
|
|||||||
|
|
||||||
//texture
|
//texture
|
||||||
Texture texture = new Texture();
|
Texture texture = new Texture();
|
||||||
texture.glTexImage2D(openGLState, depthMapWidth, depthMapHeight, GL_DEPTH_COMPONENT, GL_FLOAT);
|
texture.glTexImage2D(openGLState, ShadowMapPipeline.SHADOW_MAP_RESOLUTION, ShadowMapPipeline.SHADOW_MAP_RESOLUTION, GL_DEPTH_COMPONENT, GL_FLOAT);
|
||||||
texture.setMinFilter(openGLState, GL_NEAREST);
|
texture.setMinFilter(openGLState, GL_NEAREST);
|
||||||
texture.setMagFilter(openGLState, GL_NEAREST);
|
texture.setMagFilter(openGLState, GL_NEAREST);
|
||||||
texture.setWrap(openGLState, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
texture.setWrap(openGLState, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
||||||
@ -240,6 +224,7 @@ public class FramebufferUtils {
|
|||||||
|
|
||||||
//check make sure compiled
|
//check make sure compiled
|
||||||
buffer.checkStatus();
|
buffer.checkStatus();
|
||||||
|
Globals.renderingEngine.defaultFramebuffer.bind(openGLState);
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,6 +258,7 @@ public class FramebufferUtils {
|
|||||||
|
|
||||||
//check make sure compiled
|
//check make sure compiled
|
||||||
buffer.checkStatus();
|
buffer.checkStatus();
|
||||||
|
Globals.renderingEngine.defaultFramebuffer.bind(openGLState);
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,6 +302,7 @@ public class FramebufferUtils {
|
|||||||
|
|
||||||
//check make sure compiled
|
//check make sure compiled
|
||||||
buffer.checkStatus();
|
buffer.checkStatus();
|
||||||
|
Globals.renderingEngine.defaultFramebuffer.bind(openGLState);
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -27,13 +27,13 @@ import org.joml.Vector3f;
|
|||||||
import org.lwjgl.BufferUtils;
|
import org.lwjgl.BufferUtils;
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.GL11;
|
||||||
import org.lwjgl.opengl.GL15;
|
import org.lwjgl.opengl.GL15;
|
||||||
|
import org.lwjgl.opengl.GL40;
|
||||||
|
|
||||||
import static org.lwjgl.opengl.GL11.GL_FLOAT;
|
import static org.lwjgl.opengl.GL11.GL_FLOAT;
|
||||||
import static org.lwjgl.opengl.GL11.GL_INT;
|
import static org.lwjgl.opengl.GL11.GL_INT;
|
||||||
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_UNSIGNED_INT;
|
import static org.lwjgl.opengl.GL11.GL_UNSIGNED_INT;
|
||||||
import static org.lwjgl.opengl.GL13.GL_TEXTURE3;
|
|
||||||
import static org.lwjgl.opengl.GL15.GL_ARRAY_BUFFER;
|
import static org.lwjgl.opengl.GL15.GL_ARRAY_BUFFER;
|
||||||
import static org.lwjgl.opengl.GL15.GL_ELEMENT_ARRAY_BUFFER;
|
import static org.lwjgl.opengl.GL15.GL_ELEMENT_ARRAY_BUFFER;
|
||||||
import static org.lwjgl.opengl.GL15.GL_STATIC_DRAW;
|
import static org.lwjgl.opengl.GL15.GL_STATIC_DRAW;
|
||||||
@ -429,11 +429,12 @@ public class Mesh {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(renderPipelineState.getUseShadowMap()){
|
if(renderPipelineState.getUseShadowMap()){
|
||||||
openGLState.glActiveTexture(GL_TEXTURE3);
|
int shadowMapTextureUnit = 3;
|
||||||
|
openGLState.glActiveTexture(GL40.GL_TEXTURE0 + shadowMapTextureUnit);
|
||||||
Globals.renderingEngine.checkError();
|
Globals.renderingEngine.checkError();
|
||||||
openGLState.glBindTexture(GL_TEXTURE_2D, RenderingEngine.lightBufferDepthTexture.getTexturePointer());
|
openGLState.glBindTexture(GL_TEXTURE_2D, RenderingEngine.lightBufferDepthTexture.getTexturePointer());
|
||||||
Globals.renderingEngine.checkError();
|
Globals.renderingEngine.checkError();
|
||||||
openGLState.getActiveShader().setUniform(openGLState, "shadowMap", 3);
|
openGLState.getActiveShader().setUniform(openGLState, "shadowMap", shadowMapTextureUnit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -47,7 +47,7 @@ public class RenderScreenPipeline implements RenderPipeline {
|
|||||||
openGLState.glBindTexture(GL40.GL_TEXTURE_2D, RenderingEngine.screenFramebuffer.getTexture().getTexturePointer());
|
openGLState.glBindTexture(GL40.GL_TEXTURE_2D, RenderingEngine.screenFramebuffer.getTexture().getTexturePointer());
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
openGLState.glBindTexture(GL40.GL_TEXTURE_2D, RenderingEngine.lightDepthBuffer.getTexture().getTexturePointer());
|
openGLState.glBindTexture(GL40.GL_TEXTURE_2D, RenderingEngine.lightDepthBuffer.getDepthTexture().getTexturePointer());
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
openGLState.glBindTexture(GL40.GL_TEXTURE_2D, RenderingEngine.volumeDepthBackfaceTexture.getTexturePointer());
|
openGLState.glBindTexture(GL40.GL_TEXTURE_2D, RenderingEngine.volumeDepthBackfaceTexture.getTexturePointer());
|
||||||
|
|||||||
@ -16,45 +16,71 @@ import electrosphere.renderer.OpenGLState;
|
|||||||
import electrosphere.renderer.RenderPipelineState;
|
import electrosphere.renderer.RenderPipelineState;
|
||||||
import electrosphere.renderer.RenderingEngine;
|
import electrosphere.renderer.RenderingEngine;
|
||||||
import electrosphere.renderer.actor.Actor;
|
import electrosphere.renderer.actor.Actor;
|
||||||
|
import electrosphere.util.math.MathUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shadow map pipeline
|
* Shadow map pipeline
|
||||||
*/
|
*/
|
||||||
public class ShadowMapPipeline implements RenderPipeline {
|
public class ShadowMapPipeline implements RenderPipeline {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The resolution of the shadow map
|
||||||
|
*/
|
||||||
|
public static final int SHADOW_MAP_RESOLUTION = 4096;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The eye of the camera that is used to render the shadow map
|
||||||
|
*/
|
||||||
|
Vector3d cameraEye = new Vector3d(-1,10,-5.5);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The near plane distance
|
||||||
|
*/
|
||||||
|
float nearPlane = 0.1f;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The far plane
|
||||||
|
*/
|
||||||
|
float farPlane = 25f;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether the far plane should update based on camera location or not
|
||||||
|
*/
|
||||||
|
boolean updateFarPlane = true;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(OpenGLState openGLState, RenderPipelineState renderPipelineState) {
|
public void render(OpenGLState openGLState, RenderPipelineState renderPipelineState) {
|
||||||
Globals.profiler.beginCpuSample("ShadowMapPipeline.render");
|
Globals.profiler.beginCpuSample("ShadowMapPipeline.render");
|
||||||
Matrix4d modelTransformMatrix = new Matrix4d();
|
Matrix4d modelTransformMatrix = new Matrix4d();
|
||||||
|
|
||||||
//set the viewport to shadow map size
|
//set the viewport to shadow map size
|
||||||
openGLState.glViewport(4096, 4096);
|
openGLState.glViewport(SHADOW_MAP_RESOLUTION, SHADOW_MAP_RESOLUTION);
|
||||||
openGLState.glDepthTest(true);
|
openGLState.glDepthTest(true);
|
||||||
openGLState.glDepthFunc(GL40.GL_ALWAYS);
|
openGLState.glDepthFunc(GL40.GL_LEQUAL);
|
||||||
|
|
||||||
openGLState.setActiveShader(renderPipelineState, RenderingEngine.lightDepthShaderProgram);
|
openGLState.setActiveShader(renderPipelineState, RenderingEngine.lightDepthShaderProgram);
|
||||||
|
|
||||||
RenderingEngine.lightDepthBuffer.bind(openGLState);
|
RenderingEngine.lightDepthBuffer.bind(openGLState);
|
||||||
|
|
||||||
|
GL40.glClearDepth(1.0);
|
||||||
GL40.glClear(GL40.GL_DEPTH_BUFFER_BIT);
|
GL40.glClear(GL40.GL_DEPTH_BUFFER_BIT);
|
||||||
openGLState.glActiveTexture(GL40.GL_TEXTURE0);
|
openGLState.glActiveTexture(GL40.GL_TEXTURE0);
|
||||||
|
|
||||||
float eyeX = -1.0f;
|
float eyeX = (float)cameraEye.x;
|
||||||
float eyeY = 10.0f;
|
float eyeY = (float)cameraEye.y;
|
||||||
float eyeZ = -5.5f;
|
float eyeZ = (float)cameraEye.z;
|
||||||
float nearPlane = 0.01f;
|
float eyeDist = (float)cameraEye.length();
|
||||||
float eyeDist = (float)Math.sqrt(eyeX * eyeX + eyeY * eyeY + eyeZ * eyeZ);
|
// float farPlane = eyeDist + 10.0f;
|
||||||
float farPlane = eyeDist + 10.0f;
|
|
||||||
float sidesMagnitude = (float)Math.sqrt(eyeDist);
|
float sidesMagnitude = (float)Math.sqrt(eyeDist);
|
||||||
//set matrices for light render
|
//set matrices for light render
|
||||||
Matrix4f lightProjection = new Matrix4f().setOrtho(-sidesMagnitude, sidesMagnitude, -sidesMagnitude, sidesMagnitude, nearPlane, farPlane);//glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, near_plane, far_plane);
|
Matrix4f lightProjection = new Matrix4f().setOrtho(-sidesMagnitude, sidesMagnitude, -sidesMagnitude, sidesMagnitude, nearPlane, farPlane);//glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, near_plane, far_plane);
|
||||||
Matrix4f lightView = new Matrix4f().setLookAt(
|
Matrix4f lightView = new Matrix4f().setLookAt(
|
||||||
new Vector3f(eyeX, eyeY, eyeZ),
|
new Vector3f(eyeX, eyeY, eyeZ),
|
||||||
new Vector3f( 0.0f, 0.0f, 0.0f),
|
new Vector3f( 0.0f, 0.0f, 0.0f),
|
||||||
new Vector3f( 0.0f, 1.0f, 0.0f)
|
MathUtils.getUpVectorf()
|
||||||
);
|
);
|
||||||
Globals.lightDepthMatrix = new Matrix4f(lightProjection).mul(lightView);
|
Globals.lightDepthMatrix = lightProjection.mul(lightView);
|
||||||
|
|
||||||
GL40.glUniformMatrix4fv(GL40.glGetUniformLocation(openGLState.getActiveShader().getShaderId(), "lightSpaceMatrix"), false, Globals.lightDepthMatrix.get(new float[16]));
|
openGLState.getActiveShader().setUniform(openGLState, "lightSpaceMatrix", Globals.lightDepthMatrix);
|
||||||
|
|
||||||
// glCullFace(GL_FRONT);
|
// glCullFace(GL_FRONT);
|
||||||
|
|
||||||
@ -109,5 +135,21 @@ public class ShadowMapPipeline implements RenderPipeline {
|
|||||||
|
|
||||||
Globals.profiler.endCpuSample();
|
Globals.profiler.endCpuSample();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the far plane value
|
||||||
|
* @param farPlane The far plane value
|
||||||
|
*/
|
||||||
|
public void setFarPlane(float farPlane){
|
||||||
|
this.farPlane = farPlane;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether the far plane should update based on camera location or not
|
||||||
|
* @param updateFarPlane true if should update, false otherwise
|
||||||
|
*/
|
||||||
|
public void setUpdateFarPlane(boolean updateFarPlane){
|
||||||
|
this.updateFarPlane = updateFarPlane;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -764,6 +764,15 @@ public class ShaderProgram {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the location of a given uniform
|
||||||
|
* @param uniformName The name of the uniform
|
||||||
|
* @return The location of the uniform
|
||||||
|
*/
|
||||||
|
public int getUniformLocation(String uniformName){
|
||||||
|
return GL40.glGetUniformLocation(this.getShaderId(), uniformName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the id of the shader
|
* Gets the id of the shader
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user