지금 회사에 취업해서 언리얼 만진지도 대충 6개월이 지났다

 

이제는 기본적인 개발은 수행할 수 있다고 생각을 하는데...

 

혼자 공부할때를 좀 되짚어보면, 언리얼은 사실 혼자 접하기에는 굉장히 난해하다고 생각한다.

 

일단 무엇보다, 뭘 써야하고 뭘 배워야 하는지 조차 접근하기게 에매해서, 어떻게 시작할지도 모른다는점이 제일 큰 장벽이라 생각된다.

 

그래서...

 

한번 내가 배웠던 과정을 되짚어가면서 (복습도 할겸) 가이드라인을 한번 써볼까 한다.

 

 

 

 

기본 독자 대상 : C++ 지식이 있고, 유니티 등 게임 개발에 기본적인 지식이 있는 사람

 

목표 : 언리얼 다운로드 부터 언리얼로 미니 프로젝트 하나 만들기까지

 

 

한 30부 생각중인데 아마 일주일에 한두편씩 쓴다치면 반년 걸리지 않을까?

머리 아파서 적당히 정리하고 간다.

 

기본적으로  DX11의 출력은 죄다 쉐이더를 통해서 진행이 된다. (아마도?)

 

그러다보니, 위치 변환도 전부 쉐이더에 데이터를 넘겨줘야 하는데..

 

기본 튜토리얼 데이터를 사용하다보니 프레임워크가 내 손에 안 익어서 그런가 월드매트릭스 변환을 할 방법이 전혀 안떠오르는게 아닌가.

 

그래서 아 어쩌지 하다 본것이...

 

input.pos????

아니 인풋에 pos가 있는게 아닌가

 

해서 input을 열심히 찾았는데.................................... 모르겠어!

 

싶어서 고민하다 그냥 물체 버퍼데이터에 포지션 값을 넣자! 해서 집어넣었다.

 

월드매트릭스를 써보고자 했던 흔적...

 

저래놓고 외부에서 포지션 값을 수정해주니까...

 

 

되긴 된다

되긴 된다.

 

원하던대로 가긴 간다...

 

ㅇ>-<

 

 

그치만 아직 인풋을 받는걸 몾찾은 관계로 (원래 쓰던 GetAsyncKeyState를 DX11에서 쓰려면 좀 방법이 필요해보여서 그건 003에다 쓸 예정) 그건 내일하기로...

 

되게 쓰고보니 별거 아닌데 이거 하느라 4시간이나 걸렸네 허

 

작년 봄 쯤.

 

아 다이렉트X 해봐야지! 하고 과감하게 잡았던 DX11 프로젝트를 완벽하게 이해를 못하고 말아먹고, 결국 학원을 갔더랬다.

 

과거의 처참한 흔적들

 

학원에서 배운건 DX9를 기반으로 한 작업이었지만, 이번에 DX11을 쓸 일이 생길것 같아서 미리 학습차 샘플 프로젝트를 좀 해볼까 한다.

 

이제는 단순히 학습용이 아니라 생존용으로 배워야 하게 생겼으니...

 

 

 

 

목표는 DX11 기반으로 다이나믹 매쉬 띄워서 움직이기 까지.

 

기간은 2주.

 

 

 

 

일단 구조가 바뀌니까 알아보는것부터 문제다

일단은 진입점부터 찾아나서기로 했다.

 

어디가 시작인지 파악이 안되어서 디스어셈블러까지 돌려본 결과 app.cpp에 있는 저 main 함수가 진입점인걸 확인.

 

진입점에서 D3DAppSoruce 타입의 새 항목을 만들고 -> 그것을 코어 어플리케이션의 Run에 삽입해서 돌리는? 구조인거 같은데,

실행순서는 위 이미지에서 탑->다운 으로 이루어지는 모양인듯 하다.

(main -> D3DAppSource 생성자 -> CreateView -> App 생성자 -> App.Init)

 

 

