Enable stacking shaders

This commit is contained in:
2025-07-15 23:28:00 +02:00
parent c89a1f1d2e
commit ef5ea98981
4 changed files with 36 additions and 15 deletions

View File

@@ -6,11 +6,9 @@ import org.joml.*;
public interface ShaderManager extends Cleanable {
ShaderManager createShader(String programName, String vertexShaderFilename, String fragmentShaderFilename);
ShaderManager selectShader(String programName);
ShaderManager activateShader(String programName);
ShaderManager useSelectedShader();
ShaderManager detachCurrentShader();
ShaderManager deactivateShader();
ShaderManager createUniform(String uniformName);

View File

@@ -4,6 +4,7 @@ import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.CounterName;
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.RenderConstants;
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.Shader;
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.internal.render.Renderable;
import com.bartlomiejpluta.base.internal.render.ShaderManager;
@@ -12,6 +13,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import static org.lwjgl.opengl.GL15.*;
@Slf4j
@@ -23,9 +26,15 @@ public class DefaultRenderer implements Renderer {
@Override
public void init() {
log.info("Initializing renderer");
log.info("Registering shaders");
for (var shader : Shader.values()) {
shaderManager.createShader(shader.name, shader.vertex, shader.fragment);
}
log.info("Registering uniforms");
shaderManager
.createShader("default", "/shaders/default.vs", "/shaders/default.fs")
.selectShader("default")
.activateShader(Shader.DEFAULT.name)
.createUniform(UniformName.UNI_VIEW_MODEL_MATRIX)
.createUniform(UniformName.UNI_MODEL_MATRIX)
.createUniform(UniformName.UNI_PROJECTION_MATRIX)
@@ -52,7 +61,7 @@ public class DefaultRenderer implements Renderer {
clear();
updateViewport(screen);
shaderManager.selectShader("default").useSelectedShader();
shaderManager.activateShader(Shader.DEFAULT.name);
shaderManager.resetCounters();
// Important note:
@@ -62,7 +71,7 @@ public class DefaultRenderer implements Renderer {
camera.render(screen, shaderManager);
renderable.render(screen, camera, shaderManager);
shaderManager.detachCurrentShader();
shaderManager.deactivateShader();
screen.restoreState();
}

View File

@@ -0,0 +1,12 @@
package com.bartlomiejpluta.base.engine.core.gl.shader.constant;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public enum Shader {
DEFAULT("default", "/shaders/default.vs", "/shaders/default.fs");
public final String name;
public final String vertex;
public final String fragment;
}

View File

@@ -12,7 +12,9 @@ import org.joml.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
@@ -25,6 +27,7 @@ public class DefaultShaderManager implements ShaderManager {
private final ResourcesManager resourcesManager;
private final Map<String, ShaderProgram> shaders = new HashMap<>();
private final Map<String, AtomicInteger> counters = new HashMap<>();
private final Deque<ShaderProgram> stack = new LinkedList<>();
private ShaderProgram current;
@Override
@@ -40,20 +43,19 @@ public class DefaultShaderManager implements ShaderManager {
}
@Override
public ShaderManager selectShader(String programName) {
public ShaderManager activateShader(String programName) {
current = shaders.get(programName);
return this;
}
@Override
public ShaderManager useSelectedShader() {
stack.push(current);
current.use();
return this;
}
@Override
public ShaderManager detachCurrentShader() {
public ShaderManager deactivateShader() {
current.detach();
stack.pop();
current = stack.peek();
current.use();
return this;
}