From 27eb43b140cdafc5da3f500746527794b24bee72 Mon Sep 17 00:00:00 2001 From: sasankasa Date: Mon, 29 Jan 2024 19:41:22 +0100 Subject: [PATCH 1/5] szum kolorkowy --- grk/cw 6/shaders/shader_noise.frag | 146 ++++++++++++++++++++++++++++- grk/cw 6/src/Planet.hpp | 9 +- 2 files changed, 151 insertions(+), 4 deletions(-) diff --git a/grk/cw 6/shaders/shader_noise.frag b/grk/cw 6/shaders/shader_noise.frag index 8ec9a97..32fa2c2 100644 --- a/grk/cw 6/shaders/shader_noise.frag +++ b/grk/cw 6/shaders/shader_noise.frag @@ -1,6 +1,6 @@ #version 430 core -float PI = 3.14159f; +/*float PI = 3.14159f; uniform sampler2D colorTexture; @@ -71,10 +71,152 @@ void main() vec2 st = vtc; vec2 pos = vec2(st*3.776); - + pos.x -= u_time * 0.07; // Use the noise function float n = 1.836 * 0.676*noise(pos*2.576); n = smoothstep(-0.096, 1.176, n); outColor = vec4(vec3(n), 1); } +*/ + +out vec4 outColor; +uniform float u_time; + +in vec2 vtc; + +float random (in vec2 _st) { + return fract(sin(dot(_st.xy, + vec2(12.9898,78.233)))* + 43758.5453123); +} + +// Based on Morgan McGuire @morgan3d +// https://www.shadertoy.com/view/4dS3Wd +float noise (in vec2 _st) { + vec2 i = floor(_st); + vec2 f = fract(_st); + + // Four corners in 2D of a tile + float a = random(i); + float b = random(i + vec2(1.0, 0.0)); + float c = random(i + vec2(0.0, 1.0)); + float d = random(i + vec2(1.0, 1.0)); + + vec2 u = f * f * (3.0 - 2.0 * f); + + return mix(a, b, u.x) + + (c - a)* u.y * (1.0 - u.x) + + (d - b) * u.x * u.y; +} + +#define NUM_OCTAVES 5 + +float fbm ( in vec2 _st) { + float v = 0.0; + float a = 0.5; + vec2 shift = vec2(100.0); + // Rotate to reduce axial bias + mat2 rot = mat2(cos(0.5), sin(0.5), + -sin(0.5), cos(0.50)); + for (int i = 0; i < NUM_OCTAVES; ++i) { + v += a * noise(_st); + _st = rot * _st * 3.0 + shift; + a *= 0.6; + } + return v; +} + +void main() { + vec2 st = vtc; + // st += st * abs(sin(u_time*0.1)*3.0); + vec3 color = vec3(0.0); + + vec2 q = vec2(0.); + q.x = fbm( st + 0.00*u_time); + q.y = fbm( st + vec2(1.0)); + + vec2 r = vec2(0.); + r.x = fbm( st + 1.0*q + vec2(1.7,9.2)+ 0.15*u_time ); + r.y = fbm( st + 1.0*q + vec2(8.3,2.8)+ 0.126*u_time); + + float f = fbm(st+r); + + color = mix(vec3(0.101961,0.619608,0.666667), + vec3(0.666667,0.666667,0.498039), + clamp((f*f)*4.0,0.0,1.0)); + + color = mix(color, + vec3(0.995,0.077,0.220), + clamp(length(q),0.0,1.0)); + + color = mix(color, + vec3(1.000,0.925,0.132), + clamp(length(r.x),0.0,1.0)); + + outColor = vec4((f*f*f+.9*f*f+.9*f)*color,1.); +} +/* +uniform float u_time; +out vec4 outColor; +in vec2 vtc; +in vec3 worldPos; + +vec2 u_resolution = vec2(1024, 1024); + +float random (in vec2 st) { + return fract(sin(dot(st.xy, + vec2(12.9898,78.233)))* + 43758.5453123); +} + +// Based on Morgan McGuire @morgan3d +// https://www.shadertoy.com/view/4dS3Wd +float noise (in vec2 st) { + vec2 i = floor(st); + vec2 f = fract(st); + + // Four corners in 2D of a tile + float a = random(i); + float b = random(i + vec2(1.0, 0.0)); + float c = random(i + vec2(0.0, 1.0)); + float d = random(i + vec2(1.0, 1.0)); + + vec2 u = f * f * (3.0 - 2.0 * f); + + return mix(a, b, u.x) + + (c - a)* u.y * (1.0 - u.x) + + (d - b) * u.x * u.y; +} + +#define OCTAVES 6 +float fbm (in vec2 st) { + // Initial values + float value = 0.0; + float amplitude = .5; + float frequency = 0.; + // + // Loop of octaves + for (int i = 0; i < OCTAVES; i++) { + value += amplitude * noise(st); + st *= 2.; + amplitude *= .5; + } + return value; +} + +void main() { + vec2 st = vtc; + //vec2 st = vtc.xy/worldPos.xy; + //st += st * abs(sin(u_time*0.1)*10.0); + //st.x *= worldPos.x/worldPos.y; + + vec3 color = vec3(0.0); + color += fbm(st*3.0); + + vec3 mixedColor = mix(vec3(0.4), color, color.r); + //color = mix(vec3(1.0), fbm(st*3.0), 0.1); + + outColor = vec4(mixedColor,1.0); + +}*/ \ No newline at end of file diff --git a/grk/cw 6/src/Planet.hpp b/grk/cw 6/src/Planet.hpp index ed7ed58..10b126f 100644 --- a/grk/cw 6/src/Planet.hpp +++ b/grk/cw 6/src/Planet.hpp @@ -257,12 +257,15 @@ void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint t glUseProgram(0); } -void drawObjectNoise(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint texture, float roughness, float metallic) { +void drawObjectNoise(Core::RenderContext& context, glm::mat4 modelMatrix, float time) { + + glUseProgram(programNoise); glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix(); glm::mat4 transformation = viewProjectionMatrix * modelMatrix; glUniformMatrix4fv(glGetUniformLocation(programNoise, "transformation"), 1, GL_FALSE, (float*)&transformation); glUniformMatrix4fv(glGetUniformLocation(programNoise, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix); + glUniform1f(glGetUniformLocation(programNoise, "u_time"), time); Core::DrawContext(context); glUseProgram(0); @@ -279,9 +282,11 @@ void renderScene(GLFWwindow* window) { glm::mat4 planetRotate = glm::rotate(time * planetRot, glm::vec3(0, 1, 0)); glm::mat4 planetTranslate = glm::translate(planetPos); + glm::mat4 cloudScale = glm::scale(glm::vec3(planetSize * 1.05f)); + //drawPlanet(sphereContext, planetTranslate * planetRotate * planetScale, planetTex); drawObjectPBR(sphereContext, planetTranslate * planetRotate * planetScale, planetTex, planetRough, planetMetal); - drawObjectNoise(sphereContext, planetTranslate * planetRotate * planetScale, planetTex, planetRough, planetMetal); + drawObjectNoise(sphereContext, planetTranslate * planetRotate * cloudScale, time); //rysowanie sÅ‚oÅ„ca glm::mat4 sunScale = glm::scale(glm::vec3(sunSize)); From 45421d3e1db1941dc2b1cea1a7cb3f42a78d464e Mon Sep 17 00:00:00 2001 From: sasankasa Date: Fri, 2 Feb 2024 19:56:51 +0100 Subject: [PATCH 2/5] cloud version 1 --- grk/cw 6/shaders/shader_noise.frag | 4 +- grk/cw 6/shaders/shader_pbr.frag | 86 +++++++++++++++++++++++++++--- grk/cw 6/src/Planet.hpp | 9 ++-- 3 files changed, 87 insertions(+), 12 deletions(-) diff --git a/grk/cw 6/shaders/shader_noise.frag b/grk/cw 6/shaders/shader_noise.frag index 32fa2c2..2454642 100644 --- a/grk/cw 6/shaders/shader_noise.frag +++ b/grk/cw 6/shaders/shader_noise.frag @@ -79,7 +79,7 @@ void main() outColor = vec4(vec3(n), 1); } */ - +/* out vec4 outColor; uniform float u_time; @@ -156,6 +156,8 @@ void main() { outColor = vec4((f*f*f+.9*f*f+.9*f)*color,1.); } + +*/ /* uniform float u_time; out vec4 outColor; diff --git a/grk/cw 6/shaders/shader_pbr.frag b/grk/cw 6/shaders/shader_pbr.frag index 01d6ff1..ff946fe 100644 --- a/grk/cw 6/shaders/shader_pbr.frag +++ b/grk/cw 6/shaders/shader_pbr.frag @@ -7,7 +7,7 @@ uniform sampler2D depthMap; uniform vec3 cameraPos; -uniform sampler2D colorTexture; +uniform sampler2D colorTexture; //planet texture uniform vec3 sunDir; uniform vec3 sunColor; @@ -15,10 +15,11 @@ uniform vec3 sunColor; uniform vec3 lightPos; uniform vec3 lightColor; -uniform float metallic; -uniform float roughness; +uniform float metallic; //pbr +uniform float roughness; //pbr +uniform float exposition; //pbr -uniform float exposition; +uniform float u_time; in vec3 vecNormal; in vec3 worldPos; @@ -30,6 +31,8 @@ in vec3 viewDirTS; in vec3 lightDirTS; in vec3 sunDirTS; +vec4 textureColor; + float DistributionGGX(vec3 normal, vec3 H, float roughness) { float a = roughness * roughness; @@ -104,8 +107,71 @@ vec3 toneMapping(vec3 color) return mapped; } -void main() -{ +float random (in vec2 st) { + return fract(sin(dot(st.xy, + vec2(12.9898,78.233)))* + 43758.5453123); +} + +// Based on Morgan McGuire @morgan3d +// https://www.shadertoy.com/view/4dS3Wd +float noise (in vec2 st) { + vec2 i = floor(st); + vec2 f = fract(st); + + // Four corners in 2D of a tile + float a = random(i); + float b = random(i + vec2(1.0, 0.0)); + float c = random(i + vec2(0.0, 1.0)); + float d = random(i + vec2(1.0, 1.0)); + + vec2 u = f * f * (3.0 - 2.0 * f); + + return mix(a, b, u.x) + + (c - a)* u.y * (1.0 - u.x) + + (d - b) * u.x * u.y; +} + +#define OCTAVES 6 +float fbm (in vec2 st) { + // Initial values + float value = 0.0; + float amplitude = .5; + float frequency = 0.; + // + // Loop of octaves + for (int i = 0; i < OCTAVES; i++) { + value += amplitude * noise(st); + st *= 2.; + amplitude *= .5; + } + return value; +} + +vec4 noiseColor() { + vec2 st = vtc; + float cloudIntensity = 15.0; + + // Efekt lustrzanego odbicia + vec2 mirroredSt = vec2(1.0 - st.x, st.y); + vec3 mirroredColor = vec3(0.0); + mirroredColor += fbm(mirroredSt * cloudIntensity); + + // Efekt oryginalny + vec3 color = vec3(0.0); + color += fbm(st * cloudIntensity); + + // Dodaj gradientowe mieszanie miêdzy orygina³em a lustrzanym odbiciem + float gradient = smoothstep(0.45, 0.55, st.x); + vec3 finalColor = mix(color, mirroredColor, gradient); + + vec4 noiseColor = vec4(finalColor, 1.0); + + return noiseColor; +} + + +void main() { vec3 normal = normalize(vecNormal); vec3 viewDir = normalize(cameraPos - worldPos); @@ -128,5 +194,11 @@ void main() //sun illumination = illumination + PBRLight(sunDir, sunColor, normal, viewDir, toneMappedColor); - outColor = vec4(vec3(1.0) - exp(-illumination * exposition), 1); + textureColor = vec4(vec3(1.0) - exp(-illumination * exposition), 1); + + vec4 noiseColor = noiseColor(); + + vec3 mixedColor = mix(textureColor.rgb, noiseColor.rgb, noiseColor.r); + + outColor = vec4(mixedColor * min(1, AMBIENT + diffuse), 1.0); } diff --git a/grk/cw 6/src/Planet.hpp b/grk/cw 6/src/Planet.hpp index 10b126f..fefc815 100644 --- a/grk/cw 6/src/Planet.hpp +++ b/grk/cw 6/src/Planet.hpp @@ -232,7 +232,7 @@ void drawSkyBox(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint text glUseProgram(0); } -void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint texture, float roughness, float metallic) { +void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint texture, float roughness, float metallic, float time) { glUseProgram(programPbr); Core::SetActiveTexture(texture, "colorTexture", programPbr, 0); glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix(); @@ -252,6 +252,7 @@ void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint t glUniform3f(glGetUniformLocation(programPbr, "lightPos"), sunPos.x, sunPos.y, sunPos.z); glUniform3f(glGetUniformLocation(programPbr, "lightColor"), lightColor.x, lightColor.y, lightColor.z); + glUniform1f(glGetUniformLocation(programNoise, "u_time"), time); Core::DrawContext(context); glUseProgram(0); @@ -285,8 +286,8 @@ void renderScene(GLFWwindow* window) { glm::mat4 cloudScale = glm::scale(glm::vec3(planetSize * 1.05f)); //drawPlanet(sphereContext, planetTranslate * planetRotate * planetScale, planetTex); - drawObjectPBR(sphereContext, planetTranslate * planetRotate * planetScale, planetTex, planetRough, planetMetal); - drawObjectNoise(sphereContext, planetTranslate * planetRotate * cloudScale, time); + drawObjectPBR(sphereContext, planetTranslate * planetRotate * planetScale, planetTex, planetRough, planetMetal, time); + //drawObjectNoise(sphereContext, planetTranslate * planetRotate * cloudScale, time); //rysowanie sÅ‚oÅ„ca glm::mat4 sunScale = glm::scale(glm::vec3(sunSize)); @@ -335,7 +336,7 @@ void init(GLFWwindow* window) { programPbr = shaderLoader.CreateProgram("shaders/shader_pbr.vert", "shaders/shader_pbr.frag"); programSun = shaderLoader.CreateProgram("shaders/shader_sun.vert", "shaders/shader_sun.frag"); programSkyBox = shaderLoader.CreateProgram("shaders/shader_skybox.vert", "shaders/shader_skybox.frag"); - programNoise = shaderLoader.CreateProgram("shaders/shader_pbr.vert", "shaders/shader_noise.frag"); + //programNoise = shaderLoader.CreateProgram("shaders/shader_pbr.vert", "shaders/shader_noise.frag"); loadModelToContext("./models/sphere.obj", sphereContext); loadModelToContext("./models/cube.obj", cubeContext); From cdce9652332acf685ed015d47191c978fbf880dc Mon Sep 17 00:00:00 2001 From: sasankasa Date: Sat, 3 Feb 2024 14:34:57 +0100 Subject: [PATCH 3/5] =?UTF-8?q?pr=C3=B3by=20ruszania=20chmurami=20-=20usun?= =?UTF-8?q?i=C4=99cie=20linii=20przy=20po=C5=82=C4=85czeniu=20chmur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grk/cw 6/shaders/shader_noise.frag | 198 +++++------------------------ grk/cw 6/shaders/shader_pbr.frag | 41 +++--- grk/cw 6/shaders/shader_pbr.vert | 5 + grk/cw 6/src/Planet.hpp | 56 ++------ 4 files changed, 71 insertions(+), 229 deletions(-) diff --git a/grk/cw 6/shaders/shader_noise.frag b/grk/cw 6/shaders/shader_noise.frag index 2454642..1febbcb 100644 --- a/grk/cw 6/shaders/shader_noise.frag +++ b/grk/cw 6/shaders/shader_noise.frag @@ -1,164 +1,5 @@ #version 430 core -/*float PI = 3.14159f; - -uniform sampler2D colorTexture; - -uniform float exposition; - -in vec3 vecNormal; -in vec3 worldPos; -in vec2 vtc; - -out vec4 outColor; - -in vec3 viewDirTS; -in vec3 lightDirTS; -in vec3 sunDirTS; - -uniform float u_time; -float pi = 3.14159; -// 2D Random -float random (in vec2 st) { - return fract(sin(dot(st.xy, - vec2(12.9898,78.233))) - * 43758.5453123); -} - -// 2D Noise based on Morgan McGuire @morgan3d -// https://www.shadertoy.com/view/4dS3Wd -float noise (in vec2 st) { - vec2 i = floor(st); - vec2 f = fract(st); - - // Four corners in 2D of a tile - float a = random(i); - float b = random(i + vec2(1.0, 0.0)); - float c = random(i + vec2(0.0, 1.0)); - float d = random(i + vec2(1.0, 1.0)); - - vec2 randA = vec2(a *2.0 *pi); - vec2 randB = vec2(b *2.0 *pi); - vec2 randC = vec2(c *2.0 *pi); - vec2 randD = vec2(d *2.0 *pi); - - vec2 offsetA = a-st; - vec2 offsetB = b-st; - vec2 offsetC = c-st; - vec2 offsetD = d-st; - - offsetA = offsetA*randA; - offsetB = offsetB*randB; - offsetC = offsetC*randC; - offsetD = offsetD*randD; - - float resA = smoothstep(offsetA.x,offsetA.y, f.y); - float resB = smoothstep(offsetB.x,offsetB.y, f.y); - float resC = smoothstep(offsetC.x,offsetC.y, f.y); - float resD = smoothstep(offsetD.x,offsetD.y, f.y); - - vec2 u = smoothstep(0.,1.,f); - - - float ab= mix(a, b, u.x); - float cd = mix(c, d, u.x); - return mix(ab,cd,u.y); - -} - -void main() -{ - - vec2 st = vtc; - vec2 pos = vec2(st*3.776); - pos.x -= u_time * 0.07; - // Use the noise function - float n = 1.836 * 0.676*noise(pos*2.576); - n = smoothstep(-0.096, 1.176, n); - - outColor = vec4(vec3(n), 1); -} -*/ -/* -out vec4 outColor; -uniform float u_time; - -in vec2 vtc; - -float random (in vec2 _st) { - return fract(sin(dot(_st.xy, - vec2(12.9898,78.233)))* - 43758.5453123); -} - -// Based on Morgan McGuire @morgan3d -// https://www.shadertoy.com/view/4dS3Wd -float noise (in vec2 _st) { - vec2 i = floor(_st); - vec2 f = fract(_st); - - // Four corners in 2D of a tile - float a = random(i); - float b = random(i + vec2(1.0, 0.0)); - float c = random(i + vec2(0.0, 1.0)); - float d = random(i + vec2(1.0, 1.0)); - - vec2 u = f * f * (3.0 - 2.0 * f); - - return mix(a, b, u.x) + - (c - a)* u.y * (1.0 - u.x) + - (d - b) * u.x * u.y; -} - -#define NUM_OCTAVES 5 - -float fbm ( in vec2 _st) { - float v = 0.0; - float a = 0.5; - vec2 shift = vec2(100.0); - // Rotate to reduce axial bias - mat2 rot = mat2(cos(0.5), sin(0.5), - -sin(0.5), cos(0.50)); - for (int i = 0; i < NUM_OCTAVES; ++i) { - v += a * noise(_st); - _st = rot * _st * 3.0 + shift; - a *= 0.6; - } - return v; -} - -void main() { - vec2 st = vtc; - // st += st * abs(sin(u_time*0.1)*3.0); - vec3 color = vec3(0.0); - - vec2 q = vec2(0.); - q.x = fbm( st + 0.00*u_time); - q.y = fbm( st + vec2(1.0)); - - vec2 r = vec2(0.); - r.x = fbm( st + 1.0*q + vec2(1.7,9.2)+ 0.15*u_time ); - r.y = fbm( st + 1.0*q + vec2(8.3,2.8)+ 0.126*u_time); - - float f = fbm(st+r); - - color = mix(vec3(0.101961,0.619608,0.666667), - vec3(0.666667,0.666667,0.498039), - clamp((f*f)*4.0,0.0,1.0)); - - color = mix(color, - vec3(0.995,0.077,0.220), - clamp(length(q),0.0,1.0)); - - color = mix(color, - vec3(1.000,0.925,0.132), - clamp(length(r.x),0.0,1.0)); - - outColor = vec4((f*f*f+.9*f*f+.9*f)*color,1.); -} - -*/ -/* uniform float u_time; out vec4 outColor; in vec2 vtc; @@ -208,17 +49,40 @@ float fbm (in vec2 st) { } void main() { + +/* vec2 st = vtc; - //vec2 st = vtc.xy/worldPos.xy; - //st += st * abs(sin(u_time*0.1)*10.0); - //st.x *= worldPos.x/worldPos.y; + float cloudIntensity = 15.0; + + + + // Efekt lustrzanego odbicia + vec2 mirroredSt = vec2(1.0 - st.x, st.y); + mirroredSt.x += u_time * 0.07; + vec3 mirroredColor = vec3(0.0); + mirroredColor += fbm(mirroredSt * cloudIntensity); + + st.x -= u_time * 0.07; + // Efekt oryginalny + vec3 color = vec3(0.0); + color += fbm(st * cloudIntensity); + + // Dodaj gradientowe mieszanie miêdzy orygina³em a lustrzanym odbiciem + float gradient = smoothstep(0.45, 0.55, st.x); + vec3 finalColor = mix(color, mirroredColor, gradient); + + outColor = vec4(finalColor, 1.0); + */ + + vec2 st = vtc; + st.x -= u_time * 0.07; vec3 color = vec3(0.0); - color += fbm(st*3.0); + color += fbm(st*10.0); - vec3 mixedColor = mix(vec3(0.4), color, color.r); + //vec3 mixedColor = mix(vec3(0.4), color, color.r); //color = mix(vec3(1.0), fbm(st*3.0), 0.1); - outColor = vec4(mixedColor,1.0); - -}*/ \ No newline at end of file + outColor = vec4(color,1.0); + +} \ No newline at end of file diff --git a/grk/cw 6/shaders/shader_pbr.frag b/grk/cw 6/shaders/shader_pbr.frag index ff946fe..715a5d2 100644 --- a/grk/cw 6/shaders/shader_pbr.frag +++ b/grk/cw 6/shaders/shader_pbr.frag @@ -24,6 +24,7 @@ uniform float u_time; in vec3 vecNormal; in vec3 worldPos; in vec2 vtc; +in vec2 vtcNoise; out vec4 outColor; @@ -113,8 +114,6 @@ float random (in vec2 st) { 43758.5453123); } -// Based on Morgan McGuire @morgan3d -// https://www.shadertoy.com/view/4dS3Wd float noise (in vec2 st) { vec2 i = floor(st); vec2 f = fract(st); @@ -148,22 +147,30 @@ float fbm (in vec2 st) { return value; } -vec4 noiseColor() { - vec2 st = vtc; +vec4 noiseColor(float time) { float cloudIntensity = 15.0; - // Efekt lustrzanego odbicia + vec2 st = vtc.xy; vec2 mirroredSt = vec2(1.0 - st.x, st.y); - vec3 mirroredColor = vec3(0.0); - mirroredColor += fbm(mirroredSt * cloudIntensity); - // Efekt oryginalny - vec3 color = vec3(0.0); - color += fbm(st * cloudIntensity); + // Adjust animation to be boundary-aware + float timeOffset = time * 0.07; + st.x -= timeOffset; + mirroredSt.x += timeOffset; // Inverse direction for mirrored effect - // Dodaj gradientowe mieszanie miêdzy orygina³em a lustrzanym odbiciem - float gradient = smoothstep(0.45, 0.55, st.x); - vec3 finalColor = mix(color, mirroredColor, gradient); + // Ensure wrapping or clamping based on your texture coordinates' expectations + st.x = fract(st.x); + mirroredSt.x = fract(mirroredSt.x); + + // Calculate cloud patterns + vec3 color = vec3(fbm(st * cloudIntensity)); + vec3 mirroredColor = vec3(fbm(mirroredSt * cloudIntensity)); + + // Dynamic gradient based on X coordinate, ensuring smooth transition + float blend = smoothstep(0.45, 0.55, st.x); // Adjust these values as needed + + // Blend based on the dynamic gradient + vec3 finalColor = mix(color, mirroredColor, blend); vec4 noiseColor = vec4(finalColor, 1.0); @@ -196,9 +203,11 @@ void main() { textureColor = vec4(vec3(1.0) - exp(-illumination * exposition), 1); - vec4 noiseColor = noiseColor(); + vec4 noiseColor = noiseColor(u_time); - vec3 mixedColor = mix(textureColor.rgb, noiseColor.rgb, noiseColor.r); + vec3 mixedColor = mix(textureColor.rgb, noiseColor.rgb, u_time); - outColor = vec4(mixedColor * min(1, AMBIENT + diffuse), 1.0); + outColor = vec4(mixedColor, 1.0); + + //outColor = vec4(mixedColor * min(1, AMBIENT + diffuse), 1.0); } diff --git a/grk/cw 6/shaders/shader_pbr.vert b/grk/cw 6/shaders/shader_pbr.vert index ae1608d..d0b05bc 100644 --- a/grk/cw 6/shaders/shader_pbr.vert +++ b/grk/cw 6/shaders/shader_pbr.vert @@ -9,9 +9,13 @@ layout(location = 4) in vec3 vertexBitangent; uniform mat4 transformation; uniform mat4 modelMatrix; +uniform mat4 noiseTransformation; +uniform mat4 noiseMatrix; + out vec3 vecNormal; out vec3 worldPos; out vec2 vtc; +out vec2 vtcNoise; uniform vec3 lightPos; uniform vec3 cameraPos; @@ -28,6 +32,7 @@ void main() gl_Position = transformation * vec4(vertexPosition, 1.0); vtc = vec2(vertexTexCoord.x, 1.0 - vertexTexCoord.y); + vtcNoise = vec2(vertexTexCoord.x, 1.0 - vertexTexCoord.y); vec3 w_tangent = normalize(mat3(modelMatrix) * vertexTangent); vec3 w_bitangent = normalize(mat3(modelMatrix) * vertexBitangent); diff --git a/grk/cw 6/src/Planet.hpp b/grk/cw 6/src/Planet.hpp index fefc815..2d698ca 100644 --- a/grk/cw 6/src/Planet.hpp +++ b/grk/cw 6/src/Planet.hpp @@ -14,49 +14,6 @@ #include #include -/* -namespace texturePlanets { - GLuint blank; - GLuint earth; - GLuint planet; - GLuint mercury; - GLuint venus; - GLuint mars; - GLuint alpine; - GLuint ceres; - GLuint eris; - GLuint haumea; - GLuint icy; - GLuint jupiter; - GLuint makemake; - GLuint martian; - GLuint neptune; - GLuint saturn; - GLuint savannah; - GLuint swamp; - GLuint tropical; - GLuint uranus; - GLuint venusian; - GLuint volcanic; -} - -namespace textureSuns { - GLuint sun1; - GLuint sun2; - GLuint sun3; - GLuint sun4; -} - -namespace textureMoons { - GLuint moon1; - GLuint moon2; - GLuint moon3; -} - -namespace textureMaterials { - GLuint clouds; -} -*/ GLuint programDepth; GLuint programTex; GLuint programPbr; @@ -232,13 +189,16 @@ void drawSkyBox(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint text glUseProgram(0); } -void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint texture, float roughness, float metallic, float time) { +void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, glm::mat4 noiseMatrix, GLuint texture, float roughness, float metallic, float time) { glUseProgram(programPbr); Core::SetActiveTexture(texture, "colorTexture", programPbr, 0); glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix(); glm::mat4 transformation = viewProjectionMatrix * modelMatrix; + glm::mat4 noiseTransformation = viewProjectionMatrix * noiseMatrix; glUniformMatrix4fv(glGetUniformLocation(programPbr, "transformation"), 1, GL_FALSE, (float*)&transformation); + glUniformMatrix4fv(glGetUniformLocation(programPbr, "noiseTransformation"), 1, GL_FALSE, (float*)&transformation); glUniformMatrix4fv(glGetUniformLocation(programPbr, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix); + glUniformMatrix4fv(glGetUniformLocation(programPbr, "noiseMatrix"), 1, GL_FALSE, (float*)&noiseMatrix); glUniform1f(glGetUniformLocation(programPbr, "exposition"), lightPower); @@ -283,10 +243,13 @@ void renderScene(GLFWwindow* window) { glm::mat4 planetRotate = glm::rotate(time * planetRot, glm::vec3(0, 1, 0)); glm::mat4 planetTranslate = glm::translate(planetPos); + glm::mat4 planetMatrix = planetTranslate * planetRotate * planetScale; + glm::mat4 noiseMatrix = planetTranslate * planetScale; + glm::mat4 cloudScale = glm::scale(glm::vec3(planetSize * 1.05f)); //drawPlanet(sphereContext, planetTranslate * planetRotate * planetScale, planetTex); - drawObjectPBR(sphereContext, planetTranslate * planetRotate * planetScale, planetTex, planetRough, planetMetal, time); + drawObjectPBR(sphereContext, planetMatrix, noiseMatrix, planetTex, planetRough, planetMetal, time); //drawObjectNoise(sphereContext, planetTranslate * planetRotate * cloudScale, time); //rysowanie sÅ‚oÅ„ca @@ -336,7 +299,7 @@ void init(GLFWwindow* window) { programPbr = shaderLoader.CreateProgram("shaders/shader_pbr.vert", "shaders/shader_pbr.frag"); programSun = shaderLoader.CreateProgram("shaders/shader_sun.vert", "shaders/shader_sun.frag"); programSkyBox = shaderLoader.CreateProgram("shaders/shader_skybox.vert", "shaders/shader_skybox.frag"); - //programNoise = shaderLoader.CreateProgram("shaders/shader_pbr.vert", "shaders/shader_noise.frag"); + programNoise = shaderLoader.CreateProgram("shaders/shader_pbr.vert", "shaders/shader_noise.frag"); loadModelToContext("./models/sphere.obj", sphereContext); loadModelToContext("./models/cube.obj", cubeContext); @@ -353,6 +316,7 @@ void shutdown(GLFWwindow* window) { shaderLoader.DeleteProgram(programPbr); shaderLoader.DeleteProgram(programSun); shaderLoader.DeleteProgram(programSkyBox); + shaderLoader.DeleteProgram(programNoise); } //obsluga wejscia From 30d796fe055cb7555e8f364161b57dc43480809e Mon Sep 17 00:00:00 2001 From: sasankasa Date: Sat, 3 Feb 2024 19:44:26 +0100 Subject: [PATCH 4/5] poprawka --- grk/cw 6/shaders/shader_pbr.frag | 13 +++++++++---- grk/cw 6/shaders/shader_pbr.vert | 7 +++++++ grk/cw 6/src/Planet.hpp | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/grk/cw 6/shaders/shader_pbr.frag b/grk/cw 6/shaders/shader_pbr.frag index 715a5d2..b85595d 100644 --- a/grk/cw 6/shaders/shader_pbr.frag +++ b/grk/cw 6/shaders/shader_pbr.frag @@ -23,6 +23,8 @@ uniform float u_time; in vec3 vecNormal; in vec3 worldPos; +in vec3 vecNormalClouds; +in vec3 worldPosClouds; in vec2 vtc; in vec2 vtcNoise; @@ -180,14 +182,17 @@ vec4 noiseColor(float time) { void main() { vec3 normal = normalize(vecNormal); + vec3 normalClouds = normalize(vecNormalClouds); vec3 viewDir = normalize(cameraPos - worldPos); vec3 lightDir = normalize(lightPos - worldPos); + vec3 lightDirClouds = normalize(lightPos - worldPosClouds); vec4 textureColor = texture2D(colorTexture, vtc); float diffuse = max(0, dot(normal, lightDir)); + //float diffuseClouds = max(0, dot(normalClouds, lightDir)); vec3 distance = lightColor / pow(length(lightPos - worldPos), 2.0) * 300; vec3 toneMappedColor = toneMapping(vec3(textureColor) * min(1, AMBIENT + diffuse) * distance); //gamma correction @@ -203,11 +208,11 @@ void main() { textureColor = vec4(vec3(1.0) - exp(-illumination * exposition), 1); - vec4 noiseColor = noiseColor(u_time); + vec4 noiseColor = noiseColor(u_time) * min(1, AMBIENT + diffuse); - vec3 mixedColor = mix(textureColor.rgb, noiseColor.rgb, u_time); + vec3 mixedColor = mix(textureColor.rgb, noiseColor.rgb, noiseColor.r); - outColor = vec4(mixedColor, 1.0); + //outColor = vec4(mixedColor, 1.0); - //outColor = vec4(mixedColor * min(1, AMBIENT + diffuse), 1.0); + outColor = vec4(mixedColor * min(1, AMBIENT + diffuse), 1.0); } diff --git a/grk/cw 6/shaders/shader_pbr.vert b/grk/cw 6/shaders/shader_pbr.vert index d0b05bc..f8bd549 100644 --- a/grk/cw 6/shaders/shader_pbr.vert +++ b/grk/cw 6/shaders/shader_pbr.vert @@ -14,6 +14,9 @@ uniform mat4 noiseMatrix; out vec3 vecNormal; out vec3 worldPos; +out vec3 vecNormalClouds; +out vec3 worldPosClouds; + out vec2 vtc; out vec2 vtcNoise; @@ -29,6 +32,10 @@ void main() { worldPos = (modelMatrix * vec4(vertexPosition, 1)).xyz; vecNormal = (modelMatrix * vec4(vertexNormal, 0)).xyz; + + worldPosClouds = (noiseMatrix * vec4(vertexPosition, 1)).xyz; + vecNormalClouds = (noiseMatrix * vec4(vertexNormal, 0)).xyz; + gl_Position = transformation * vec4(vertexPosition, 1.0); vtc = vec2(vertexTexCoord.x, 1.0 - vertexTexCoord.y); diff --git a/grk/cw 6/src/Planet.hpp b/grk/cw 6/src/Planet.hpp index 2d698ca..738532e 100644 --- a/grk/cw 6/src/Planet.hpp +++ b/grk/cw 6/src/Planet.hpp @@ -212,7 +212,7 @@ void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, glm::mat glUniform3f(glGetUniformLocation(programPbr, "lightPos"), sunPos.x, sunPos.y, sunPos.z); glUniform3f(glGetUniformLocation(programPbr, "lightColor"), lightColor.x, lightColor.y, lightColor.z); - glUniform1f(glGetUniformLocation(programNoise, "u_time"), time); + glUniform1f(glGetUniformLocation(programPbr, "u_time"), time); Core::DrawContext(context); glUseProgram(0); From 8b2749c7e314a8f9f70ebe60eb5315135dfa069a Mon Sep 17 00:00:00 2001 From: sasankasa Date: Sun, 4 Feb 2024 12:42:23 +0100 Subject: [PATCH 5/5] =?UTF-8?q?ko=C5=84cowa=20wersja=20chmur=20wraz=20z=20?= =?UTF-8?q?parametrami=20do=20zmiany?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grk/cw 6/shaders/shader_pbr.frag | 29 ++++++++---------------- grk/cw 6/shaders/shader_pbr.vert | 10 -------- grk/cw 6/src/Planet.hpp | 39 ++++++++++---------------------- 3 files changed, 21 insertions(+), 57 deletions(-) diff --git a/grk/cw 6/shaders/shader_pbr.frag b/grk/cw 6/shaders/shader_pbr.frag index b85595d..8db6dba 100644 --- a/grk/cw 6/shaders/shader_pbr.frag +++ b/grk/cw 6/shaders/shader_pbr.frag @@ -20,13 +20,13 @@ uniform float roughness; //pbr uniform float exposition; //pbr uniform float u_time; +uniform float cloudLight; +uniform float cloudIntensity; +uniform float cloudSpeed; in vec3 vecNormal; in vec3 worldPos; -in vec3 vecNormalClouds; -in vec3 worldPosClouds; in vec2 vtc; -in vec2 vtcNoise; out vec4 outColor; @@ -149,29 +149,22 @@ float fbm (in vec2 st) { return value; } -vec4 noiseColor(float time) { - float cloudIntensity = 15.0; - +vec4 noiseColor() { vec2 st = vtc.xy; vec2 mirroredSt = vec2(1.0 - st.x, st.y); - - // Adjust animation to be boundary-aware - float timeOffset = time * 0.07; + + float timeOffset = u_time * cloudSpeed; st.x -= timeOffset; mirroredSt.x += timeOffset; // Inverse direction for mirrored effect - // Ensure wrapping or clamping based on your texture coordinates' expectations st.x = fract(st.x); mirroredSt.x = fract(mirroredSt.x); - // Calculate cloud patterns vec3 color = vec3(fbm(st * cloudIntensity)); vec3 mirroredColor = vec3(fbm(mirroredSt * cloudIntensity)); - // Dynamic gradient based on X coordinate, ensuring smooth transition - float blend = smoothstep(0.45, 0.55, st.x); // Adjust these values as needed + float blend = smoothstep(0.45, 0.55, st.x); - // Blend based on the dynamic gradient vec3 finalColor = mix(color, mirroredColor, blend); vec4 noiseColor = vec4(finalColor, 1.0); @@ -182,19 +175,17 @@ vec4 noiseColor(float time) { void main() { vec3 normal = normalize(vecNormal); - vec3 normalClouds = normalize(vecNormalClouds); vec3 viewDir = normalize(cameraPos - worldPos); vec3 lightDir = normalize(lightPos - worldPos); - vec3 lightDirClouds = normalize(lightPos - worldPosClouds); vec4 textureColor = texture2D(colorTexture, vtc); float diffuse = max(0, dot(normal, lightDir)); - //float diffuseClouds = max(0, dot(normalClouds, lightDir)); vec3 distance = lightColor / pow(length(lightPos - worldPos), 2.0) * 300; vec3 toneMappedColor = toneMapping(vec3(textureColor) * min(1, AMBIENT + diffuse) * distance); + //gamma correction //toneMappedColor = pow(toneMappedColor, vec3(1.0/2.2)); @@ -208,11 +199,9 @@ void main() { textureColor = vec4(vec3(1.0) - exp(-illumination * exposition), 1); - vec4 noiseColor = noiseColor(u_time) * min(1, AMBIENT + diffuse); + vec4 noiseColor = noiseColor() * min(1, AMBIENT + diffuse) * vec4(lightColor, 0.0) / cloudLight; vec3 mixedColor = mix(textureColor.rgb, noiseColor.rgb, noiseColor.r); - //outColor = vec4(mixedColor, 1.0); - outColor = vec4(mixedColor * min(1, AMBIENT + diffuse), 1.0); } diff --git a/grk/cw 6/shaders/shader_pbr.vert b/grk/cw 6/shaders/shader_pbr.vert index f8bd549..390db26 100644 --- a/grk/cw 6/shaders/shader_pbr.vert +++ b/grk/cw 6/shaders/shader_pbr.vert @@ -9,16 +9,10 @@ layout(location = 4) in vec3 vertexBitangent; uniform mat4 transformation; uniform mat4 modelMatrix; -uniform mat4 noiseTransformation; -uniform mat4 noiseMatrix; - out vec3 vecNormal; out vec3 worldPos; -out vec3 vecNormalClouds; -out vec3 worldPosClouds; out vec2 vtc; -out vec2 vtcNoise; uniform vec3 lightPos; uniform vec3 cameraPos; @@ -32,14 +26,10 @@ void main() { worldPos = (modelMatrix * vec4(vertexPosition, 1)).xyz; vecNormal = (modelMatrix * vec4(vertexNormal, 0)).xyz; - - worldPosClouds = (noiseMatrix * vec4(vertexPosition, 1)).xyz; - vecNormalClouds = (noiseMatrix * vec4(vertexNormal, 0)).xyz; gl_Position = transformation * vec4(vertexPosition, 1.0); vtc = vec2(vertexTexCoord.x, 1.0 - vertexTexCoord.y); - vtcNoise = vec2(vertexTexCoord.x, 1.0 - vertexTexCoord.y); vec3 w_tangent = normalize(mat3(modelMatrix) * vertexTangent); vec3 w_bitangent = normalize(mat3(modelMatrix) * vertexBitangent); diff --git a/grk/cw 6/src/Planet.hpp b/grk/cw 6/src/Planet.hpp index 738532e..2f3f577 100644 --- a/grk/cw 6/src/Planet.hpp +++ b/grk/cw 6/src/Planet.hpp @@ -73,6 +73,10 @@ int HDR_HEIGHT = 1024; float lightPower = 10.f; glm::vec3 lightColor = glm::vec3(lightPower, lightPower, lightPower); +float cloudLight = 20.f; +float cloudIntensity = 15.f; +float cloudSpeed = 0.07f; + glm::mat4 createCameraMatrix() { glm::vec3 cameraSide = glm::normalize(glm::cross(cameraDir, glm::vec3(0.f, 1.f, 0.f))); glm::vec3 cameraUp = glm::normalize(glm::cross(cameraSide, cameraDir)); @@ -189,16 +193,13 @@ void drawSkyBox(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint text glUseProgram(0); } -void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, glm::mat4 noiseMatrix, GLuint texture, float roughness, float metallic, float time) { +void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint texture, float roughness, float metallic) { glUseProgram(programPbr); Core::SetActiveTexture(texture, "colorTexture", programPbr, 0); glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix(); glm::mat4 transformation = viewProjectionMatrix * modelMatrix; - glm::mat4 noiseTransformation = viewProjectionMatrix * noiseMatrix; glUniformMatrix4fv(glGetUniformLocation(programPbr, "transformation"), 1, GL_FALSE, (float*)&transformation); - glUniformMatrix4fv(glGetUniformLocation(programPbr, "noiseTransformation"), 1, GL_FALSE, (float*)&transformation); glUniformMatrix4fv(glGetUniformLocation(programPbr, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix); - glUniformMatrix4fv(glGetUniformLocation(programPbr, "noiseMatrix"), 1, GL_FALSE, (float*)&noiseMatrix); glUniform1f(glGetUniformLocation(programPbr, "exposition"), lightPower); @@ -212,27 +213,17 @@ void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, glm::mat glUniform3f(glGetUniformLocation(programPbr, "lightPos"), sunPos.x, sunPos.y, sunPos.z); glUniform3f(glGetUniformLocation(programPbr, "lightColor"), lightColor.x, lightColor.y, lightColor.z); + + float time = glfwGetTime(); glUniform1f(glGetUniformLocation(programPbr, "u_time"), time); + glUniform1f(glGetUniformLocation(programPbr, "cloudLight"), cloudLight); + glUniform1f(glGetUniformLocation(programPbr, "cloudIntensity"), cloudIntensity); + glUniform1f(glGetUniformLocation(programPbr, "cloudSpeed"), cloudSpeed); Core::DrawContext(context); glUseProgram(0); } -void drawObjectNoise(Core::RenderContext& context, glm::mat4 modelMatrix, float time) { - - - glUseProgram(programNoise); - glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix(); - glm::mat4 transformation = viewProjectionMatrix * modelMatrix; - glUniformMatrix4fv(glGetUniformLocation(programNoise, "transformation"), 1, GL_FALSE, (float*)&transformation); - glUniformMatrix4fv(glGetUniformLocation(programNoise, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix); - glUniform1f(glGetUniformLocation(programNoise, "u_time"), time); - - Core::DrawContext(context); - glUseProgram(0); -} - - void renderScene(GLFWwindow* window) { glClearColor(0.5f, 0.0f, 0.25f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -244,13 +235,9 @@ void renderScene(GLFWwindow* window) { glm::mat4 planetTranslate = glm::translate(planetPos); glm::mat4 planetMatrix = planetTranslate * planetRotate * planetScale; - glm::mat4 noiseMatrix = planetTranslate * planetScale; - glm::mat4 cloudScale = glm::scale(glm::vec3(planetSize * 1.05f)); - - //drawPlanet(sphereContext, planetTranslate * planetRotate * planetScale, planetTex); - drawObjectPBR(sphereContext, planetMatrix, noiseMatrix, planetTex, planetRough, planetMetal, time); - //drawObjectNoise(sphereContext, planetTranslate * planetRotate * cloudScale, time); + //rysowanie planety + drawObjectPBR(sphereContext, planetMatrix, planetTex, planetRough, planetMetal); //rysowanie sÅ‚oÅ„ca glm::mat4 sunScale = glm::scale(glm::vec3(sunSize)); @@ -299,7 +286,6 @@ void init(GLFWwindow* window) { programPbr = shaderLoader.CreateProgram("shaders/shader_pbr.vert", "shaders/shader_pbr.frag"); programSun = shaderLoader.CreateProgram("shaders/shader_sun.vert", "shaders/shader_sun.frag"); programSkyBox = shaderLoader.CreateProgram("shaders/shader_skybox.vert", "shaders/shader_skybox.frag"); - programNoise = shaderLoader.CreateProgram("shaders/shader_pbr.vert", "shaders/shader_noise.frag"); loadModelToContext("./models/sphere.obj", sphereContext); loadModelToContext("./models/cube.obj", cubeContext); @@ -316,7 +302,6 @@ void shutdown(GLFWwindow* window) { shaderLoader.DeleteProgram(programPbr); shaderLoader.DeleteProgram(programSun); shaderLoader.DeleteProgram(programSkyBox); - shaderLoader.DeleteProgram(programNoise); } //obsluga wejscia