굳이 디스어셈블리를 썼어야했을까...

 

 

 

 

 

이런걸 만들고 있습니다.

'게임 개발 > Unity' 카테고리의 다른 글

기록 #2  (0) 2020.05.09
Rect Transform 잠깐 메모  (0) 2020.02.09
분명 자주 쓰는데 자주 까먹는 기능들  (0) 2019.12.27

사실 원래 좀 적을게 많은데 다 까먹어버렸구 까먹기전에 하나라도 더 적고자...

 

뭐. 학원과정중인데, D3DX - 2DX 때는 스프라이트가 표현을 전부 도와줬지만,

D3DX에서는 원래 버텍스를 세팅하고, 표면을 만들어서 그 위에다 덧 씌우는 식으로 작업이... 되어야 하는데...

 

이게 일단 설명없이 시도해보려고 하니까 되게 막막하더라.

 

일단... 하다가 막혔던것 위주로.

 

1. 선생님! 텍스쳐 입혔는데 텍스쳐가 박살나요!

작업중에 이런 광경을 목격했다.

처음에는 이게 무슨 상황인지 전혀 이해가 안되어서 (분명 Y축값은 전부 0이었다!) 좀 유심히 찾아본결과...

 

단순 Color만 들어가있는 CVERTEX 구조체와, UV가 들어가있는 UVERTEX 구조체의 사이즈가 다른데 VERTEX구조체를 변경했음에도 불구하고 기본 버텍스 사이즈를 변경하지 않아서 생긴 문제였다.

 

뭔 소리냐... 하면...

 

 

이 파트 얘긴데

 

우측 26번줄에서 버텍스 타입을 VTX_TEXTURE (=UVERTEX 구조체) 로 변경했음에도 불구하고 버텍스 사이즈 변수가 여전히 VTX_COLOR (=CVERTEX)로 지정되어있는것이다...

해서, SetStreamSource 할때는 CVERTEX 사이즈로 읽는데, 정작 버퍼에 들어간건 UVERTEX니까 저렇게 엉망진창으로 나올수밖에...

 

 

 

2. 선생님! 텍스쳐를 여러개 넣었는데 하나만 출력돼요!

 

이거는 솔직히 이해가 좀 잘 안됐(고, 아직도 잘 안되)는데...

 

먼저, 2D 시절에 텍스쳐를 그릴때 어떻게 했는지 다시 보고 오자.

 

맨 마지막줄이다.

 

 

CGraphic_Device::Get_Instance()->Get_Sprite()->Draw(pTexInfo->pTexture, nullptr, &D3DXVECTOR3(fCenterX, fCenterY, 0.f), nullptr, D3DCOLOR_ARGB(255, 255, 255, 255));

 

이 말은 즉슨, "장치를 통해 생성된 스프라이트에 크기를 지정해주고, 지정된 텍스쳐를 출력시킨다" 라는 의미.

 

즉, 장치를 이용해서 텍스쳐를 지정해주고 있다는 얘기와 일치... 한다고 볼 수 있을까? (솔직히 확신이 들진 않는다)

 

 

아무튼... 이래서 텍스쳐를 두개 불러왔음에도 불구하고 세팅을 하나만 해주면

 

그냥 처참하게 모든 물체에 같은 텍스쳐가 입혀지게 된다.

 

그래서 어쩌란거냐? 랜더할때 텍스쳐를 매번 지정해줘야 한다는것이다...

 

"아니 선생님, 그러면 매번 엑세스한다고 자원낭비되고 뭐 그런거 없나요?"

 

라는 질문이 들어온다면

 

"애초부터 그러고 있었다" 라는 대답밖에는 나올게 없다...

 

이제와서 깨달은 얘기지만, 랜더 하고 있을때 매번 스프라이트를 지정해주고 있지 않았던가...

 

