Computer Graphics/ShaderPixel 16

ShaderPixel - 15. 마치며

이번 과제를 진행하면서 블로그에 과정을 기록한 시간이 굉장히 뜻깊었다.사실 처음부터 블로그를 쓰며 과제를 진행한 이유는, 그때그때 어떤 고민을 했는지, 그리고 그 과정을 통해 무엇을 배웠는지를 기록하기 위해서였다. 하지만 완성된 기능이나 결과물이 나올 때마다 글을 썼기 때문에, 내가 실패했던 경험이나 과정에서 했던 고민들보다는 어떤 것을 어떻게 구현했는지에만 초점이 맞춰진 글이 되어버렸다. 이런 점이 많이 아쉽다. 앞으로도 과제를 하며 블로그를 계속 쓸 예정인데, '무엇을 구현했다'보다는 '어떤 점을 고민했고, 왜 그런 결정을 내렸는가'에 초점을 맞춰 기록하려고 한다. 그래야 과제 진행 과정이 더 풍부해지고, 나중에 돌아봤을 때도 많은 것을 얻을 수 있을 것 같다. 또 한 가지 느낀 점은, 내가 글을 조..

ShaderPixel - 14. 카메라 기준으로 오브젝트 렌더링 순서 정리하기

오브젝트를 카메라 기준으로 멀리서부터 그리는 방식을 구현하였다. 이는 일부 오브젝트, 특히 Cloud와 Water Block과 같은 효과를 위해 필요했다.왜 멀리서부터 그려야 하는가?다른 대부분의 오브젝트는 Vertex Shader에서 미리 정해진 메쉬를 통해 그릴 공간을 정하고, Fragment Shader에서 Ray Marching 방식으로 렌더링한다. 이런 방식은 프레임버퍼의 뎁스 값이 이미 Vertex Shader 단계에서 처리되므로 어떤 순서로 그려도 문제가 없다. 또한, 오브젝트들이 전시 형태로 멀리 떨어져 있어 순서의 영향을 크게 받지 않는다.그러나 Cloud와 Water Block은 조금 다르다.Cloud구름의 끝부분이 매끄럽게 처리되지 않았다.배경과 어우러지도록 렌더링해야 하는데, 현재 ..

ShaderPixel - 13. 3d shader (water block) 추가

과제의 "A 3D (or 4D) shader of your choice." 항목을 구현하기 위해 물 블록 효과를 추가하였다.이번 구현은 구름에서 사용되었던 Signed Distance Field(SDF)를 활용하여, 물결치는 블록과 같은 동적 효과를 구현하였다. 특히, 2D 텍스처를 활용한 굴절 효과와 큐브맵을 활용한 반사 효과가 핵심이다.Vertex Shader#version 330 corelayout (location = 0) in vec3 aPos;layout (location = 1) in vec3 aColor;layout (location = 2) in vec2 aTexCoord;uniform mat4 uView;uniform mat4 uProjection;uniform mat4 uTransfo..

ShaderPixel - 12. 2d shader (Kaleidoscope) 추가

과제의 "A 2D shader of your choice that uses a renderbuffer" 항목에 해당하는 Kaleidoscope(만화경) 효과를 추가하였다. 이번 구현은 Shadertoy의 Kaleidoscope 예제를 참고하여 OpenGL 환경에 맞게 수정했다.이전 오브젝트와 마찬가지로 먼저 프레임버퍼에 만화경 효과를 렌더링하고, 텍스처로 플레인에 적용하여 화면에 출력하는 방식으로 구현했다.2D 셰이더 렌더링// start 2d shader - kaleidoscopem_kaleidoscopeFramebuffer->Bind();auto& colorAttachment2D = m_kaleidoscopeFramebuffer->GetColorAttachment(0);glViewport(0, 0, ..

ShaderPixel - 11. another world 추가

