본문 바로가기

셰이더 (Shader)89

[RSL] Part2 : Color Math (134p ~ 155p) 색상 조작은 셰이더 개발의 중요한 부분이다. 다른 공간(space)에서 색상을 표현하면 작업이 훨씬 쉬워질 수 있는 상황에 자주 마주하게 될 것이다. 또한 색상을 곱셈, 덧셈, 뺄셈해야 할 수도 있다. 그래서 조작법과 그 결과를 알아야한다. 이 섹션에서는 색상 수학의 이론을 살펴본다. 두 가지 색상에 적용할 수 있는 모든 주요 작업에 대한 함수를 제시한다. Color Theory and Spaces 색상이 작동하는 방식을 이해하기 위해 먼저 빛의 물리적 특성을 알아보자. 1665년 ~ 1666년 사이에, 아이작 뉴턴은 태양빛이 유리 프리즘을 통과하면 생기는 "색상의 스펙트럼"을 발견했다. 스펙트럼은 빨강부터 보라색까지 모든 색상으로 이루어져있다. 무지개를 보는 것이 바로 그런 현상이다. 무지개는 공기 중.. 2023. 5. 30.
[RSL] Part2 : Trigonometry, Vector Math (123p ~ 134p) Trigonometry 수학의 난이도를 한 단계 올려보자. 삼각함수는 어려울 수 있지만, 기억해야 할 공식과 성질은 손가락에 꼽을 정도로 적다. 나머지는 삼각함수 책이나 웹사이트에서 언제든 찾아보면 된다. 삼각함수는 모두 삼각형과 관련이 있다. 따라서 삼각형의 중요한 성질들을 살펴보자. 삼각형은 세 개의 변으로 이루어져있다. 변들이 서로 만나는 부분에는 각도가 있다. 삼각형의 각도의 합은 항상 180도, 혹은 라디안으로 표현하면 pi / 2 이다. 삼각형은 많은 종류가 있지만, 컴퓨터 그래픽스의 공부에서 가장 흔한 것은 직각삼각형이다. 직각삼각형은 한 개의 90도 각을 가지고 있으며, 다른 두 각은 90도를 합친 값이 된다. 삼각형의 가장 긴 변은 (언제나 90도 각도의 맞은편에 위치함) 빗변(hypot.. 2023. 5. 16.
[RSL] Part2 : Useful Operations (105p ~ 119p) 수학은 추상적이고 어렵고 지루하다고 생각할 수 있다. 하지만 훌륭한 쉐이더 TD가 되기 위해서는 꼭 필요하다. 하지만 걱정하지 마라. 인간 계산기가 되지 않아도 된다. 오히려 계산기를 사용하는 것이 많은 도움이 된다. 앞으로 다룰 개념과 이론은 어려울 수 있지만, 우리는 수학자가 아니다. 따라서 이론이 왜 작동하는지나 수학적 증명 등을 걱정할 필요는 없다. 우리가 해야 할 일은 연산과 속성을 배우고 필요할 때 적용하는 것 뿐이다. 몇 가지 연산에 익숙해지려면 연습이 필요할 수 있다. 하지만 풀어내지 못해 좌절하진 마라. 쉐이더 TD로서 일상적으로 사용하는 수학의 양은 많지 않다. 익숙해져야 할 연산과 속성은 매우 제한적이다. 쉐이더 TD로서 가치를 크게 높일 수 있는 수학적 연구들도 많이 있지만, 그것은.. 2023. 5. 10.
[RSL] Part1 : Your First Shader (66p ~ 91p) Your First Shader : "Hello World Shader" 첫 번째 셰이더를 작성해보자. RenderMan 셰이딩은 프로그래밍 언어인 RSL을 사용한다. 일반적으로 프로그래밍 언어를 소개할 때 사용하는 "hello world" 프로그램을 작성하자. 우리의 경우 "constant" 셰이더로 알려진 것을 작성할 것이다. 각 표면의 모든 점에 단일 값이 지정되어, 장면의 모든 조명을 완전히 무시한다. 이것은 쓸모없는 셰이더처럼 보일 수 있지만, 씬 디버깅 및 합성 매트를 만드는 데 유용하다. 다음과 같이 입력하라. surface helloWorld() { Oi = Os; Ci = Oi * Cs; } 파일을 helloWorld.sl로 저장한다. 셰이더의 첫 번째 줄은 이 셰이더가 표면 유형임을 선.. 2023. 5. 8.
[GLSL] 13 - Fractal Brownian Motion 노이즈의 근본인, 파동(wave)과 파동의 성질을 살펴보자. 파동의 두 가지 중요한 특성은 진폭과 주파수이다. 간단한 선형(1차원) 파동의 방정식은 다음과 같다. float amplitude = 1.; float frequency = 1.; y = amplitude * sin(x * frequency); 파동의 또 다른 특성은 합산할 수 있다는 것이다. ( 두 개 이상의 파동을 합침) 이는 공식적으로 superposition(중첩)이라고 불린다. // 위 이미지 참고링크 https://www.acs.psu.edu/drussell/demos/superposition/superposition.html // 예제 진폭과 주파수가 다른 파동을 더하면 모양이 어떻게 되는지 주목하라. float amplitude .. 2023. 5. 4.
[GLSL] 12 - Cellular Noise 펄린의 노이즈가 나온 지 16년 후이자, 심플렉스 노이즈가 나오기 5년 전인 1996년, 스티븐 월리는 "셀룰러 텍스처 베이스 함수"라는 논문을 썼다. 이 기법의 원리를 이해하려면 반복문에 대해 알아야한다. GLSL에서 for 루프에는 단점이 있다. 조건식의 숫자가 상수(const)여야 한다는 점이다. 따라서 동적 루프는 사용할 수 없다. 반복 횟수를 고정해야한다. 예제를 보자. Points for a distance field 셀룰러 노이즈는 거리 필드 기반으로 계산한다. 특정한 점으로부터의 가장 가까운 지점까지의 거리를 사용하는 것이다. 예를 들어, 4개의 점으로 구성된 거리 필드를 만들어보자. 각 픽셀이 가장 가까운 점까지의 거리를 계산해야한다. 즉, 점 개수만큼 반복하여 현재 픽셀까지의 거리를 계.. 2023. 5. 3.
[GLSL] 11 - Noise 현실 세계 무작위성을 가지고 있지만, 랜덤과는 다르다. 이 다양성을 어떻게 표현할까? 1980년대 초 영화 "트론"을 위해 보다 사실적인 텍스처를 생성해 달라는 의뢰를 받은 켄 펄린은 이 문제를 해결했다. 이에 대한 해답으로 노이즈 알고리즘을 고안해냈다. 다음은 고전적인 펄린 노이즈 알고리즘은 아니지만, 노이즈 생성 방법을 이해하기 위한 기초 예제이다. float i = floor(x); // integer float f = fract(x); // fraction y = rand(i); //rand() is described in the previous chapter y = mix(rand(i), rand(i + 1.0), f); // 선형 보간법 y = mix(rand(i), rand(i + 1.0),.. 2023. 4. 26.
[GLSL] 10 - Random 랜덤은 엔트로피의 최대 표현이다. 코드에서 어떻게 랜덤을 생성할 수 있을까? 다음 함수를 분석해보자. y = fract(sin(x)*1.0); sin 값은 -1.0과 1.0 사이에서 변동한다. 소수점 뒤를 잘라서 0.0과 1.0 사이의 모든 양수 값으로 만들었다. 이를 사용하면, 사인파를 잘게 쪼개서 랜덤 값을 얻을 수 있다. sin(x)의 뒤에 큰 숫자를 곱하는 것이다. 100000.0만큼 곱하면 더 이상 사인파를 식별할 수 없게 된다. Controlling chaos 랜덤 사용시 주의할 점이 있다. 충분히 무작위적이지 않을 수 있다. 자세히 살펴보면 -1.5707과 1.5707에서 sin() 형태가 보인다. 이 지점은 사인파의 최대값과 최소값이 발생하는 지점이기 때문이다. 또한 분포가 가장자리에 비해.. 2023. 4. 25.
[GLSL] 9 - Patterns 정규화된 좌표계를 3으로 늘린다. 여기에 fract 함수를 적용한다. 0-1값에서 생성된 실수값, 1-2 값에서 생성된 실수값, 2-3 값에서 생성된 실수값. 3x3 셀을 얻을 수 있다. float circle(in vec2 _st, in float _radius){ vec2 l = _st-vec2(0.5); return 1.-smoothstep(_radius-(_radius*0.01), _radius+(_radius*0.01), dot(l,l)*4.0); } void main() { vec2 st = gl_FragCoord.xy/u_resolution; vec3 color = vec3(0.0); st *= 3.0; // Scale up the space by 3 st = fract(st); // Wra.. 2023. 4. 20.