그럼 뭐, 3D에서도 별 다른건 없다고 생각한다. 역시나 여기서도 텍스쳐를 매번 지정해줘야지

 

 

 

결과물. 이미지가 뒤집힌건 단순히 uv를 잘못준것이다.

 

가끔씩은 이해가 안되더라도 일단 납득부터 하는게 통할때도 있는것 같다...

제목이 짱 긴데.

 

정확히는

 

"Visual Studio 2017 이후 버전에서 MFCDirectX 9동시에 사용하려고 할 시" 발생하는 문제와, 해결법에 대한 내용입니다.

 

아니 요즘 세상에 아무리 그래도 DX9을 쓴다구요? 할 수도 있는데...

 

네 씁니다. 써요... 네...

 

 

* 해당 문제는 Visual Studio 2017 이후부터 발생합니다. 

 

 

일단, MFC를 사용하지 않고 그냥 DX9를 프로젝트에 임포트 했을때는 정상 작동하는것을 상정하고 이야기를 합니다.

 

MFC 프로젝트를 생성하고, pch.h나 framework.h에 d3d9.h, d3dx9.h를 인클루드 해주고 프로젝트를 빌드 돌리면,

 

정신이 아득해진다...

아마 이런 현상을 목격할 가능성이 큽니다.

 

이 문제는, (정확하진 않으나) 추측상, Windows 10 SDK에 기본 탑재되어있는 DX 10~12 버전과, 임의로 설치한 DX 9 버전간의 충돌로 인해 발생하는 문제로 보입니다.

 

뜬금없이 뭔 충돌이냐? 하겠습니다만... Visual Studio 최신버전, 특히 2019 (v142 MFC)를 사용하는 경우에는 기본 세팅이 Win 10 SDK 기반인지라... 아니 이게 충돌이 왜 나지? 싶은데 충돌이 나더라구요.

 

해결법은 의외로 간단했습니다.

 

* 해당 방식으로 해결이 되지 않는 경우, VS2015를 설치하신 뒤에 해당 버전에 동봉되는 SDK 8.1을 사용하시면 됩니다.

 

1. developer.microsoft.com/ko-kr/windows/downloads/sdk-archive/

 

Windows SDK 아카이브 - Windows 앱 개발

이 비보안 업데이트에는 품질 향상이 포함됩니다. MRMSupport.dll 로드 실패로 인해 개발자가 Windows 7에서 UWP 앱을 빌드하지 못하는 문제를 해결했습니다. MidlRT 및 MDMerge가 Windows 7에서 실행되지 않는

developer.microsoft.com

해당 링크에서 Win SDK 8.1 버전을 다운로드 합니다.

 

2. 설치합니다.

 

3. 원하는 프로젝트에서, 프로젝트 > 속성 > 일반 > Windows SDK 버전을 10.0 에서 8.1로 변경합니다.

 

 

 

이 부분을..
이렇게 바꾸면 됩니다.

 

 

 

SDK 버전을 낮추게 되면, 구문오류는 더이상 발생하지 않고 빌드가 성공하게 됩니다.

 

 

이랬던것이
"아무튼 실행됨" 상태로 바뀝니다.

하지만, 온갖 매크로 재정의 경고문구가 발생하는것으로 봐서는... 이 조차 문제가 발생할 여지가 있어 보입니다.

 

이는 문제 발생시 그때 대응하기로 했습니다... 일단은 경고문구에 나와있다시피 Win 8.1 SDK와 DX9 SDK 간의 충돌이니까요.

