Move view-model matrix computation to the CPU

This commit is contained in:
2021-02-16 11:58:19 +01:00
parent a307939de5
commit f6e15724c4
6 changed files with 22 additions and 22 deletions

View File

@@ -23,8 +23,7 @@ public class DefaultRenderer implements Renderer {
shaderManager
.createShader("default", "/shaders/default.vs", "/shaders/default.fs")
.selectShader("default")
.createUniform(UniformName.UNI_MODEL_MATRIX)
.createUniform(UniformName.UNI_VIEW_MATRIX)
.createUniform(UniformName.UNI_VIEW_MODEL_MATRIX)
.createUniform(UniformName.UNI_PROJECTION_MATRIX)
.createUniform(UniformName.UNI_OBJECT_COLOR)
.createUniform(UniformName.UNI_HAS_OBJECT_TEXTURE)
@@ -40,6 +39,10 @@ public class DefaultRenderer implements Renderer {
shaderManager.selectShader("default").useSelectedShader();
// Important note:
// The camera render method must be invoked **before** each consecutive item renders
// due to the fact, that the method updates projection and view matrices, that
// are used to compute proper vertex coordinates of rendered objects (renderables).
camera.render(window, shaderManager);
renderable.render(window, camera, shaderManager);

View File

@@ -1,8 +1,7 @@
package com.bartlomiejpluta.base.core.gl.shader.constant;
public interface UniformName {
String UNI_MODEL_MATRIX = "modelMatrix";
String UNI_VIEW_MATRIX = "viewMatrix";
String UNI_VIEW_MODEL_MATRIX = "viewModelMatrix";
String UNI_PROJECTION_MATRIX = "projectionMatrix";
String UNI_OBJECT_COLOR = "objectColor";
String UNI_HAS_OBJECT_TEXTURE = "hasTexture";

View File

@@ -1,6 +1,5 @@
package com.bartlomiejpluta.base.core.world.camera;
import com.bartlomiejpluta.base.core.gl.render.Renderable;
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
@@ -11,20 +10,20 @@ public class Camera extends PositionableObject {
private final Matrix4f projectionMatrix = new Matrix4f();
private final Matrix4f viewMatrix = new Matrix4f();
public Matrix4f getProjectionMatrix(Window window) {
return projectionMatrix
.identity()
.setOrtho2D(0, window.getWidth(), window.getHeight(), 0);
}
public Matrix4f getViewMatrix() {
return viewMatrix
.identity()
.translate(-position.x, -position.y, 0);
public Matrix4f computeViewModelMatrix(Matrix4f modelMatrix) {
return new Matrix4f(viewMatrix).mul(modelMatrix);
}
public void render(Window window, ShaderManager shaderManager) {
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, getProjectionMatrix(window));
shaderManager.setUniform(UniformName.UNI_VIEW_MATRIX, getViewMatrix());
// Update matrices
projectionMatrix
.identity()
.setOrtho2D(0, window.getWidth(), window.getHeight(), 0);
viewMatrix
.identity()
.translate(-position.x, -position.y, 0);
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, projectionMatrix);
}
}

View File

@@ -42,7 +42,7 @@ public class ImageLayer implements Layer {
return;
}
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, image.getModelMatrix());
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(image.getModelMatrix()));
switch (mode) {
case FIT_SCREEN -> image.setScale(window.getWidth() / imageInitialWidth, window.getHeight() / imageInitialHeight);

View File

@@ -27,7 +27,7 @@ public abstract class RenderableObject extends PositionableObject implements Ren
public void render(Window window, Camera camera, ShaderManager shaderManager) {
material.activateTextureIfExists();
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, getModelMatrix());
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
shaderManager.setUniform(UniformName.UNI_OBJECT_COLOR, material.getColor());
shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, material.hasTexture());
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);

View File

@@ -1,7 +1,6 @@
#version 330
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 viewModelMatrix;
uniform mat4 projectionMatrix;
layout(location=0) in vec2 position;
@@ -11,6 +10,6 @@ out vec2 fragmentTexCoord;
void main()
{
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 0.0, 1.0);
gl_Position = projectionMatrix * viewModelMatrix * vec4(position, 0.0, 1.0);
fragmentTexCoord = texCoord;
}