학원

DirectX 3D Sphere & NormalMapping

Srff5123 2023. 10. 27. 02:20
728x90

Light에 좀더 효과적인 빛구현

 

구를 대상으로 하는것이 빛구현을 할때 도움이 많이 되기 때문에 구를 먼저 구현을 하였습니다.

 

Object 폴더에 Basic폴더에서 Sphere 헤더파일을 새로 만들어줍니다

 

GameObject를 상속받고

생성자에는 필요한 정보를 넣어준다 구를 만들것이기 때문에 Radius(반지름)을 넣어준다. 또한

완벽한 구는 구현할수없기에 폴리곤으로 만들어 최대한 매끈하게 만들어준다. 그렇기에 slice와 stack를 넣어준다,

slice는 위에서 봤을경우 쪼개는 용도, stack은 옆에서

다음 cpp파일로 넘어와 생성자 매개변수받은 것들을 만들고

mesh를 만들어 생성해준다.

 

다음 소멸자에서는 mesh를 delete해주고

 

Render에서는 SetRender로 생성하고

mesh로 draw를 불러와준다

 

 

 

구를 구하는 그림이고

다음 MakeMesh에서 구를 만들어줄 코드를 짠다

필요한 변수들을 만들어준다( XM_2PI 는 2*pi를 뜻한다.)ㅂ

 

다음 indices 코드

그런다음 출력 확인을 위해 

저번에 만든 TerrainScene cpp 파일로 이동하여 Shader값을 적용해주고

 

다음 Texture cpp파일 Add 부분에서 확장자 추가를 해준다.

 

Utillity 파일에 있는 GetExtension을 사용하는데

substr = 문자 자르기

find_last_of = 제일 마지막에 오는 . 찾기

확장자의 . 위치를 찾아 거기에 +1을 하여 잘라 확장자를 찾아둔다.

 

다시 Texture cpp로 와서 확장자명에 따른 조건문을 걸어주어 Shader적용을 마친다

 

이렇게 나오게 된다.

 

다음 다양한 Texture에 대해 알아보자

Specular Map 빛의 반사를 표현하는 데이터를 가진다.

빛의 정반사가 필요한 부분과 아닌부분을 구분해주는 데이터 맵이라고 보면 된다.

 

적용 방법

우선 PixelHeader파일로 이동하여 register 를 추가해준다.

 

다음 SpecularLight.hlsl 파일로 이동하여 SpecularIntensity 

Specular의 강도를 받아주고

기존에 있던 Specular에 곱해준다.

다음 Material로 이동하여 추가

 

 

cpp파일로 이동하여   Material::Set에 추가

추가

 

다음 TerrainScene으로 이동하여 파일 적용

 

아까랑 살짝 달라진 모습이 출력

 

 

다음 Normalmap Texture

법선에 대한 데이터로 xyz를 컬러로 표현 x는 red, y는 blue, z는 green

추출을 했을때 높이값을 주는것인데 물체에 반듯한느낌으로 나오는 구를 재질에 따라 울퉁불퉁한 거칠기를 추가를 해주는 효과를 준다. 

이것을 사용하는 이유는 울퉁불퉁한걸 실제 모델링으로 만들경우 많은 수의 폴리곤과 구현에 힘듬이 있어.

법선을 수정을하여 시각적인 효과로 대체를 한다.

 

이것을 붙혀야 하는 물체는 현재 구이고 Texture는 2d로 되어있기 때문에 저것을 동그랗게 말아주어야한다.

UV값을 활용하여 좌표체계를 바꾸어 준다. 텍스처에 u v 로 잡아주어 수정한다. 

 

코드 구현을 위해 다음 Framework폴더의 Buffer폴더에 있는 VertexLayout.h로 이동하여

Tangent를 구할 준비를한다. biTan은 외적하면 구할수있다.

 

다음 Sphere 헤더로 이동하여 typedef를 NormalTan으로 바꾸어주고

함수를 만들어준다.

 

다음 cpp파일로 넘어와 미리 호출을 해둔다.

 

 

코드

 

적용을 위한 파일을 만들어준다.

Shaders 폴더에 Light 폴더에다가 NormalMapping.hlsl(꼭지점)을 만들어주고 Specular.hlsl에 있는 코드를 복붙을 해준다,

 

다음 PixelHeader에 register추가하고

 

미리 적용을 할 준비를 해주기 위해 TerrainScene에 추가를해준다.

 

다음 mertarial 파일에도 추가

 

다음 vertexHeader에 추가

 

이제 Nomal hlsl파일 수정

 

정규화 제거 및 binormal 외적 이용하여 추가

 

T - tangent    X 축

B - biNormal   Y 축

N - normal    Z 축

 

normalMapcolor로 법선 조정 , 법선이벡터로 되어있음 단위 벡터로 치면 제일 낮은값이 -1인 높은값이 1이고

하지만 color는 0~1까지 이기 때문에 범위가 맞지않아 바꺼줌

 

이것을 3축을 합쳐 하나의 행렬로 만들어줌 

 

다음 normal값 정규화를 해주고 곱해줌

이렇게 조작되어진 법선을 diffuse에 넣어주어 적용한다.

훨씬 티가 많이 나게 적용된다.

 

다음 Phong Shading을 살짝 좀더 좋게 바꾸기

Blinn phong 방법

 

정반사가 빛의 반사각으로 하는데 연산을 줄이기 위해 반사각을  쓰지않고 구현을 하였다.

 

벡터를 이용하여 빛의 방향과 내 시야의 방향이 있을때 두개의 중간 값인 Hal Vector를 구하여

이것을 Normal Vector와 내적하면 정반사와 비슷한 연출이 가능하다. 게임에서는 최적화를 하는것이 좋기 때문에

비슷한 연출에 연산은 크게 줄일수있어 많이 사용한다.

다음 코드 구현

 

보시다시피 거의 차이는 없다.

 

ambient 추가(간접광)

빛이 안닿는 부분은 완전 검은색으로 나오는데 그것을 없에준다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90