(해당 문서는 https://swifter22.tistory.com/17, UE4 Docu, 2BBear 님의 글을 참고하였습니다.)

 

 

언리얼엔진을 거의 처음 접해보면서, 유니티에서 처럼 폴더로 스크립트 관리를 하고자 하니...

처음부터 벽에 막히기 시작했다.

 

콘텐츠 브라우저의 C++ 클래스 항목을 가서 폴더를 만들겠다고 우클릭을 하면 생성할 수 없다고 나온다.

응 안돼 안돼

 

이는, 사실 언리얼에서 소스코드 등을 "모듈" 로 관리하기 때문에 발생하는 문제로, 관리의 용이성 / 실수 방지를 위해서.... 인지는 모르겠으나, 아무튼 에디터에서만으로는 바로 생성이 불가능하다.

 

해서 찾아본 결과.

 

수정할게 좀 많다.

 

일단 모듈을 하나 추가하겠다! 고 한다면...

 

1. Source 폴더 하위에 원하는 모듈명의 폴더를 추가.

PMG라는 폴더가 방금 추가한 폴더이다.

2. 모듈명 폴더 아래에 '모듈명.Build.cs' , '모듈명.cpp', '모듈명.h' 3가지 파일을 추가해준다.

반드시 모듈 폴더와 이름이 동일해야한다는점 잊지말자.

이런식으로.

이 파일들은 에디터에다 '이런 모듈이 있습니다' 하고 인지 시켜주는 목적으로, 설정을 안해주면 빌드할때 빼먹기만 하면 다행이고, 그냥 에러가 터져버린다.

 

잘 설정해주자.

 

1) Build.cs

솔직히 아직 Build.cs 파일의 특성을 덜 이해했습니다.

근데 명칭만 바꾸고 가져다 써도 되긴 하니, 일단 쓰시고 나중에 꼭 이해하시는거로. 나도 꼭 해놓고

 

// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class PMG : ModuleRules
{
	public PMG(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine"});
		PrivateDependencyModuleNames.AddRange(new string[] { });
		
	}
}

이렇게만 해두면 일단 에러는 안난다.

 

2) 모듈명.h

얘는 (당장은) 정말 별거 없다.

모든 엔진의 정보가 담긴 Engine.h 헤더를 추가해주거나, 속성만 요약된 CoreMinimal.h 헤더를 추가해주면 된다.

상황에 따라 다르겠지만, 그걸 알 정도면 이런 글은 안 보고 있을테니 그냥 CoreMinimal.h 헤더 추가해주자.

 

// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.

#pragma once
#include "CoreMinimal.h"

 

3) 모듈명.cpp

이친구는...

일단 당연히 자신의 헤더파일을 추가해주고, 그 다음 모듈 매니저를 추가해줘야 한다.

그래야 얘가 어떤 모듈타입인지 인식을 하고, 어떤 이름의 모듈인지 에디터에서 알 수 있게 된다.

 

뭐 레퍼런스 문서에 보면 필요에 따라 (혹은 최초 모듈은) IMPLEMENT_PRIMARY_GAME_MODULE( ) 을 사용하여 모듈을 등록해주라고 하는데, 이건 사용할 일이 생기면 추가로 설명하는게 더 나을것같다.

 

#include "PMG.h"
#include "Modules/ModuleManager.h"

IMPLEMENT_MODULE(FDefaultModuleImpl, PMG);

(앞은 모듈 매니저의 기본 모듈 인터페이스, 뒤는 추가할 모듈 명)

 

일단 이렇게 하면 파일 생성해줄것은 끝났다.

 

이게 끝이냐? 에이 설마요.

 

3. Source 폴더의 .Target.cs 파일들을 열어봅시다.

모듈 타겟 설정해주고... 하다가 맨 마지막에 모듈 이름을 추가해주는 항목이 있습니다.

네. 추가해주시면 됩니다.

 

// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;
using System.Collections.Generic;

public class FindRandomMapTarget : TargetRules
{
	public FindRandomMapTarget(TargetInfo Target) : base(Target)
	{
		Type = TargetType.Game;
		DefaultBuildSettings = BuildSettingsVersion.V2;
		ExtraModuleNames.Add("FindRandomMap");
		ExtraModuleNames.Add("PMG");		//추가
	}
}

 

