partly broken and half working shadows

pull/1/head
BuildTools 2019-05-28 16:13:17 +10:00
parent dd892ba6e1
commit 395144e6ee
88 changed files with 56 additions and 12 deletions

View File

@ -123,8 +123,8 @@ public class Example {
float colour = 0;
terrains.add(terrain);
GuiTexture shadowMap = new GuiTexture(masterRenderer.getShadowMapTexture(), new Vector2f(0.5f,0.5f), new Vector2f(0.5f,0.5f));
guis.add(shadowMap);
// GuiTexture shadowMap = new GuiTexture(masterRenderer.getShadowMapTexture(), new Vector2f(0.5f,0.5f), new Vector2f(0.5f,0.5f));
// guis.add(shadowMap);
ParticleTexture particleTexture = new ParticleTexture(Loader.loadTexture("particles/smoke.png"), 8);

View File

@ -6,6 +6,7 @@ import java.util.List;
import java.util.Map;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;
import io.github.hydos.ginger.engine.elements.Entity;
import io.github.hydos.ginger.engine.elements.Light;
@ -80,7 +81,13 @@ public class MasterRenderer {
GL11.glDisable(GL11.GL_CULL_FACE);
}
public void prepare() {
GL13.glActiveTexture(GL13.GL_TEXTURE5);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, shadowMapRenderer.getShadowMap());
}
public void renderScene(List<Entity> entities, List<Entity> normalEntities, List<Terrain> terrains, List<Light> lights, ThirdPersonCamera camera, Vector4f clipPlane) {
prepare();
renderEntities(entities, camera, lights);
renderNormalEntities(normalEntities, lights, camera, clipPlane);
renderTerrains(terrains, lights, camera);
@ -105,7 +112,7 @@ public class MasterRenderer {
terrainShader.loadSkyColour(Window.getColour());
terrainShader.loadLights(lights);
terrainShader.loadViewMatrix(camera);
terrainRenderer.render(terrains);
terrainRenderer.render(terrains, shadowMapRenderer.getToShadowMapSpaceMatrix());
terrainShader.stop();
}

View File

@ -28,7 +28,8 @@ public class TerrainRenderer {
shader.stop();
}
public void render(List<Terrain> terrains) {
public void render(List<Terrain> terrains, Matrix4f toShadowSpace) {
shader.loadToShadowMapSpace(toShadowSpace);
for(Terrain t : terrains) {
prepareTerrain(t);
loadModelMatrix(t);

View File

@ -35,6 +35,9 @@ public class TerrainShader extends ShaderProgram{
private int location_blendMap;
private int location_toShadowMapSpace;
private int location_shadowMap;
public TerrainShader() {
super("terrainVertexShader.glsl", "terrainFragmentShader.glsl");
@ -61,6 +64,8 @@ public class TerrainShader extends ShaderProgram{
location_gTexture = super.getUniformLocation("gTexture");
location_bTexture = super.getUniformLocation("bTexture");
location_blendMap = super.getUniformLocation("blendMap");
location_toShadowMapSpace = super.getUniformLocation("toShadowMapSpace");
location_shadowMap = super.getUniformLocation("shadowMap");
}
@Override
@ -106,12 +111,17 @@ public class TerrainShader extends ShaderProgram{
super.loadVector(location_skyColour, colour);
}
public void loadToShadowMapSpace(Matrix4f matrix) {
super.loadMatrix(location_toShadowMapSpace, matrix);
}
public void connectTextureUnits() {
super.loadInt(location_backgroundTexture, 0);
super.loadInt(location_rTexture, 1);
super.loadInt(location_gTexture, 2);
super.loadInt(location_bTexture, 3);
super.loadInt(location_blendMap, 4);
super.loadInt(location_shadowMap, 5);
}
}

View File

@ -21,7 +21,7 @@ import io.github.hydos.ginger.engine.renderEngine.models.TexturedModel;
*/
public class ShadowMapMasterRenderer {
private static final int SHADOW_MAP_SIZE = 2048;
private static final int SHADOW_MAP_SIZE = 4096;
private ShadowFrameBuffer shadowFbo;
private ShadowShader shader;

View File

@ -5,6 +5,7 @@ in vec3 surfaceNormal;
in vec3 toLightVector[5];
in vec3 toCameraVector;
in float visibility;
in vec4 shadowCoords;
out vec4 out_Color;
@ -13,6 +14,8 @@ uniform sampler2D rTexture;
uniform sampler2D gTexture;
uniform sampler2D bTexture;
uniform sampler2D blendMap;
uniform sampler2D shadowMap;
uniform vec3 attenuation[5];
uniform vec3 lightColour[5];
const float shineDamper = 0;
@ -21,6 +24,12 @@ uniform vec3 skyColour;
void main(void){
float objectNearestLight = texture(shadowMap, shadowCoords.xy).r;
float lightFactor = 1.0;
if(shadowCoords.z > objectNearestLight){
lightFactor = 1.0 - 0.4;
}
vec4 blendMapColour = texture(blendMap, pass_textureCoords);
vec3 unitVectorToCamera = normalize(toCameraVector);
@ -55,7 +64,7 @@ void main(void){
totalSpecular = totalSpecular + dampedFactor * reflectivity * lightColour[i] / attFactor;
}
totalDiffuse = max(totalDiffuse, 0.2);
totalDiffuse = max(totalDiffuse, 0.2) * lightFactor;
out_Color = vec4(totalDiffuse, 1.0) * totalColour + vec4(totalSpecular, 1.0);
out_Color = mix(vec4(skyColour, 1.0), out_Color, visibility);

View File

@ -1,5 +1,4 @@
#version 400 core
#version 150
in vec3 position;
in vec2 textureCoords;
in vec3 normal;
@ -9,18 +8,23 @@ out vec3 surfaceNormal;
out vec3 toLightVector[5];
out vec3 toCameraVector;
out float visibility;
out vec4 shadowCoords;
uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform vec3 lightPosition[5];
uniform mat4 toShadowMapSpace;
const float density = 0.01;
const float gradient = 1;
void main(void){
vec4 worldPosition = transformationMatrix * vec4(position.xyz,1.0);
shadowCoords = toShadowMapSpace * worldPosition;
vec4 positionRelativeToCam = viewMatrix * worldPosition;
gl_Position = projectionMatrix * positionRelativeToCam;

View File

@ -5,6 +5,7 @@ in vec3 surfaceNormal;
in vec3 toLightVector[5];
in vec3 toCameraVector;
in float visibility;
in vec4 shadowCoords;
out vec4 out_Color;
@ -13,6 +14,8 @@ uniform sampler2D rTexture;
uniform sampler2D gTexture;
uniform sampler2D bTexture;
uniform sampler2D blendMap;
uniform sampler2D shadowMap;
uniform vec3 attenuation[5];
uniform vec3 lightColour[5];
const float shineDamper = 0;
@ -21,6 +24,12 @@ uniform vec3 skyColour;
void main(void){
float objectNearestLight = texture(shadowMap, shadowCoords.xy).r;
float lightFactor = 1.0;
if(shadowCoords.z > objectNearestLight){
lightFactor = 1.0 - 0.4;
}
vec4 blendMapColour = texture(blendMap, pass_textureCoords);
vec3 unitVectorToCamera = normalize(toCameraVector);
@ -55,7 +64,7 @@ void main(void){
totalSpecular = totalSpecular + dampedFactor * reflectivity * lightColour[i] / attFactor;
}
totalDiffuse = max(totalDiffuse, 0.2);
totalDiffuse = max(totalDiffuse, 0.2) * lightFactor;
out_Color = vec4(totalDiffuse, 1.0) * totalColour + vec4(totalSpecular, 1.0);
out_Color = mix(vec4(skyColour, 1.0), out_Color, visibility);

View File

@ -1,5 +1,4 @@
#version 400 core
#version 150
in vec3 position;
in vec2 textureCoords;
in vec3 normal;
@ -9,18 +8,23 @@ out vec3 surfaceNormal;
out vec3 toLightVector[5];
out vec3 toCameraVector;
out float visibility;
out vec4 shadowCoords;
uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform vec3 lightPosition[5];
uniform mat4 toShadowMapSpace;
const float density = 0.01;
const float gradient = 1;
void main(void){
vec4 worldPosition = transformationMatrix * vec4(position.xyz,1.0);
shadowCoords = toShadowMapSpace * worldPosition;
vec4 positionRelativeToCam = viewMatrix * worldPosition;
gl_Position = projectionMatrix * positionRelativeToCam;