수업기록

렌더링 파이프 라인 2

뷰스페이스라는 말이 들리면 카메라를 떠올려라.

  1. 그리기 연산의 제한
  2. 원근감의 표현

뷰스페이스 변환행렬은 카메라 월드 행렬의 역행렬이다. 그럼 업과 룩을 외적하면 우축

법선 벡터

: 점/선/면과 직각을 이루는 크기가 1인 단위벡터. (방향 벡터임) 면이 바라보는 방향을 알려주는 벡터임. 법선은 지형과 모델의 명암 연산을 할 때 중요해진다.

정점 정보를 세팅할 대에는 시계방향/반시계 방향으로 통일해야 한다. 왜냐면 법선이 뒤죽박죽이 됨(정점-정점의 방향벡터를 외적하여 법선을 구하게 되니까)

SetRenderState(D3d...);

후면 출력을 하는 경우에는 스카이 스피어/스카이 큐브를 만들 때 사ㅛㅇ하긴 함. 그런데 전체 월드를 뒤덮는 스카이박스는 정말 쉽지 않다.

그렇기 때문에 하늘을 보는 기준을 카메라로 두고, 그 큐브 안에 카메라를 둔다. 그리고 카메라가 움직일 때 같이 움직이게 되면 큐브도 같이 움직이게 된다.

이때 안에서 보는 것이기 때문에 버텍스의 방향이 반시계방향으로 움직인다. 그렇기 때문에 이런 경우에 후면 출력이 필요하다.

근데 렌더 스테이트를 하게 되면 일괄적으로 전부 적용되기 때문에 세팅렌더세팅 해제의 방식으로 해야 한다.

그러나 이 부분을 온오프처럼 프레임 단위로 껐다 켰다 하게 되면 부하가 생긴다. 그래서 그부분에 대한 최적화를 고려 해보아야 한다.

그러나 업데이트 타임과 렌더 타임의 그룹이 별개로 그룹지어지는 것이 좋다.


조명

이론적으로 간략하게 할 것임. (3D에서 셰이더를 쓰긴 해야만 함) 쉐이드명암. 쉐이더 명암 연산을 도와주는 도구

HLSL을 왜 써야 함? 렌더링 파이프라인을 두고.

우리가 지금 하는 것은 고정된 렌더링 파이프라인이라고 한다.(다이렉트)

조명 연산을 하게 되면 씨피유와 지피유를 번갈아 연산을하지만 HLSL을 하면 억지로 지피유를 통해서 연산을 진행하게 됨. 그러니 연산이 참 빨라진다.

(HLSL)하이레벨셰이딩랭귀지. - 절차지향 언어임.

비쥬얼스튜디오는 이 언어를 컴파일 할 수 없기 때문에 다이렉트의 함수가 그 언어를 컴파일 해주는 기능이 있다. (이젠, 가능하긴 함.)

기본적으로 명암 연산읗 라기 위해선, 색을 인식하는 것은 빛의 의한 반사이다.

RGBA로 빛을 가정하고, 물체 또한 RGBA를 가지고 있다. 이 두가지의 색상이 혼합 연산을 하여, 그 색상값으로 인지를 하게 되는 것. (그래서 전 과제에서 조명 연산 false를 안하면 검은색이 나오던 것)

조명의 종류

방향성 조명 -위치가 존재하지 않고 방향만 존재하게 됨(원점을 기준으로)(전역적인 조명/햇빛 등을 표현할 때 사용)

점 조명 -위치값이 있고 거리가 있다. 원점을 기준으로 레인지값만큼의 구를 그리고 그 안에 있는 물체들만 조명연산을 하게 된다.(모닥불 등) 가까워질수록 강해짐. : 어튜니에션이라는 감쇠값을 사용해서 빛의 세기 조정이 가능함 점조명은 게임에서 정말 많이 쓰게된다. 그런데 설치는 많이 할 수 있지만, 반사 연산의 개수는 10개 정도까지만 가능하다. (그러니까 HLSL쓰는 거임)

