목록DirectX (15)
헤더파일
포인트라이트포인트 라이트는 디렉셔널 라이트에서 일정한 입사광 벡터값을 쓴 것과 달리 픽셀 셰이더에서 정점과 빛사이의 벡터를 매번 계산한다는 점과 거리에 따른 감쇠가 있다는 점이 다릅니다. 포인트 라이트는 전구처럼 사방으로 퍼져나가는 빛이므로 벡터값을 일일이 계산해줄 필요가 있습니다.빛 벡터는 포인트라이트 위치 - 현제 월드공간 위치로 계산할 수 있고 감쇠는 1.0 - saturate(빛까지의 거리 * 포인트 라이트의 최대 도달 거리의 역수)로 계산 할 수 있습니다. 거리가 작아질수록 감쇠는 1에 가까워져 적어집니다. 감쇠값은 최종 픽셀 색상에 곱해집니다. 스포트라이트 스포트라이트는 자동차 전조등처럼 빛이 원뿔형으로 나갑니다. 포인트라이트를 계산하는 방식에서 원뿔감쇠가 추가됩니다. 원뿔 감쇠는 원뿔의 안쪽..
ForwardLightCommon.hlsl cbuffer cbPerObjectVS : register( b0 ) { float4x4 WorldViewProjection : packoffset( c0 ); float4x4 World : packoffset( c4 );} register는 상수버퍼와 리소들을 등록하는 시멘틱입니다. 숫자는 옵션입니다.b - 상수버퍼t - 텍스쳐s - 샘플러 packoffset은 한 번에 부동소수점 4개를 처리할 수 있는 gpu를 고려해 상수버퍼의 맴버들을 묶는 옵션입니다.float3 과 float 을 이 옵션으로 묶을 수 있습니다. cbuffer cbPerObjectPS : register( b0 ) { float3 EyePosition : packoffset( c0 ); f..
디렉셔널 라이트는 해나 달처럼 매우 멀리서 부터 도달하는 넓은 빛을 시뮬레이션할 때 쓰입니다. 실내 렌더링에서는 디렉셔널 라이트는 없으므로 따로 원래는 상수버퍼를 따로 만들어서 빛의 방향, 세기, 색상을 전달 합니다.다이렉션 라이트는 모든 광선이 평행하게 온다고 가정하기 때문에 미리 계산한 ㅈㅎ며=== OnFrameMove 함수 g_LightManager.SetDirectional(g_vDirLightDir, g_vDirLightColor); 추가로 디렉셔널 라이트의 색상과 방향을 설정. OnD3D11FrameRender 함수 g_SceneManager.DepthPrepass(pd3dImmediateContext); z버퍼 계산용 셰이더(픽셀 셰이더는 없고 위치를 투영공간으로만 변환)를 만들어서 z버퍼만..
화면 전체에 똑같은 색상값을 준 그냥 엠비언트 라이트와는 달리 반구형 엠비언트 라이트는 위쪽과 아래쪽에서 오는 빛에 대응하는 두가지 색상에 기반을 두고 메시를 렌더링 합니다. 일부 빛은 광원에서 눈르로 바로 들어오지만 대부분 표면에서 반사돼 여러 방향에서 들어오며 표면의 재질과 색에 따라 그 빛의 경로도 조금씩 변하게 됩니다. 이렇게 빛이 표면에서 반사되어 보이는 현상을 산란이라 하고 반구형 엠비언트 라이트는 두번 이상 산란되어 보이는 빛을 보여주는 방식입니다. LightManager 클래스 #pragma pack(push,1)struct CB_AMBIENT{ D3DXVECTOR3 vAmbientLower;float pad; D3DXVECTOR3 vAmbientRange;float pad2;};#prag..
HLSL 프로그래밍 [고급 셰이더 언어와 DirectX 11로 구현하는 3D 렌더링]를 보며 공부한 내용을 정리한 것입니다. 예제 소스코드는 http://acornpub.co.kr/book/hlsl-cookbook여기서 받을 수 있습니다. 컴파일이 안되면 프로젝트 속성 -> 링크-> 입력 에서 라이브러리 종속성에 legacy_stdio_definitions.lib; 를 넣어주면 됩니다. DirectX SDK(June 2010)이 깔려있어야 합니다. 셰이더만 작성하고 렌더몽키로 테스트하니까 한계가 있는 것 같아 책에 예제코드에 있는 DirectX코드와 같이 공부하려고 합니다. 예제코드는 DXUT로 작성되어 있습니다. DXUT는 마이크로소프트에서 다이렉트X 샘플코드를 만들기 위해 사용한 프레임워크로 다이렉트..
주위환경이 표면에 반사되는 걸 재현하는 기법입니다. 매끄러운 자동차표면에 주위 환경이 반사되는 것 같은 멋진 효과를 줄 수 있습니다. 사실 이건 표면이 입사광을 전혀 흡수하지 않고 그 모두를 정반사하는 원리입니다. 하지만 다른 물체에서 나온 정반사, 난반사광을 끝없이 따라가며 구하는 것은 실시간렌더링에서 많이 어려운 작업입니다. 따라서 여기에 약간의 트릭을 씁니다.미리 반사될 주위 환경을 큐브형태의 텍스쳐를 만들어 놓습니다. 그 다음에 카메라벡터의 반사벡터를 구해 큐브형태의 텍스쳐에서 텍셀을 얻어옵니다. 정점 셰이더는 법선매핑 때와 다를게 없습니다. 픽셀 셰이더 struct PS_INPUT{ float2 mUV : TEXCOORD0; float3 mLightDir : TEXCOORD1; float3 mV..
셰이더를 진행하기 전에 알아야할 몇가지 수학 지식이 있습니다. 셰이더에서 mul 함수를 써서 행렬과 벡터를 곱할 때 mul(행렬, 벡터) - 행기준 행렬mul(벡터, 행렬) - 열기준 행렬 DirectX는 행우선 행렬힙니다.따라서 셰이더에서 mul(벡터, 행렬) 로 계산하려면 tranpose해서 셰이더에 전달해야 합니다. 직교행렬직교행렬이란 모든 열벡터 즉, x, y , z 축 벡터가 자기 자신을 제외한 나머지 모든 열벡터들과 직교이면서 크기가 1인 단위 벡터들로 구성된 행렬을 의미합니다. 직교행렬의 중요한 성질중 하나는 직교행렬의 역행렬은 전치행렬과 같다는 것입니다. 이 성질은 접선공간에서 월드공간으로 변환하는 행렬을 만들 때 유용합니다. 접선공간법선 매핑을 할 때 텍스쳐로부터 법선을 받아오는데 이 법..
전에 만들었던 조명 셰이더에선 표면에 일괄적인 조명을 만들었습니다. 하지만 실제 물체는 표면의 재질에 따라 흡수하는 빛의 양이 다르고 우리가 사용할 모델들도 일괄적인 색이 아닌 텍스쳐로 이루어져 있습니다. 우리가 물체를 지각할 수 있는 이유는 대부분 난반사광 덕분이므로 텍스쳐의 텍셀에 난반사광의 양을 곱해서 조명과 텍스쳐를 합칠 수 있습니다. 이 기본 텍스쳐를 디퓨즈 맵이라고 합니다. 그렇다면 정반사광은 어떻할까요? 디퓨즈 맵의 텍셀을 정반사광에 그대로 사용할 수도 있지만 두가지 이유때문에 정반사광용으ㅗ 스페큘러맵을 따로 만드는 경우가 있습니다.1. 난반사광이 반사하는 빛과 정반사광이 반사하는 빛의 스펙트럼이 다른경우2.각 픽셀이 반사하는 정반사광의 정도를 조절하는 경우 예를 들어 사람에 얼굴에 조명을 ..