과제의 A shader applied on a surface, evoking 'another world' in 3D, quite like a portal or a window. Pay attention to the perspective, the rendering must like a window in real life 항목을 구현하였다. 이번 구현은 "다른 세계"를 창처럼 표현하기 위해 기존에 사용했던 skybox, texture, simple shader를 활용하였다. 프레임을 만드는 것은 비교적 간단했지만, 자연스러운 시점 처리에 많은 고민이 필요했다.구현의 기본 원리는 간단하다:다른 세계 렌더링: 프레임 버퍼에 다른 세계를 렌더링한다.현실 세계 렌더링: 렌더링된 프레임 버퍼 텍스처를 플레인에 적용하..

ShaderPixel - 10. menger sponge 추가

과제의 An IFS.  항목에 해당하는 Menger Sponge를 구현하였다.IFS(Iterated Function System)는 재귀적으로 특정 변환을 적용하여 프랙탈 구조를 생성하는 기법이다. 이는 복잡한 패턴을 단순한 변환의 반복을 통해 효율적으로 만들어내는 데 사용된다. Menger Sponge는 이러한 IFS의 대표적인 예로, 큐브의 재귀적 분할과 제거를 통해 만들어진다. Vertex ShaderVertex Shader는 이전의 mandelbulb와 동일하다.Menger Sponge 거리 함수3D 공간 내에서 특정 점이 Menger Sponge 표면에서 얼마나 떨어져 있는지를 계산한다.사실상 이거 제외하곤 mandelbulb와 동일하게 구성하였다.float sdBox(vec3 p, vec3 b..

ShaderPixel - 9. mandelbulb 추가

과제의 A 3D Fractal of your choice (other than the mandelbox), with light, surrounding occlusion and shadows. 항목에 해당하는 Mandelbulb를 구현하였다.가장 잘 알려져있는 3D fractal이라 구현하기 쉬울 거 같아서 선택했다.Vertex ShaderVertex Shader는 이전의 mandelbox와 동일하다.Mandelbulb 거리 함수3D 공간 내에서 특정 점이 Mandelbulb 표면에서 얼마나 떨어져 있는지를 계산한다.// Mandelbulb distance functionfloat Mandelbulb(vec3 pos) { vec3 z = pos; float dr = 1.0; float r ..

ShaderPixel - 8. mandelbox 추가

과제의 A mandelbox, with lights (shadows are optionals). 항목에 해당하는 Mandelbox를 구현하였다.Vertex ShaderVertex Shader는 이전 작업들과 마찬가지로 뷰 공간 변환 및 법선 변환에 초점을 맞추었다.Mandelbox의 렌더링에 필요한 역행렬 값과 법선을 프래그먼트 셰이더로 전달하도록 작성하였다.#version 330 corelayout (location = 0) in vec3 aPos;layout (location = 1) in vec3 aNormal;uniform mat4 uView;uniform mat4 uProjection;uniform mat4 uModel;uniform mat4 uTransform;out mat4 inverseVi..

ShaderPixel - 7. 구름 안 장애물 추가

A volumetric cloud with a volumetric light, plus an object (volumetric too) inside with a higher density. The denser object must cast (volumetric) shadows on the cloud (i.e you must manage the light absorption inside the participating media). Example for the cloud, without the object. 과제를 잘 읽어 봤는데 밑줄친 부분도 있어 추가한다. 역시 과제를 꼼꼼하게 읽어야한다..장애물 추가와 기본 구현먼저 장애물(Obstacle)을 추가했다. 장애물은 작은 구 형태로 표현했고, Ray Ma..

ShaderPixel - 6. 구름 구현 (Volumetric Cloud)

A volumetric cloud with a volumetric light, plus an object (volumetric too) inside with a higher density. The denser object must cast (volumetric) shadows on the cloud (i.e you must manage the light absorption inside the participating media). Example for the cloud, without the object.과제의 이부분을 구현하였다. 레이 마칭(Ray Marching)을 활용해 구름을 렌더링 해야한다.구름의 밀도 계산, 조명(diffuse), 빛 산란(scattering)을 결합하여 볼륨 렌더링 기반의 구..