본문 바로가기

전체 글393

[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.
[C++] 챕터 11 - 포인터 : 정보에 대한 정보 // 11-1 : 변수의 주소 #include using namespace std; int main() { // 변수 정의 char c = 'B'; int i = 19; float f = 4.5f; // 주소 출력 cout 2023. 4. 27.
[C++] 챕터 10 - 구조체 : 다양한 타입의 정보를 한 곳에 모으는 법 // 10-1 : 구조체의 정의 #include using namespace std; // 구조체 정의 struct StudentInfo { char bloodType; // 혈액형 int stdNumber; // 학번 float grade; // 평점 }; int main() { // 구조체 타입의 '변수' 정의 StudentInfo si1; StudentInfo si2; return 0; } /* --- 결과 --- ------ 구조체의 가장 중요한 목표는 여러가지 변수를 그룹처럼 만드는 것이다. main함수 안에서도 정의할 수 있다. 그러나 밖에서 정의하는 것이 일반적이다. 구조체 정의는 붕어빵 틀이다. 구조체 변수 정의는 붕어빵이다. 구조체 정의시 별도 메모리 공간이 할당되지 않는다. 구조체 '변.. 2023. 4. 27.
[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.
[C++] 챕터 9 - 배열 : 변수를 여러개 모아 놓은 변수 // 9-1 : 배열의 사용 int main() { int kor_scores[5]; kor_scores[0] = 100; kor_scores[1] = 88; kor_scores[2] = 92; kor_scores[3] = 40; kor_scores[4] = 76; return 0; } /* 변수를 몇개 만들어 대괄호 안에 적어준다. */ // 9-2, 3 : 100번째 원소에 접근하기, 원소의 탐색 int main() { int kor_scores[5]; kor_scores[100] = 100; return 0; } /* 접근위반하면 프로그램 갑자기 죽을 수 있다. (잘못된 원소에 접근) 올바른 범위 인덱스 사용은 개발자 책임이다. */ /* --- 9-3 --- 원소 탐색법 알려준다. for문 돌려서.. 2023. 4. 25.
[C++] 챕터 8 - 성적표 프로젝트 Ver 1 // 8-1 : 성적표 Ver 1.0 #include using namespace std; int main() { while (1) // 계속해서 메뉴 보여주기 { // 메뉴 cout > Eng >> Math; // 평균 계산 float Ave = float(Kor + Eng + Math) / 3.0f; // 현재 입력된 학생수에 따라 변수에 값 넣기 if (0 == NumberOfStudent) { // 개인 정보 S1_No = NumberOfStudent + 1; S1_Kor = Kor; S1_Eng = Eng; S1_Math = Math; S1_Ave = Ave; // 전체 평균 TotalAve = S1_Ave; } else if (1 == NumberOfStudent) { // 개인 정보 S2_N.. 2023. 4. 25.