두 파일 모두에 추가해주시면 됩니다.

 

4. 프로젝트 루트의 '.uproject' 

해당 파일을 열면, (실행 말고 코드를 보면...)

JSON 양식으로 되어있는 내용물이 나옵니다.

양식에 맞게 항목을 추가해줍시다.

 

{
	"FileVersion": 3,
	"EngineAssociation": "4.24",
	"Category": "",
	"Description": "",
	"Modules": [
		{
			"Name": "FindRandomMap",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		},
		{
			"Name": "PMG",
			"Type": "Runtime"			
		}
	]

 

일단 이러면 파일 세팅은 끝났습니다.

 

5. Visual Studio에서 솔루션 빌드 1회

성공이 떠야 됩니다.

뭔가 잘못되어있다면 바로 에러밭을 마주칠 수 있으니 주의하시길.

 

6. .uproject 파일에서 Generate

해당 기능을 수행해주면 VS 프로젝트에서 모듈이 폴더로 추가됩니다.

 

자 여기까지 정상적으로 수행되었다면...

에디터로 돌아와서 C++ 클래스 추가를 수행합니다.

 

 

그럼 이런식으로 내가 추가한 모듈이 보이면 성공입니다.

 

 

 

 

Extra :

 

사실 이렇게 해도 여전히 모듈이 에디터에 안뜨는 경우가 있다.

없어!

이 경우, 침착하게 더미 액터 등을 추가해보면...

그런데 짜잔

뭔가 실패했다고 경고가 뜬다.

 

요 상태에서 VS로 들어가면...

 

 

이런 경고가 발생한다.

 

자 이건 또 뭐냐... 그러게요

별거 없다. 결론만 따지면 재 빌드 돌리면 된다.

 

침착하게 에디터를 끄고, 재 빌드를 해주자.

(저는 분명 건든게 없습니다)

성공한다.

 

이후 다시 에디터를 켜주면 

드디어 추가 모듈이 생성되었다.

 

이제부터 모듈 작업을 하시면 됩니다. 네.

 

 

아는분의 제안 겸 조언으로 '투명한 물' 구현을 해보았다.

원래는 '언어나 프로그램 제약없이 할수 있도록' 다이렉트X를 추천받았으나...

하도 진행을 못하는걸 보고는 그냥 다른 엔진 써보고 해서... 원래 잡던 유니티 말고 언리얼엔진 처음 열어서 구현했습니다.

 

 

일단. 뭘 만들었는지는 영상부터 보고 갑시다.

 

(영상은 개선판입니다)

 

투명한 물, 물 표면 표현, 굴절, 반사 가 들어간 기본적인 물 표현입니다.

 

 

 

* 해당 자료 구현시 Pub Games의 영상을 참고하였습니다.


 

전체 구조도입니다.

 

아는건 별로 없지만, 까먹지 않기 위해서라도 하나씩 정리해봅시다.

* 틀린게 많을 수 있습니다. 틀린것이 있다면 지적바랍니다.

 

1. 포지션

 

1) 절대 월드 포지션 (Absolute Absolute world position) :

이 텍스쳐 구현에서 월드 포지션을 사용하는 목적은 텍스쳐가 적용된 오브젝트의 '위치에 무관하게' (=동일한 위치에) 텍스쳐가 적용될 수 있도록 하는 목적으로 사용된다.

즉, 텍스쳐 표현을 절대 월드 좌표로 고정해버림으로써, 오브젝트가 이동하더라도 텍스쳐 표현이 동일한 위치에 적용된다.

 

뭐 이렇게 쓰니 같은말 두번 쓴거같은데요... 표현 기준이 오브젝트 별 이 아니라 오브젝트가 놓인 월드 좌표계 기반이다... 정도면 될거같습니다.

 

(자료 참조)

 

2) Divide? :