스포트 라이트 조명 -조명이 corn형식으로 구성됨. 위치값과 이너 서클의 각도/ 아웃서클의 각도가 필요함. 멀어질수록 빛의 세기가 약해짐(즉 어튜니에이션이 필수다.) SR단계에서는 부하가 심해서 쓰지 않는 것이 좋다.

반사광의 종류

조명의 반사와 재질의 반사가 존재함, 즉 물질과 빛이 모두 아래 속성을 가지고 있음.

난반사 (diffuse)

  • 어느 방향으로든 동일하게 반사가 이루어지는 반사. (어느 곳에서나 동일한 색상이다. 즉 원색이라는 말과 비슷함)

정반사(specular)

  • 빛의 하이라이트, 매끄러운 재질을 표현하기 위하여, 혹은 액체를 표현할 때 사용하는 반사. 즉, 물체의 재질을 표현하기 위함.
    • 물체의 빛이 때려 맞은 입사각에 준하는 반사각을 만들고 그 위치에 흰색을 하이라이트를 만듦. 그리고 그 각도가 커질수록 흰색이 옅어짐.

환경반사(ambient)

  • 직접적인 반사가 아닌, 환경적인 반사. (즉 거울에 비친? 유리에 반사된 빛들에 의한 반사)
  • 은은한 느낌의 반사 속성이라는 뜻.(직접 조명이 아닌 공간에 의한 반사 연산)

색상 연산의 더하기 / 곱셈

색상의 곱은 감산임.(왜냐면 색상값이 0~1 사이로 백분율으로 나타내기 때문에 소수 곱 소수 이기 때문에 작아지는 것임) 더하기는 가산임.


클리핑

프로젝션에 들어오지 않은 물체는 그리지 않는다. 라는 개념. 절두체 안에 들어오면 그리고, 안들어오면 안그리고, 걸치면 걸친 부분만 그린다.

그러나 이것은 장치가 알아서 절두체를 생성했고, 그것을 알아서 판별하는 것임. (이후에 이 원리를 적용하여 오브젝트 최적화를 진행하기도 함.)


투영 변환

굉장히 중요함 투영은 투영 행렬을 해서 곱하기하면 되는 일반적인 과정이지만 그 원리가 중요하다. n차원을 n-1차원으로 변환하는 과정이다. (3차원 2차원)

투영 전까지는 z가 무한대로 펼쳐져 있으나, 투영 이후에는 전부 0~1사이로 변환됨.

투영의 종류

  1. 원근 투영 우리가 평소에 아는 투영. 원근 투영은 소실점을 최소 1개 가지고 있다.

  2. 직교 투영 원평면과 근평면의 크기가 같음 UI와 같이 모든 크기가 같은 비율로 그려질 때 사용하는 투영임. 출력의 순서만을 중요시할 때. 혹은 착시를 이용한 게임을 사용할 때 사용함(모뉴먼트 밸리 / 페즈)

z나누기

z나누기를 모르면 투영을 모르는 것임.

투영 변환은 투영행렬을 곱한 후에, 뷰스페이스 상태의 z값을 나누어줘야 함,. 왜냐면 z의 비율에 따라 축소 비율을 보아야 하기 때문에.

즉 z나누기를 했다는 것은 원근 투영을 하겠다는 것과 동이ㅏㄹ함.

FOV = 절두체의 끼인 각

fOV가 90도일 때 원래 크기 그대로이다. 이거는 FOV에서 SCALE값의 적용 공식을 보면 된다.

시야각이 넒어지면 그려지지 않던 아리를 그려야 하기 때문에 SCALE값을 적용하여 절두체 안으로 넣는다. 시야각이 좁아지면 그려지던 아이를 그려지 않아야 하기 때문에 SCALE값을 적용하여 절두체 밖으로 뺀다.

투영 공간은 저사각형 공간임. 중앙에 정사각형을 출력한다. 투영 변환 이후에 뷰포트 변환을 한다고 보자 ( 즉 윈도우 좌표로 변환한다.) 윈도우는 직사각형이기 때문에 x축이 더 길기 때문에, 투영행렬에서 미리 x값에 종횡비를 나눠주는 공식이 있음.

z나누기가 강조되는 이유는 조명의 디렉션과 등등은 월드 스페이스에 존재한다. 그러나 셰이딩