water now has depth and looks much better

This commit is contained in:
Edgaru089 2022-02-21 15:11:13 +08:00
parent 4204a15b1e
commit e2717aaaa9
3 changed files with 18 additions and 9 deletions

View File

@ -1,15 +1,19 @@
#version 330 #version 330
uniform sampler2D gPos;
uniform sampler2D tex; uniform sampler2D tex;
uniform sampler2D shadowmap; uniform sampler2D shadowmap;
uniform vec3 viewPos; uniform vec3 viewPos;
uniform vec3 sun; uniform vec3 sun;
uniform vec4 fogColor; uniform vec4 fogColor;
uniform vec2 screenSize;
uniform float alpha; // Alpha of the semi-transparant layer uniform float alpha; // Alpha of the semi-transparant layer
// Fragment information // Fragment information
in vec4 fragPos; in vec4 fragPos;
in vec4 fragPosView;
in vec4 fragPosScreen;
in vec4 fragPosLightspace; in vec4 fragPosLightspace;
in vec3 fragNormal; in vec3 fragNormal;
in vec2 fragTexCoord; in vec2 fragTexCoord;
@ -24,7 +28,7 @@ const float ambient = 0.3, specularStrength = 1.6, specularShininess = 128;
const float fogDensity = .00003; const float fogDensity = .00003;
float finalpha; float sunalpha = 0;
float light; float light;
vec3 color = vec3(0); vec3 color = vec3(0);
void lightSun(); void lightSun();
@ -36,7 +40,6 @@ void main() {
fragColor = vec4(texture(tex, fragTexCoord).rgb, 1.0f); fragColor = vec4(texture(tex, fragTexCoord).rgb, 1.0f);
finalpha = alpha;
light = ambient; light = ambient;
lightSun(); lightSun();
@ -46,7 +49,10 @@ void main() {
//float z = gl_FragCoord.z / gl_FragCoord.w; //float z = gl_FragCoord.z / gl_FragCoord.w;
//float fog = clamp(exp(-fogDensity * z * z), 0.2, 1); //float fog = clamp(exp(-fogDensity * z * z), 0.2, 1);
outputColor = vec4(color, 1) * finalpha; float waterDepth = (fragPosView.z-texture(gPos, gl_FragCoord.xy/screenSize).a);
float waterFactor = pow(alpha, waterDepth);
outputColor = vec4(color*waterFactor, min(1-waterFactor + sunalpha, 1));
} }
void lightSun() { void lightSun() {
@ -63,10 +69,9 @@ void lightSun() {
light += diffuse * shadow; light += diffuse * shadow;
color += vec3(specular) * shadow; color += vec3(specular) * shadow;
if (specular*shadow > 1.0f) { if (specular*shadow > 1.0f)
finalpha = min(finalpha + specular - 1.0f, 1.0f); sunalpha += specular*shadow - 1.0f;
} sunalpha += 0.1f*shadow;
finalpha = min(finalpha + 0.1f * shadow, 1.0f);
} }
float lightSunShadow() { float lightSunShadow() {

View File

@ -11,6 +11,7 @@ layout (location = 2) in vec2 texCoord;
layout (location = 4) in float light; layout (location = 4) in float light;
out vec4 fragPos; out vec4 fragPos;
out vec4 fragPosView;
out vec4 fragPosLightspace; out vec4 fragPosLightspace;
out vec3 fragNormal; out vec3 fragNormal;
out vec2 fragTexCoord; out vec2 fragTexCoord;
@ -19,8 +20,9 @@ out vec2 fragTexCoord;
void main() { void main() {
fragTexCoord = texCoord; fragTexCoord = texCoord;
fragPos = model * vec4(vert, 1); fragPos = model * vec4(vert, 1);
fragPosView = view * fragPos;
fragPosLightspace = lightspace * fragPos; fragPosLightspace = lightspace * fragPos;
fragNormal = normal; fragNormal = normal;
gl_Position = projection * view * fragPos; gl_Position = projection * fragPosView;
} }

View File

@ -222,6 +222,7 @@ func (r *WorldRenderer) Init(w *world.World) (err error) {
r.lighting.shader.SetUniformTextureHandle("gColor", r.gbuffer.color) r.lighting.shader.SetUniformTextureHandle("gColor", r.gbuffer.color)
r.ssao.shader.SetUniformTextureHandle("gPos", r.gbuffer.pos) r.ssao.shader.SetUniformTextureHandle("gPos", r.gbuffer.pos)
r.ssao.shader.SetUniformTextureHandle("gNorm", r.gbuffer.norm) r.ssao.shader.SetUniformTextureHandle("gNorm", r.gbuffer.norm)
r.water.shader.SetUniformTextureHandle("gPos", r.gbuffer.pos)
// generate SSAO friends // generate SSAO friends
gl.GenFramebuffers(1, &r.ssao.fbo) gl.GenFramebuffers(1, &r.ssao.fbo)
@ -430,7 +431,7 @@ func (r *WorldRenderer) Render(world *world.World, view *View) {
gl.DepthFunc(gl.LESS) gl.DepthFunc(gl.LESS)
gl.Enable(gl.CULL_FACE) gl.Enable(gl.CULL_FACE)
gl.Enable(gl.BLEND) gl.Enable(gl.BLEND)
gl.BlendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
gl.BlendEquation(gl.FUNC_ADD) gl.BlendEquation(gl.FUNC_ADD)
r.water.shader.UseProgram() r.water.shader.UseProgram()
r.water.shader.BindTextures() r.water.shader.BindTextures()
@ -442,6 +443,7 @@ func (r *WorldRenderer) Render(world *world.World, view *View) {
r.water.shader.SetUniformVec4f("fogColor", io.FogColor) r.water.shader.SetUniformVec4f("fogColor", io.FogColor)
r.water.shader.SetUniformVec3f("sun", normalSun) r.water.shader.SetUniformVec3f("sun", normalSun)
r.water.shader.SetUniformFloat("alpha", alpha) r.water.shader.SetUniformFloat("alpha", alpha)
r.water.shader.SetUniformVec2f("screenSize", r.lastDisplaySize.ToFloat32())
world.RenderWater() world.RenderWater()