값을 나누는 이유는... 자체 그림자 방지 (To provide a fall off to the self shadowing)를 위해서라는데... 아직 잘 이해가 안되는 부분이네요.

여긴 공부가 더 필요할것 같습니다.

나누는 값 자체는 텍스쳐를 적용할 오브젝트의 사이즈 만큼... 이라고 하는거 같네요.

 

3) Mask :

R은 X축, G는 Y축, B는 Z축으로 표현되는 모양이더라구요.

그리고 UE4에서는 Z축이 높이를 의미하기 때문에... 평면 가로/세로의 값만 중요하여 두 값을 추출하기 위해 R,G 마스크를 사용한다... 고 하는것 같습니다. 즉, 'XY 평면에 평행한 텍스쳐를 구현하기 위해 X,Y 값만 추출한다.' 고 볼수 있겠네요.

월드 포지션에는 당연하겠지만 3개의 값이 들어갑니다. X축, Y축, Z축.

사용한것은 ComponentMask였으며, 적당히 축약어로 검색해도 잘 튀어나옵니다.

축약어 사용 예

 

2. 노멀맵

'노멀맵' 자체에 대한 설명은 검색해보시거나 들고계신 책 보는게 빠르고... (사실 이해 덜했음)

이 텍스쳐에서는 어떻게 써먹고 있나 봅시다.

 

 

1) Panner : Panner를 사용하는 이유는 단순하지만 큰 이유입니다. 물이 흐르는것을 표현하기 위해 텍스쳐를 움직여줘야 하기 때문이죠.

텍스쳐의 U (가로) / V (세로) 를 조합한 방향으로 움직여 복잡한 애니메이션이 일어나는것처럼 보이는 목적입니다.

레퍼런스 참조 하시면 더 좋습니다. 넹.

input은 월드 좌표계였습니다.

 

2) Texture Sample : 말할것도 필요없는 노멀맵입니다.

위 아래의 텍스쳐가 조금 다른것처럼 보이는데, 사실 두개 같은거에요. 그냥 복사 - 붙여넣기 한것.

텍스쳐에서 '질감'을 표현해주는 노멀맵을 가져와서 적용시킨것입니다.

두개인 이유는 물 흐르는 표현을 2개로 겹쳐서 그런것이고... 사방에서 퍼지는걸 하고싶으시다면 Panner를 포함해서 4개를 넣으시면 되겠습니다.

 

3) Add? : 말도 필요없이 그냥 만들어진 Panner - Texture 세트를 합치는 목적입니다.

그래야 한번에 출력되죠.

 

4) Constant 3 Vector : 솔직히 얘가 제일 이해가 안갑니다.

기능 자체는 '3채널 상수값'을 벡터 형식으로 출력해주는것이 전부입니다.

3채널을 사용하는 텍스쳐 좌표 변경시 사용하는것이 좋다는데...

잠깐 찾아보니 실행 직전에 한번 계산되고, 플레이 도중에는 변경이 불가능한 마테리얼 인스턴스. 라고 하네요. 

근데 만일, 물이 튀기는 표현등을 넣는다면... Dynamic 값을 이용해야하지않을까 싶네요.

이것도 레퍼런스 참조해보시면 더 도움이 될것 같습니다.

 

5) Multiply : 움직임이 구현된 Texture 와 인스턴스 값을 곱해서 적용시키는 목적입니다.

더하면 단순히 수치만 고정되는것이고, 곱하게 되면 각 R/G/B값에 해당되는 수치가 곱해져 계산이 되겠네요.

 

여기까지 붙은것을 마테리얼 파라미터의 Normal에 고정시켜줍니다.

 

이러면 물 표면 표현이 완성됩니다.

 

 

3. Opacity (투명도)

1) Depth Fade : 말그대로 '깊이별 Fade' 입니다. 인자로는 투명도 값과, Fade가 시작되는 월드좌표 수치를 받네요.

