본문 바로가기
DirectX11/정보정리

[DirectX11] 색상

by 마두식 2022. 11. 3.
반응형

※  아래의 내용들은 DirectX 11을 이용한 3D 게임 프로그래밍 입문 책의 내용을 바탕으로 작성된 것입니다.

 

Direct3D
  • 색상 연산

-  벡터의 덧셈, 뺄셈, 스칼라 곱셈은 색상 연산에도 적용된다
-  내적이나 외적 같은 연산은 색상 벡터에 무의미하다.
-  변조(modulation) : 색상 벡터만의 연산으로 성분별 곱셈을 의미한다.

ex : (a,b,c)ⓧ(x,y,z) = (ax, by, cz)


-  변조는 주로 조명 공식에 사용된다.(예시는 책 166p)
-  색상 성분은 [0,1] 범위로 표시되며 색상 연산 중에는 해당 범위 밖으로 값이 벗어날 수도 있다.

=>  한정(clamping) 연산을 통해 0보다 작은 값은 0으로 1보다 큰 값은 1로 적용한다.

 

  • 128비트 색상

-  r,g,b 외에도 알파(a)라는 색상 성분 하나를 색상 벡터에 추가하는 경우가 많다

=>  알파 성분은 주로 색상의 불투명도를 나타낸다


-  하나의 색상을 r,g,b,a인 4차원 벡터로 표현한다는 뜻이다.
-  각 성분을 32비트 부동소수점 값으로 표현함으로써 하나의 색상을 총 128비트로 표현한다.
-  코드에서는 XMVECTOR 형식을 이용하여 색상을 표현한다.

=>  XNA Math 라이브러리의 벡터 함수들로 색상 연산을 수행함으로써 SIMD의 이점을 취할 수 있다.

 

  • 32비트 색상

-  각 성분당 1바이트를 할당해서 하나의 색상을 32비트로 표현할 수도 있다.

=>  성분당 8비트이므로 한 성분에 대해 총 256가지의 세기를 표현할 수 있다.


-  정수 구간 [0,255]를 실수 값 구간 [0,1]로 사상함으로써 32비트 색상을 128비트로 변환하는 것이 가능하다

=>  32비트 -> 128 비트 : 255로 나누기
=>  128비트 -> 32 비트 : 255를 곱하고 가장 가까운 정수로 변환


-  일반적으로 32비트 색상은 네 개의 8비트 색상 성분을 하나의 32비트 정수 값에 채워넣은 형태이다

=>  32비트 색상 -> 128비트 색상 변환에는 추가적인 비트 연산이 필요하다
=>  XNA Math 라이브러리는 해당 처리를 도와주는 함수가 있다.
=>  XNA Math 라이브러리는 또한 128비트 색상 -> 32비트 색상 처리를 도와주는 함수도 제공한다.


-  일반적으로 128비트 색상은 다수의 색상 연산들이 진행되는 곳에 쓰인다

ex: 픽셀 셰이더


-  128비트 색상은 정밀도를 위한 비트가 많으므로 산술 오차가 과도하게 누적되는 일이 없다.
-  최종적인 픽셀 색상은 일반적으로 후면 버퍼에 32비트 색상으로 저장된다.

-  GPU에서 CPU 메모리로의 자료 복사는 느린 연산이므로 꼭 필요한 경우가 아니라면 피해야 한다.
-  최대 속도를 위한 최선의 방법은 모든 자원을 생성해서 GPU에 올린 후 GPU 메모리에 유지하고 GPU만이 그것을 읽고 쓰는 식으로 그래픽 하드웨어가 작동하게 만드는 것이다.

 

 

 


 

 

 

틀린 부분이나 이상한 부분이 있으면 댓글로 편하게 지적해주세요.

감사합니다!

반응형

댓글