From 6ca5d1294fe0fd321ac4d14c72d5665d7ba0cb2f Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sat, 26 Apr 2025 19:24:52 +0200 Subject: [PATCH] better light --- .../java/chess/view/DDDrender/Renderer.java | 4 +- .../view/DDDrender/shader/BoardShader.java | 24 +++++++++-- .../view/DDDrender/shader/PieceShader.java | 43 +++++++++++++++---- .../view/DDDrender/shader/ShaderProgram.java | 4 +- 4 files changed, 58 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/chess/view/DDDrender/Renderer.java b/app/src/main/java/chess/view/DDDrender/Renderer.java index d78d760..73bc8c5 100644 --- a/app/src/main/java/chess/view/DDDrender/Renderer.java +++ b/app/src/main/java/chess/view/DDDrender/Renderer.java @@ -22,8 +22,8 @@ public class Renderer { private VertexArray boardVao; private final PieceModel models; - private static final Vector3f BLACK = new Vector3f(0.1f, 0.1f, 0.1f); - private static final Vector3f WHITE = new Vector3f(0.7f, 0.7f, 0.7f); + private static final Vector3f BLACK = new Vector3f(0.3f, 0.3f, 0.3f); + private static final Vector3f WHITE = new Vector3f(1.0f, 1.0f, 1.0f); public Renderer() { this.boardShader = new BoardShader(); diff --git a/app/src/main/java/chess/view/DDDrender/shader/BoardShader.java b/app/src/main/java/chess/view/DDDrender/shader/BoardShader.java index 2df8097..4c676f5 100644 --- a/app/src/main/java/chess/view/DDDrender/shader/BoardShader.java +++ b/app/src/main/java/chess/view/DDDrender/shader/BoardShader.java @@ -12,16 +12,26 @@ public class BoardShader extends ShaderProgram { uniform mat4 viewMatrix; uniform mat4 projectionMatrix; - uniform vec3 lightPosition; + uniform vec3 lightPosition = vec3(0, 10, 0); flat out vec3 pass_color; + out vec3 toLightVector; + out vec3 toCameraVector; + out vec3 surfaceNormal; void main(void){ + const vec4 normal = vec4(0.0, 1.0, 0.0, 1.0); + gl_Position = projectionMatrix * viewMatrix * vec4(position, 1.0); + vec3 camPos = (inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz; + toLightVector = lightPosition - position; + toCameraVector = camPos - position; + surfaceNormal = (normal).xyz; + pass_color = color; } @@ -33,6 +43,8 @@ public class BoardShader extends ShaderProgram { flat in vec3 pass_color; in vec3 toLightVector; + in vec3 toCameraVector; + in vec3 surfaceNormal; out vec4 out_color; @@ -42,18 +54,22 @@ public class BoardShader extends ShaderProgram { float lightDistance = length(toLightVector); - const vec3 attenuation = vec3(0.3, 0.03, 0); + const vec3 attenuation = vec3(0.2, 0.1, 0.0); float attenuationFactor = attenuation.x + attenuation.y * lightDistance + attenuation.z * lightDistance * lightDistance; - vec3 unitNormal = vec3(0, 1, 0); + vec3 unitNormal = normalize(surfaceNormal); vec3 unitLightVector = normalize(toLightVector); + vec3 unitCamVector = normalize(toCameraVector); vec3 lightDirection = -unitLightVector; vec3 reflectedLightDirection = reflect(lightDirection, unitNormal); float diffuse = max(0.2, dot(unitNormal, unitLightVector)); - float brightness = diffuse / attenuationFactor; + float specularFactor = max(0.0, dot(reflectedLightDirection, unitCamVector)); + float specular = pow(specularFactor, shineDamper) * reflectivity; + + float brightness = (diffuse + specular) / attenuationFactor; out_color = brightness * vec4(pass_color, 1.0); out_color.w = 1.0; diff --git a/app/src/main/java/chess/view/DDDrender/shader/PieceShader.java b/app/src/main/java/chess/view/DDDrender/shader/PieceShader.java index 4f21373..1f49eaf 100644 --- a/app/src/main/java/chess/view/DDDrender/shader/PieceShader.java +++ b/app/src/main/java/chess/view/DDDrender/shader/PieceShader.java @@ -17,43 +17,68 @@ public class PieceShader extends ShaderProgram { uniform mat4 projectionMatrix; uniform mat4 viewMatrix; uniform mat4 modelTransform; - uniform vec3 lightPosition = vec3(0, 1, 0); + uniform vec3 lightPosition = vec3(0, 10, 0); out vec3 toLightVector; + out vec3 toCameraVector; out vec3 surfaceNormal; void main(void){ - vec4 worldPos = modelTransform * vec4(position, 1.0); - toLightVector = lightPosition - worldPos.xyz; - surfaceNormal = (modelTransform * vec4(normal, 0.0)).xyz; + vec4 modelPos = modelTransform * vec4(position, 1.0); + vec4 globalNormal = modelTransform * vec4(normal, 1.0); - gl_Position = projectionMatrix * viewMatrix * worldPos; + gl_Position = projectionMatrix * viewMatrix * modelPos; + + vec3 camPos = (inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz; + + toLightVector = lightPosition - modelPos.xyz; + + toCameraVector = camPos - position; + surfaceNormal = normalize(globalNormal.xyz); } + """; private static String fragmentShader = """ #version 330 in vec3 toLightVector; + in vec3 toCameraVector; in vec3 surfaceNormal; - uniform vec3 modelColor = vec3(1, 1, 1); + uniform vec3 modelColor; out vec4 out_color; void main(void){ + const float shineDamper = 10.0; + const float reflectivity = 1.0; + + float lightDistance = length(toLightVector); + + const vec3 attenuation = vec3(0.2, 0.1, 0.0); + float attenuationFactor = attenuation.x + attenuation.y * lightDistance + attenuation.z * lightDistance * lightDistance; + vec3 unitNormal = normalize(surfaceNormal); vec3 unitLightVector = normalize(toLightVector); + vec3 unitCamVector = normalize(toCameraVector); - float diffuse = max(0.5, dot(unitNormal, unitLightVector)); + vec3 lightDirection = -unitLightVector; + vec3 reflectedLightDirection = reflect(lightDirection, unitNormal); - float brightness = diffuse; + float diffuse = max(0.2, dot(unitNormal, unitLightVector)); - out_color = vec4(modelColor, 1.0) * brightness; + float specularFactor = max(0.0, dot(reflectedLightDirection, unitCamVector)); + float specular = pow(specularFactor, shineDamper) * reflectivity; + + float brightness = (diffuse + specular) / attenuationFactor; + + out_color = brightness * vec4(modelColor, 1.0); out_color.w = 1.0; } + """; private int location_ProjectionMatrix = 0; diff --git a/app/src/main/java/chess/view/DDDrender/shader/ShaderProgram.java b/app/src/main/java/chess/view/DDDrender/shader/ShaderProgram.java index cfeb07f..1cf3214 100644 --- a/app/src/main/java/chess/view/DDDrender/shader/ShaderProgram.java +++ b/app/src/main/java/chess/view/DDDrender/shader/ShaderProgram.java @@ -56,8 +56,8 @@ public abstract class ShaderProgram { if (compileSuccesful.get() != 1) { System.out.println("Shader did not compile !"); + System.err.println(GL30.glGetShaderInfoLog(shaderId)); return -1; - } return shaderId; @@ -68,7 +68,7 @@ public abstract class ShaderProgram { protected int GetUniformLocation(String uniformName) { int location = GL30.glGetUniformLocation(programId, uniformName); if (location == -1) { - System.out.println("Uniform value not found !"); + System.out.println("Uniform value \"" + uniformName + "\" not found !"); } return location; }