2) Fresnel (프레넬) : 실제로는 '관찰자가 바라보는 각도에 따라 반사되는 빛의 세기가 달라지는 현상을 설명하는 데 사용되는 용어', 즉 반사와 관련된 값인데요...

물의 투명도는 Fresnel값 계산과 반대로, 수직으로 보면 투명하고, 평행하게 될수록 덜 투명하게 보여야 합니다.

그래서 Fresnel값에 1-X를 해줘서 값을 뒤집는것이구요.

이를 곱해서 Fresnel에 따라 Fade가 일어나도록 구현이 됩니다.

 

4. Reflection (반사)

사실 구현하면서 제일 골치아프게 했던 부분인데요...

구현 자체는 금방했으나, 반사값을 너무 크게 하는 바람에 카메라 사이즈(= 스크린 사이즈)만큼의 사각형 격자처럼 반사가 일어나는 참사가 일어나기도 했습니다.

 

구현자체는 2시간만 걸렸으나 이거 원인 찾는데 3시간 넘게 써버려서 총 작업시간이 6시간 언저리로 만든 원흉...

대충 이렇게 말이죠.

 

뭐. 지금은 수정이 되었습니다.

 

 

 

 

반사값 파라미터는 딱히 뭐 더 없습니다.

Depth Fade 값에 반사 수치 인자를 곱해줘서 그걸 Reflection 파라미터에 넣어주면 끝입니다.

그냥 값 조절 잘 하십시오. 말고는 할말이 없네요. 넹

 

5. Base Color

 

 

Fresnel에 붙어있는 Normal Map 값은 아까 만들었던 그 Normal Map 값입니다.

 

1) Color : 말그대로, 밝은 면 / 어두운 면의 컬러링입니다. 큰 차이는 없지만, 색상이 변경되면 차이가 있긴 하더라구요.

원하신다면 저 값을 녹색이나 보라색 등으로 바꾸면 독물이 되어버리는 진기한 현상을 목격하실 수 있습니다.

 

2) Lerp (Linearly interpolate, 선형 보간) :

네. 선형대수 시간에 나오던 그 선형보간입니다. 단순히 선형보간 짧게 설명하자면 A / B 점을 가지고 중간의 임의의 값을 뽑아내기 위한 방법인데요. 왜 갑자기 여기서 쓰이느냐.

컬러가 2개밖에 없잖아요? 근데 자연스러운 컬러링을 위해서라면 범위에 따라 색상이 자유롭게 바뀌어야하니... 그때 적용이 되어서 들어가는 셈입니다.

그래야 약간 깊이, 더 깊은곳 등등에서 색이 자연스레 들어가는것이겠죠.

이를 Depth Fade 값과 곱해줌으로써 Depth 값에 따라 적용이 되도록 해줍니다.

 

3) Diffuse (디퓨즈) :

일반적으로 Diffuse Map은 물체의 입체감, 깊이감, 색을 부여해주는 요소인데...

단순하게 설명하자면 텍스쳐의 색감과 질감을 나타내주는 요소라고 할 수 있겠다.

사실 이쪽도 아직 이해가 부족해서... 다른 자료를 찾아보시는걸 추천한다.

 

아무튼 이 값은 마테리얼 파라미터의 베이스 컬러에 고정시켜줍니다.

 

이로써 4가지 항목 (노멀맵, 베이스 컬러(=디퓨즈 맵), 리플렉션, 투명도)를 모두 적용시켰다.

 

그렇게 나오는 마테리얼 결과값은 아래와 같다.

(실제로는 움직입니다)

잘 보면 투명도, 반사등이 적용되어있는걸 볼 수 있다.

 

이걸 물 표면에 적용시켜주면 위 영상과 같은것이 나오게 되는것.

 

단순히 영상 하나를 참고해서 야매로 만든것인데, 다음에는 좀 공부를 해서 물리가 들어간 물 구현도 해봐야 할 듯 싶다.

+ Recent posts