목록전체 글 (67)
헤더파일
빌드하면 비주얼 스튜디오 속에 c++ 컴파일러가 파일을 읽기 시작한다.#include "iostream";include는 헤더안에 파일을 모두 복사한다. templatevoid exchange(T a){T b = a;}쭉 가다가 템플릿 코드를 만나면 호출된 함수의 자료형으로 함수 코드를 찍어낸다. 정수형으로 불렀다면templatevoid exchange(int a){int b = a;}이런식으로 템플릿은 인간이 쓴 코드와 똑같아서 효율이 떨어지는 부분이 전혀 없다.컴파일러는 자료형을 유추할 수 있어서 자료형 명시를 생략해도 된다. 사용자 정의 클래스일 경우는 명시해야 한다. class Dog{public:Dog() {}Dog(const char* name, int age)// const는 전달된 인자를 ..
포인트라이트포인트 라이트는 디렉셔널 라이트에서 일정한 입사광 벡터값을 쓴 것과 달리 픽셀 셰이더에서 정점과 빛사이의 벡터를 매번 계산한다는 점과 거리에 따른 감쇠가 있다는 점이 다릅니다. 포인트 라이트는 전구처럼 사방으로 퍼져나가는 빛이므로 벡터값을 일일이 계산해줄 필요가 있습니다.빛 벡터는 포인트라이트 위치 - 현제 월드공간 위치로 계산할 수 있고 감쇠는 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..
다형성 지료형이 다른데 같은 이름의 함수로 비슷한 행동을 한다. Dog d;Bird b; d.move();b.move(); virtual이라고 이름이 붙은 함수는 4바이트씩 메모리가 희생된다. 함수가 어디있는지 찾아가기 위함. virtual void move() = 0;반드시 구현하도록 강제. 구현안 하면 컴파일러 상에서 오류가 뜬다. 하위 클래스에서는 반드시 오버라이드 해야한다. #include class Animal { public: virtual void move() = 0; }; class Dog : public Animal { public: void move() { std::cout
디렉셔널 라이트는 해나 달처럼 매우 멀리서 부터 도달하는 넓은 빛을 시뮬레이션할 때 쓰입니다. 실내 렌더링에서는 디렉셔널 라이트는 없으므로 따로 원래는 상수버퍼를 따로 만들어서 빛의 방향, 세기, 색상을 전달 합니다.다이렉션 라이트는 모든 광선이 평행하게 온다고 가정하기 때문에 미리 계산한 ㅈㅎ며=== 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..