From fda254b25ee033afc2324f8cd1199d94eba9939b Mon Sep 17 00:00:00 2001 From: sasankasa Date: Wed, 7 Feb 2024 20:06:08 +0100 Subject: [PATCH 1/4] =?UTF-8?q?szum=20s=C5=82o=C5=84ca?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grk/cw 6/shaders/shader_sun.frag | 86 ++++++++++++++++++++++++++++++-- grk/cw 6/src/Planet.hpp | 6 ++- 2 files changed, 87 insertions(+), 5 deletions(-) diff --git a/grk/cw 6/shaders/shader_sun.frag b/grk/cw 6/shaders/shader_sun.frag index eb72528..009034f 100644 --- a/grk/cw 6/shaders/shader_sun.frag +++ b/grk/cw 6/shaders/shader_sun.frag @@ -7,6 +7,8 @@ uniform vec3 cameraPos; uniform bool atmosphereCheck; +uniform float time; + in vec3 vecNormal; in vec3 worldPos; in vec2 vtc; @@ -15,6 +17,8 @@ out vec4 outColor; uniform sampler2D colorTexture; +vec4 noiseColor; + vec3 toneMapping(vec3 color) { float exposure = 0.06; @@ -22,6 +26,76 @@ vec3 toneMapping(vec3 color) return mapped; } +float random (in vec2 _st) { + return fract(sin(dot(_st.xy, + vec2(-0.550,0.430)))* + 43758.5453123); +} + +float noise (in vec2 _st) { + vec2 i = floor(_st); + vec2 f = fract(_st); + + 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); + + mat2 rot = mat2(cos(0.5), sin(0.5), + -sin(0.5), cos(0.5)); + for (int i = 0; i < NUM_OCTAVES; ++i) { + v += a * noise(_st); + _st = rot * _st * 2.0 + shift; + a *= 0.9; + } + return v; +} + +vec4 noiseTexture(float time) { + vec2 st = vtc.xy * 9.; + vec3 color = vec3(0.0); + + vec2 q = vec2(0.); + q.x = fbm(st + 0.0 * 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 * time); + r.y = fbm(st + 1.0 * q + vec2(8.3, 2.8) + 0.12 * time); + + float f = fbm(st+r); + + color = mix(vec3(0.667,0.640,0.088), + vec3(0.667,0.520,0.134), + clamp((f*f)*4.640,0.712,0.056)); + + color = mix(color, + vec3(0.165,0.006,0.023), + clamp(length(q),0.072,0.408)); + + color = mix(color, + vec3(1.000,0.069,0.060), + clamp(length(r.x),0.0,1.0)); + + noiseColor = vec4((f*f*f+1.384*f*f+1.044*f)*color,1.); + + return noiseColor; +} + void main() { vec3 normal = normalize(vecNormal); @@ -36,10 +110,16 @@ void main() textureColor = mix(textureColor, atmosphereColor, pow(1 - atmosphereDot, 3)); } - vec3 distance = lightColor / pow(length(lightPos - worldPos), 2.0) * 25; - vec3 toneMappedColor = toneMapping(textureColor * distance); + vec3 distance = lightColor / pow(length(lightPos - worldPos), 2.0) * 15; + + vec4 textureNoise = noiseTexture(time); + //vec3 mixedTexture = mix(textureColor, textureNoise, textureNoise.r); + //vec3 toneMappedColor = toneMapping(mixedTexture * distance); + vec3 toneMappedColor = toneMapping(textureNoise.rgb * distance); //gamma correction toneMappedColor = pow(toneMappedColor, vec3(1.0/2.2)); - outColor = vec4(toneMappedColor * lightColor * 0.2f, 1.0); + vec3 textureToned = toneMappedColor * lightColor * 0.2f; + + outColor = vec4(textureToned, 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 4a514b2..18031fb 100644 --- a/grk/cw 6/src/Planet.hpp +++ b/grk/cw 6/src/Planet.hpp @@ -38,7 +38,7 @@ float planetRot = 0.f; float planetRough = 0.5f; float planetMetal = 0.5f; -const char* const sunTexPaths[] = { "./textures/suns/sol.jpg", "./textures/suns/orange.jpg", "./textures/suns/lava.png", "./textures/suns/star.png", "./textures/suns/sun.jpg" }; +const char* const sunTexPaths[] = { "./textures/suns/lava.png", "./textures/suns/sol.jpg", "./textures/suns/orange.jpg", "./textures/suns/star.png", "./textures/suns/sun.jpg" }; int sunTexIndex = 20; GLuint sunTex; @@ -227,6 +227,7 @@ void drawSun(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint texture glUniform3f(glGetUniformLocation(programSun, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); glUniform1i(glGetUniformLocation(programSun, "atmosphereCheck"), atmosphereCheck); + glUniform1f(glGetUniformLocation(programSun, "time"), glfwGetTime()); Core::DrawContext(context); glUseProgram(0); @@ -264,8 +265,9 @@ void renderScene(GLFWwindow* window) { //rysowanie słońca glm::mat4 sunScale = glm::scale(glm::vec3(sunSize)); glm::mat4 sunTranslate = glm::translate(sunPos); + glm::mat4 sunRotate = glm::rotate(180.f, glm::vec3(0, 1, 0)); - drawSun(sphereContext, sunTranslate * sunScale, sunTex); + drawSun(sphereContext, sunTranslate * sunRotate * sunScale, sunTex); //rysowanie skyboxa skyBoxPos = cameraPos; From ab39c86f0aff25f2d8761b1b59b15814b51ff400 Mon Sep 17 00:00:00 2001 From: sasankasa Date: Wed, 7 Feb 2024 20:19:25 +0100 Subject: [PATCH 2/4] =?UTF-8?q?poprawka=20s=C5=82o=C5=84ca?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grk/cw 6/shaders/shader_pbr.frag | 2 +- grk/cw 6/shaders/shader_sun.frag | 14 +++++++------- grk/cw 6/src/Planet.hpp | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/grk/cw 6/shaders/shader_pbr.frag b/grk/cw 6/shaders/shader_pbr.frag index 4f4e842..25f8d65 100644 --- a/grk/cw 6/shaders/shader_pbr.frag +++ b/grk/cw 6/shaders/shader_pbr.frag @@ -112,7 +112,7 @@ vec3 toneMapping(vec3 color) float random (in vec2 st) { return fract(sin(dot(st.xy, - vec2(12.9898,78.233)))* + vec2(32.9898,128.233)))* 43758.5453123); } diff --git a/grk/cw 6/shaders/shader_sun.frag b/grk/cw 6/shaders/shader_sun.frag index 009034f..5c7b048 100644 --- a/grk/cw 6/shaders/shader_sun.frag +++ b/grk/cw 6/shaders/shader_sun.frag @@ -60,7 +60,7 @@ float fbm ( in vec2 _st) { for (int i = 0; i < NUM_OCTAVES; ++i) { v += a * noise(_st); _st = rot * _st * 2.0 + shift; - a *= 0.9; + a *= 0.75; } return v; } @@ -84,11 +84,11 @@ vec4 noiseTexture(float time) { clamp((f*f)*4.640,0.712,0.056)); color = mix(color, - vec3(0.165,0.006,0.023), + vec3(0.165,0.111,0.036), clamp(length(q),0.072,0.408)); color = mix(color, - vec3(1.000,0.069,0.060), + vec3(1.000,0.306,0.143), clamp(length(r.x),0.0,1.0)); noiseColor = vec4((f*f*f+1.384*f*f+1.044*f)*color,1.); @@ -107,15 +107,15 @@ void main() { float atmosphereDot = dot(normal, viewDir); vec3 atmosphereColor = vec3(1.0, 0.08, 0.02); - textureColor = mix(textureColor, atmosphereColor, pow(1 - atmosphereDot, 3)); + textureColor = mix(textureColor, atmosphereColor, pow(1 - atmosphereDot, 2)); } vec3 distance = lightColor / pow(length(lightPos - worldPos), 2.0) * 15; vec4 textureNoise = noiseTexture(time); - //vec3 mixedTexture = mix(textureColor, textureNoise, textureNoise.r); - //vec3 toneMappedColor = toneMapping(mixedTexture * distance); - vec3 toneMappedColor = toneMapping(textureNoise.rgb * distance); + vec3 mixedTexture = mix(textureColor, textureNoise.rgb, 0.45f); + + vec3 toneMappedColor = toneMapping(mixedTexture * distance); //gamma correction toneMappedColor = pow(toneMappedColor, vec3(1.0/2.2)); diff --git a/grk/cw 6/src/Planet.hpp b/grk/cw 6/src/Planet.hpp index 18031fb..59e2e6d 100644 --- a/grk/cw 6/src/Planet.hpp +++ b/grk/cw 6/src/Planet.hpp @@ -24,7 +24,7 @@ Core::Shader_Loader shaderLoader; Core::RenderContext sphereContext; Core::RenderContext cubeContext; -const char* const planetTexPaths[] = { "./textures/planets/earth.jpg", "./textures/planets/mercury.png", "./textures/planets/venus.jpg", "./textures/planets/mars.jpg", +const char* const planetTexPaths[] = { "./textures/planets/mercury.png", "./textures/planets/venus.jpg", "./textures/planets/earth.jpg", "./textures/planets/mars.jpg", "./textures/planets/jupiter.jpg", "./textures/planets/saturn.jpg", "./textures/planets/uranus.jpg", "./textures/planets/neptune.jpg", "./textures/planets/icy.png", "./textures/planets/volcanic.png", "./textures/planets/desert.png", "./textures/planets/tropical.png", "./textures/planets/toxic.jpg", "./textures/planets/swamp.png", "./textures/planets/savannah.png", "./textures/planets/alpine.png", "./textures/planets/ceres.jpg", "./textures/planets/eris.jpg", "./textures/planets/haumea.jpg", From 7cf2fd8cf44abe6d7af41d657a6f03d959ed0676 Mon Sep 17 00:00:00 2001 From: sasankasa Date: Wed, 7 Feb 2024 20:21:42 +0100 Subject: [PATCH 3/4] name change --- grk/grk-planet-editor.sln | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 grk/grk-planet-editor.sln diff --git a/grk/grk-planet-editor.sln b/grk/grk-planet-editor.sln new file mode 100644 index 0000000..5d8f122 --- /dev/null +++ b/grk/grk-planet-editor.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33213.308 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Planeta", "cw 6\grk-cw6.vcxproj", "{3952C396-B1C6-44CD-96DD-C1AC15D32978}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3952C396-B1C6-44CD-96DD-C1AC15D32978}.Debug|x86.ActiveCfg = Debug|Win32 + {3952C396-B1C6-44CD-96DD-C1AC15D32978}.Debug|x86.Build.0 = Debug|Win32 + {3952C396-B1C6-44CD-96DD-C1AC15D32978}.Release|x86.ActiveCfg = Release|Win32 + {3952C396-B1C6-44CD-96DD-C1AC15D32978}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {AED787C0-0952-4701-A56F-36AB5A5F246A} + EndGlobalSection +EndGlobal From 89306aaf25c63813b856a18e46cf3416545a2c61 Mon Sep 17 00:00:00 2001 From: sasankasa Date: Wed, 7 Feb 2024 21:15:27 +0100 Subject: [PATCH 4/4] =?UTF-8?q?wst=C4=99pny=20opis=20projektu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Planet Editor.docx | Bin 0 -> 18481 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Planet Editor.docx diff --git a/Planet Editor.docx b/Planet Editor.docx new file mode 100644 index 0000000000000000000000000000000000000000..f6b658564b03505d8eeabe1a71893dc011d5c36a GIT binary patch literal 18481 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