목록DirectX (15)
헤더파일
툰세이더는 스트리트 파이터4, 보더랜드 같은 비실사적인 그래픽을 구현하는 셰이더입니다.만화를 보면 명암 처리를 부드럽게 하는 대신에 칼같이 딱딱 끝어서 2~3단계로 합니다. 사실 구현하는 건 굉장히 쉽습니다. 전에 만든 난반사광 셰이더를 조금만 고치면 됩니다. 둥근 코사인 곡선이 일반적인 난반사광 셰이더라면 뚝뚝 끊기는 계단 모양이 툰셰이더입니다. 픽셀셰이더에서 쓰는 diffuse값을 5단계로 나누기만 하면 됩니다. 1.정점 셰이더 float4x4 gWorldViewProjectionMatrix;float4x4 gWorldInverseMatrix;float4 gWorldLightPosition; struct VS_INPUT { float4 Position : POSITION0; float3 mNormal..
정반사광 정반사광은 난반사광과는 달리 한 방향으로만 반사되는 빛으로 입사각이 출사각과 같은 것이 특징입니다. 따라서 정반사광의 효과를 보려면 빛이 반사되는 방향에서 물체를 바라봐야만 합니다. 정반사광을 계산하는 여러 기법중 게임업계에서 많이 사용하는 퐁모델은 반사광과 카메라벡터가 이루는 각도의 코사인값을 구하고 그 코사인 값의 거듭제곱한 값이 정반사광이 됩니다. 사실 코사인값을 제곱하는 것만 빼면 난반사광을 구하는 공식이랑 다르지 않습니다. 제곱하는 이유는 정반사광이 난반사광보다 더 빠르게 감소하기 때문입니다. 위 그래프에서 볼 수 있듯이 거듭제곱할 수록 코사인값이 더 빠르게 감소하는 걸 볼 수 있습니다. 제곱하는 수준은 표면에 재질에 따라 다릅니다. 거친 표면일수록 정반사광이 덜 타이트하므로 거듭제곱 ..
빛이 없으면 물체를 볼 수 없습니다.이 당연한 사실을 자주 까먹는 이유는 실생활에서 완전히 칠흑 같은 어둠을 찾기 힘들기 때문입니다. 왜일까요? 바로 끝없이 반사하는 빛의 성질 때문입니다. 딱히 눈에 띄는 광원이 없더라도 대기중의 미세입자에 반사되어 들어오는 빛까지 있으니까요.이렇게 물체에 반사되어 들어오는 빛을 간접광이라 하고 광원으로 부터 직접 받는 빛을 직접광이라 합니다. 이 두가지 빛 중 간접광은 수 많은 반사를 거쳐야 하기 때문에 계산하기 매우 어렵습니다. 따라서 이번에는 직접광만을 계산할 것입니다. 난반사광(Diffuse Light)스스로 빛을 내지않는 물체를 우리가 볼 수 있는 이유는 다른 물체가 발산하는 빛이 이 물체의 표면에서 반사되기 때문입니다. 이때, 여러 방향으로 고르게 반사되는 빛..
텍스쳐 좌표는 위치를 표현하는 x,y와 구별하기 위해 u,v로 나타냅니다.3D물체를 이루는 구성요소는 삼각형이므로 2번 삼각형의 왼쪽꼭지점에 이미지의 오른쪽 귀퉁이 픽셀을 출력할 것과 같은 지시를 내릴 수 있습니다. 텍스처위의 픽셀을 정수로 나타내면 이미지 파일 크기에 따라 유동적이게 되므로 색깔과 같이 백분율(0~1사이 값)로 나타냅니다. uv 좌표의 범위에 따라 다양한 효과를 줄 수 있습니다. (1,0) ~ (0,1)로 하면 텍스처의 좌우를 뒤집을 수 있고 (0,0) ~ (1,2)로 하면 텍스처가 위아래로 두번 반복할 수 있습니다. 1. 정점셰이더텍스처 매핑을 하려면 텍스처로 사용할 이미지 하나가 필요합니다. 텍스처를 입히는 작업은 어디에서 해야 할까요? 텍스처는 정점에 입히는 게 아니라 표면을 구성..
글의 내용은 포프 김이 지은 셰이더프로그램 입문을 정리한 것에 불과합니다. 작성한 코드는 hlsl이므로 실제 결과를 보기위해서 따로 만든 DirectX 프레임워크가 필요합니다.(렌더몽키란 프로그램으로 연습하는 것도 좋습니다.) 셰이더에서 사용할 수 있는 입력 값으로는 전역변수와 정점데이터가 있다.이 둘을 구분하는 기준은 한 물체를 구성하는 모든 정점이 동일한 값을 사용하느냐의 여부입니다.만약 동일한 값을 이용한다면 전역변수가 되어야 하고 아니면 정점데이터의 일부로 값을 받아야 합니다. 1)정점셰이더 1.정점데이터 정점셰이더에서 입력받을 데이터는 주로 구조체형식으로 만듭니다.struct VS_INPUT{float4 mPosition : POSITION;} 지금은 입력데이터가 하나지만 나중에는 여러개가 될 ..
DirectX11 SDK(June 2010)을 썼습니다. 다이렉트 초기화하는 부분은 건너 뛰겠습니다. 프로젝트 속성에서 VC++ 디렉터리 가셔서 추가포함디렉터리 $(DXSDK_DIR)Include;$(IncludePath) 추가라이브러리 $(DXSDK_DIR)Lib\x64;$(LibraryPath) 추가실행가능 $(DXSDK_DIR)Utilities\bin\x64;$(ExecutablePath) 추가해야합니다. ID3D11Device* d3d11Device;//디바이스ID3D11DeviceContext* d3d11DevCon; //디바이스 컨텍스트 ID3D11Buffer* triangleVertBuffer;//정점 버퍼 포인터ID3D11VertexShader* VS;//버텍스 셰이더ID3D11PixelS..
struct TextureVertex{D3DXVECTOR3 position;D3DXVECTOR2 texture;D3DXVECTOR3 normal;}; 정점버퍼에 넘겨줄 구조체를 정의합니다.position은 FBX의 ControlPoint에서 따오는 것으로 모델의 정점입니다.texture는 Texture의 UV좌표입니다.normal은 해당 정점에서의 노말벡터를 의미합니다. std::vector verticies;이 구조체로 verticies라는 벡터를 만듭니다. FbxManager* lSdkManager = FbxManager::Create(); // Create the IO settings object.FbxIOSettings *ios = FbxIOSettings::Create(lSdkManager, I..