UDN
Search public documentation:

MaterialExamplesKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 머티리얼과 텍스처 > 머티리얼 예제

머티리얼 예제


문서 변경내역: Chris Sturgill (Demiurge Studios) 작성. Dave Burke, Scott Brown, Kedhrin Gonzalez?, Jeff Wilson 업데이트. 홍성진 번역.

개요


언리얼 엔진 3의 머티리얼 시스템은 매우 유연합니다. 이 시스템으로 사실상 무한대의 표면 효과를 만들어 낼 수 있습니다. 시스템이 매우 강력한 것이 사실이긴 하지만, 막상 시작해 보려거나 특수 효과를 구현해 보려면 막막해 지는 것도 사실입니다. 다양한 머티리얼 효과나 언리얼 에디터 내의 재밌는 머티리얼 제작 기술에 관해서 간단한 참고서가 될 수 있을까 하여 만든 페이지입니다. 이 예제가 비슷하거나 완전 새로운 효과를 만들어 내는 데 밑거름이 될 수 있으면 하는 바람입니다.

텍스처를 가져오는 방법이나 머티리얼을 만드는 방법, 머티리얼 에디터 사용법 등은 잘 알고 계신다 간주하고 진행하겠습니다. 모든 머티리얼 표현식에 대한 것은 머티리얼 참고서, 머티리얼 에디터에서 머리티얼 작업을 하는 방법에 대해서는 머티리얼 에디터 유저 가이드, 텍스처와 머티리얼 콘텐츠를 엔진으로 들여오는 방법에 대해서는 머티리얼 튜토리얼 페이지를 참고해 주시기 바랍니다.

개념 및 기술


여기서는 언리얼 엔진 3에서 머티리얼을 제작할 때 흔히 사용되는 여러가지 개념과 기술에 대해 다루겠습니다.

반사성

Specularity(반사성)란 빛의 반사를 통해 표면에 나타나는 하이라이트를 말합니다. 일반적으로 표면이 더 빛날수록 반사성도 작고 밝아지게 됩니다.

ex_shiny_specular.jpg

머티리얼 노드의 Specular(반사) 입력 채널이 반사 하이라이트의 밝기와 색을, SpecularPower(반사력) 입력 채널은 하이라이트의 감쇠나 빡빡함을 조절하는 데 사용됩니다.

환경 맵

Environment mapping(환경 매핑), 또는 reflection mapping(반영 매핑)은 미리-렌더링된 큐브맵의 사용을 통해 쉽게 구현할 수 있는데, 실시간 반영의 적용이나 사물에 주변 환경이 반영되는 모습을 내기 위해 사용됩니다.

ex_EnvMap.jpg

Transform(변형) 표현식에 통과(탄젠트->월드)시킨 ReflectionVector(반영 벡터) 표현식이 환경 맵이 할당된 TextureSample(텍스처 샘플) 표현식에 대한 UV 텍스처 좌표로 사용됩니다. 이는 (RenderToTextureCube (렌더 투 텍스처 큐브) 또는 정적) 큐브맵을 메시의 표면에 매핑시켜 (주변 사물을) 반영하는 것처럼 보이게 합니다.

EnvMap_Mat.jpg

SceneCaptureCubeMapActor (씬 캡처 큐브맵 액터) 의 실시간 셋업이나 정적 캡처 저장하기에 대해서는 [[RenderToTextureKR][렌더 투 텍스처] 페이지를 참고해 보시기 바랍니다.

새 큐브맵을 수동으로 만들려면 콘텐츠 브라우저 에서 우클릭 > 새 TextureCube 를 선택하면 됩니다.

newtexcubecb.jpg

다른 방법으로는 콘텐츠 브라우저 좌하단의 새로 버튼을 클릭하고, 팩토리 콤보박스에서 TextureCube 를 선택해도 됩니다.

TextureCubeFactoryNew.jpg

그리고서 환경 이미지를 여섯 가져온 다음, 새로 생긴 TextureCube (텍스처 큐브)의 Face Neg/Pos X/Y/Z 속성에 비어있는 슬롯에다 할당해 줍니다. CubeTexture (큐브 텍스처)의 각 면에 대해 이미지 위쪽이 텍스처 위쪽에 맞춰지며, 윗면과 밑면 둘 다 아래 그림에 나타난 대로 동일한 위쪽 방향을 공유합니다:

ex_layout_TexCube.jpg

텍스처를 텍스처 큐브에 할당할 때는, 다음과 같은 슬롯에 둡니다:

prop_TexCube.jpg

텍스처 큐브 셋업을 완료하고나면 이걸 머티리얼 에디터에서 새로운 텍스처 샘플에다 할당해 줍니다.

이쯤에서 TextureSample(텍스처 샘플) 의 RGB 출력을 머티리얼의 Diffuse (확산) 채널에 연결할 수는 있지만, 에러가 납니다. 이 에러를 해결하려면 ReflectionVector(반영 벡터)Transform(변형) 표현식을 새로 추가해 줘야 합니다. 반영 벡터의 출력을 변형의 입력에다 연결한 다음, 변형의 출력을 텍스처 샘플의 UV 입력에다 연결하는 겁니다.

마스크

Mask(마스크)란 머티리얼 내에서 효과의 범위를 제한하는 데 사용되는 그레이스케일 텍스처, 또는 텍스처의 채널 하나(R, G, B, A)를 말합니다. 꽤나 자주 마스크는 디퓨즈나 노멀맵의 알파채널처럼, 다른 텍스처의 채널 하나에 얹혀있게 됩니다. 미사용 채널을 활용하여 머티리얼에 샘플링되는 텍스처의 수를 최소화시키는 데 좋은 방법이죠. 기술적으로는, 어느 텍스처의 어느 채널이건 간에 마스크로 간주하여 사용할 수 있습니다.

예제 마스크는 아래 이미지와 같습니다:

ex_mask.jpg

보통 텍스처 마스크에는 Multiply(곱) 표현식이 같이 쓰이는데, 마스크의 값에다 어떤 값을 곱해 주면 마스크의 값이 0.0보다 큰 데만 머티리얼 값을 남겨두는 겁니다. 이를 통해 마스크 값에 따라 효과의 농도를 다양히 줄 수 있습니다.

빛나는 부분이 있는 머티리얼에 흔히 쓰이는 기술입니다. Emissive (방출) 마스크는 빛나는 부분을 하양(이나 다양한 회색)으로, 나머지는 검정으로 하여 만듭니다. 이 방법의 장점은 빛나는 부분을 제한시킬 수 있을 뿐만 아니라, 머티리얼 안에서 빛나는 색 제어를 완벽히 할 수 있어서 텍스처 아티스트가 수정 작업을 한 다음 텍스처를 다시 가져오거나 하지 않아도 되는 것입니다.

ex_mask_emissive.jpg

마스크가 자주 쓰이는 곳이 또 있는데, LinearInterpolate(선형 보간) 표현식의 알파 입력을 마스크로 사용하여 두 효과를 혼합할 때입니다. 마스크가 하양인 부분과 검정인 부분에는 각기 다른 효과나 값을 적용하여 둘을 혼합하는 겁니다.

ex_mask_lerp.jpg

범프 매핑

언리얼 엔진 3에는 범프 맵 머티리얼을 만드는 데 주로 쓰이는 기술이 둘 있습니다. 간단히 설명하면:

  • 노멀 매핑 -- 단순 범프맵의 높이 정보만 사용하는 대신 XYZ 벡터 정보를 사용합니다.
  • 오프셋 범프 매핑 -- 노멀 매핑에 추가로 텍스처 좌표 변경을 통한 범프의 가상 높이 변위입니다.

대부분 표면에 특수 효과를 내는 데는 노멀맵만 사용해도 충분합니다만, 특수한 경우 노멀 매핑에 오프셋 범프 매핑을 더해 더욱 사실적인 시각 효과를 낼 수 있습니다.

노멀 매핑

노멀 맵 머티리얼은, 텍스처의 RGB 요소로 저장되었다가 텍스처의 표면각으로 전환되는 XYZ 정보를 사용합니다. 이는 빛이 노멀 방향에 따라 각기 다르게 반사되어 나타나는 심도 환영을 만들어 냅니다.

언리얼 엔진 3에서 노멀 매핑을 사용하는 머티리얼 제작하기란 식은 죽 먹기입니다. 일단은 노멀 맵이 필요하겠죠.

ex_normalmaptex.jpg

노멀 맵을 가져온 다음 사용할 준비가 되면, TextureSample (텍스처 샘플)에 할당한 다음 그 RGB 출력을 베이스 머티리얼 노드의 Normal (법선) 입력에 연결하면 됩니다.

ex_normal.jpg

노멀 매핑된 표면과 라이팅이 상호작용하며 디테일이 훨씬 풍부해진 것을 확연히 볼 수 있습니다. Specular (반사) 입력 채널에 디퓨즈 텍스처를 추가로 연결해 주니 이 효과가 더욱 두드러집니다.

노멀 맵 텍스처용 여러 세팅

노멀 맵에서 알파 채널이 사라지거나 노멀 맵이 디테일을 제대로 살려내지 못하는 문제를 겪게 되는 경우, 노멀 맵을 수정하면 됩니다. 오프셋 셰이더를 사용하려는데 하이트맵이 노멀맵의 알파 채널에 있는 경우라면, 텍스처 압축 방법을 TC_NormalMap 이외의 것으로 해야 합니다. 노멀 맵을 TC_NormalMapAlpha 으로 설정해 줘야 알파 채널을 유지합니다. 이런 식으로 위와 같은 관측시차 범프 매핑 셰이더를 사용할 수 있습니다.

노멀 맵에 라이팅 정보가 제대로 반영되지 않는 경우, 노멀 맵 자체의 세팅을 바꿔줘야 할 수도 있습니다.

손대지 않은 흔한 노멀 맵 텍스처를 막 가져온 모습은 이렇습니다:

normals_bad.jpg

텍스처 자체에는 심도가 별로 없는 것을 볼 수 있습니다. 다이내믹 라이트가 있는 씬에 적용하면, 브러시 표면에 걸쳐 오차가 많이 생기게 됩니다. (콘텐츠 브라우저 에서 노멀 맵 텍스처를 더블클릭하면 세팅창) 브라우저에서 텍스처 트윅 작업을 해 주고 나면 좀 나을 겁니다.

normals_good.jpg

노멀 맵 작업에 사용된 세팅은 이렇습니다. SRGB 박스는 껐습니다. UnpackMin 의 처음 세 채널은 -1 로 설정했습니다. LODGroupTEXTUREGROUP_WorldNormalMap 입니다.

이런 세팅을 통해 노멀 맵에 심도를 더해 줬습니다. 오프셋 셰이더가 사용되는 것도 볼 수 있습니다. 노멀 맵의 압축 세팅은 TC_NormalMapAlpha 로 설정했습니다. 하이트 맵은 노멀 맵의 알파 채널에 있고요. 이 정도면 바람직한 설정입니다. UnpackMin 세팅을 더 낮추면 디테일을 추가할 수 있습니다. 노멀 맵에 디테일이 좀 부족하다 싶으면 이 값을 만져 보시기 바랍니다. 단, 왜곡될 수가 있으니 주의하십시오.

오프셋 범프 매핑

ex_ParallaxBumpShot.jpg

오프셋 범프 매핑은 노멀 맵의 심도 환영을, 표면의 픽셀을 실제로 변위시켜 한 단계 발전시킨 겁니다. 위의 화면은 이렇게 심한 각도에서 봐도 벽돌이 표면에서 튀어나와 보이고 있지만, 실은 완전한 평면입니다.

노멀 맵과 오프셋 범프 맵의 차이는 아래와 같습니다. 오른쪽 이미지의 벽돌 엣지를 보십시오. 왼쪽의 벽돌은 울퉁불퉁하나 본질적으로는 평평한 반면, 오른쪽의 벽돌은 실제 높아 보입니다.

ex_SideBySide.jpg

하이트맵

머티리얼에 흔히 사용할 텍스처 구색(디퓨즈, 스페큘러, 노멀 등)에 추가로, 오프셋 범프 매핑을 사용하는 머티리얼을 만들 때는 heightmap (높이, 하이트맵)이라는 게 필요합니다. 하이트맵은 회색 음영 부분으로 높이를 나타내는 그레이스케일 텍스처입니다. 여기 예제에서는 단지 좀 더 잘 보여드리고자 별도 텍스처의 알파 채널에 이 정보를 집어넣어 놨습니다. 대부분의 경우에 하이트맵 은 노멀맵 텍스처의 알파 채널에 포함됩니다.

ex_heightmap.jpg

투과

Transmission(투과)란 반대편으로부터의 빛을 통과시키는 표면의 성질을 가리킵니다. 물론 그 복잡도에서는 비할 바가 못되지만, sub-surface scattering(SSS, 하위표면 산란)으로 알려진 효과와 비슷한 효과입니다.

ex_transmission.jpg

머티리얼의 투과를 제어하는 입력 채널은 둘 있습니다: TransmissionMask(투과 마스크), TransmissionColor(투과 색)

ex_transmission_inputs.jpg

투과 마스크 입력 채널은 자체적으로도 투과 색과 함께도 쓰일 수 있는 반면, 투과 색 입력 채널은 투과 마스크에 값을 입력해 줘야 작동합니다. 투과 마스크 입력 채널에만 값을 전달하면, 투과의 농도와 색을 조절합니다. 투과 색 입력 채널과 함께 쓰면, 투과 마스크는 총 투과량 계산에 투과 색을 곱해주게 됩니다. 즉 투과 색에 Constant3Vector(3상수 벡터) 의 형태로 색을 전달하고, 투과 마스크에 Constant(상수) 의 형태로 농도를 전달할 수 있습니다.

엣지 라이팅

엣지 라이팅, 또는 림 라이팅(역주: edge, rim 모두 가장자리, 테두리라는 뜻)은 필름이나 시네마틱에서 흔히 사용되는 기술로, 캐릭터의 실루엣을 비춰 씬에서 떨어뜨리거나 초점을 맞추는 데 사용됩니다. 보통의 라이트로 가능하긴 하지만, 캐릭터를 따라가게 하려면 부가적인 셋업 및 애니메이션이 필요합니다. 똑같은 기본 효과를 머티리얼 내에서 수행하여 효과를 더욱 세밀하게 조절한다든지, 캐릭터에 에테르성질을 준다든가 성능상의 이점을 위해 라이팅되지 않은 표면상의 실제 라이팅 흉내를 낸다든가 등의 기타 용도로 쓸 수도 있습니다.

ex_edgelighting.jpg

파라미터화

파라미터화는 머티리얼 내의 파라미터 표현식을 사용하는 것을 가리킵니다. 파라미터는 머티리얼의 인스턴스나 코드를 통해 변경할 수 있습니다. 파라미터화의 주요 이점이라면, 바라는 대로 머티리얼 콜렉션을 구성한 다음 그 기능성을 전부 포함하는 마스터 머티리얼을 만들 수 있다는 점입니다. 이러한 마스터 머티리얼에서 TextureSample (텍스처 샘플) 과 핵심 Constant(상수)Constant3Vectors(3상수 벡터) 등의 일정 부분은 TextureSampleParameter2D (텍스처 샘플 파라미터 2D), ScalarParameter(스케일러 파라미터), VectorParameter (벡터 파라미터) 표현식 등으로 대체할 수 있습니다. 그리고서 마스터 머티리얼의 인스턴스를 만들 때 머티리얼의 해당 부분만 변경해 주면 새로운 머티리얼을 처음부터 새로 만드느라 시간과 노력을 들이지 않고도 시각적으로 완전히 다른 머티리얼을 만들어 낼 수 있는 것입니다.

상세 정보는 인스턴스된 머티리얼, 머티리얼 인스턴스 불변 등을 참고하시기 바랍니다.

예제


여기서는 위에 말씀드린 기술과 개념은 물론 다른 것에 대한 데모가 되는 완성 머티리얼의 예제를 찾아보실 수 있겠습니다. 단순한 편에 속하는 노드 네트워크로 구성된 머티리얼부터 시작해서 점점 복잡해 지는 예제를 다뤄 보도록 하겠습니다.

반짝이

이 부분의 예제는 Specularity (반사성)?Environment Map (환경 맵)의 사용을 통한 다양한 종류의 광택 표면 제작에 관련된 것입니다.

무광

ex_shiny_matte_preview.jpg

이 표면은 약간의 반사 하이라이트가 있긴 하지만 무광 외형입니다. 일종의 플라스틱이나 무광 페인트 표면처럼 광택이 별로 또는 전혀 없는 표면을 만들 때 좋습니다.

ex_shiny_matte.jpg

예제에서의 Diffuse(확산)색은 밝은 빨강의 Constant3Vector(3상수 벡터) 값 (1.0, 0.0, 0.0)입니다만, 아무 색이나 TextureSample(텍스처 샘플) 을 사용해도 됩니다.

SpecularPower(반사력)에는 Constant(상수) 값 5.0이 들어가 하이라이트를 매우 흩뜨리고 있는 반면, Specular (반사)색에는 Diffuse(확산)의 희미한 버전 Constant3Vector(3상수 벡터) 값 (0.67, 0.22, 0.22)이 들어가 하이라이트를 흐리게 하고 있습니다.

광택

ex_shiny_glossy_preview.jpg

이 표면은 매우 윤이 나는 모습으로, 반사 하이라이트도 빡빡하고 밝습니다. 유리나 연마된 플라스틱, 차 도색 등의 광택 표면 종류에 좋습니다.

ex_shiny_glossy.jpg

예제에서 Diffuse(확산)색은 밝은 빨강의 Constant3Vector(3상수 벡터) 값 (1.0, 0.0, 0.0)입니다만, 아무 색이나 TextureSample(텍스처 샘플) 을 사용해도 됩니다.

SpecularPower(반사력)에는 Constant(상수) 값 75.0이 들어가 하이라이트가 매우 집중된 반면, Specular(반사)색에는 Diffuse(확산)의 과장된 버전 Constant3Vector(3상수 벡터) 값 (3.0, 1.0, 1.0)이 들어가 하이라이트를 밝고 돋보이게 하고 있습니다.

메탈

ex_shiny_metallic_preview.jpg

일단은 매끈한 외형에 확산색은 약간 어둡고, 반사 하이라이트는 약간 퍼지긴 했어도 꽤나 밝습니다. 메탈 표면이나 비단결 같은 매끈한 느낌에 좋습니다.

ex_shiny_metallic.jpg

예제에서 Diffuse(확산)색은 어두운 빨강의 Constant3Vector(3상수 벡터) 값 (0.2, 0.0, 0.0)입니다. Specular(반사)색이 표면의 근본적인 실제 색이기에, 어두운 색일수록 이 효과의 본질에 가까워 집니다. TextureSample(텍스처 샘플) 사용시에도 Constant(상수) 표현식으로 곱해서 어둡게 하면 비슷한 효과를 낼 수 있습니다.

SpecularPower(반사력)에는 Constant(상수) 값 2.0이 물려 하이라이트를 퍼지게 하고 있는 반면, Specular(반사)색에는 Diffuse(확산)보다 밝은 버전의 Constant3Vector(3상수 벡터) 값 (1.0, 0.0, 0.0)이 사용되어 하이라이트를 밝게 하고 있습니다.

반영

ex_reflection_preview.jpg

연마된 표면 외형을 내기 위해 반영(reflection), 또는 환경(environment) 맵을 사용하는 머티리얼입니다. 유리, 물, 크롬 등의 반영 표면을 만드는 데 좋습니다.

ex_reflection.jpg

Diffuse(확산)색은 UV에다 (탄젠트 -> 월드) Transform(변형) 에 통과시킨 ReflectionVector(반영 벡터) 를 사용하는 환경 맵에 의에 제어됩니다. 반영 성질을 줄이기 위해 환경 맵에다 Constant(상수) 값 0.375를 곱해줍니다.

SpecularPower(반사력) 값 2.0으로 하이라이트를 매우 흩뜨리면서, Specular(반사) 밝기 값 0.125로 희미하게까지 합니다. 약간의 대비를 줍니다만 하이라이트는 매우 어둡게 유지되며, 나머지는 반영이 알아서 합니다.

범프 오프셋

하이트맵 에 접근하려면, 하이트맵 이 할당된 텍스처로 텍스처 샘플을 새로 만들어야 합니다. 노멀 맵의 알파 채널을 사용중이라면, 노멀 맵이 할당된 텍스처 샘플의 복제본이 필요할 겁니다.

대충의 머티리얼 네트워크는 이렇습니다.

ex_bumpoffset_tex.jpg

이제 빈 공간에 BumpOffset(범프 오프셋) 표현식을 (B키를 누르고 좌클릭하여) 추가하고, 하이트맵 TextureSample(텍스처 샘플) 과 머티리얼의 다른 TextureSample(텍스처 샘플) 사이에 둡니다. 하이트맵 텍스처 샘플(아래)의 알파 채널 출력을 BumpOffset(범프 오프셋) 의 "Height" 입력에 연결합니다.

BumpOffset(범프 오프셋) 표현식을 선택하면 속성이 표시됩니다. 효과에 알맞은 모양새를 얻기 위해 조절을 좀 해 줘야 합니다.

  • HeightRatio (높이 비율) - 범프의 가장 높이와 텍스처의 폭 사이의 실제 비율입니다. 디폴트는 .05, 즉 머티리얼의 한 타일이 10 평방미터라면, 범프의 심도는 대략 10*.05=.5 미터가 됩니다. 머티리얼에 적합한 값을 찾아 보시기 바랍니다.
  • ReferencePlane (참조 평면) - 범프 높이를 나타내는 0과 1 사이의 값으로, 1이면 텍스처 좌표 오프셋이 없습니다. 디폴트 .5 값으로 대부분 괜찮을 겁니다만, 원하는 대로 만져 보십시오.

ex_bumpoffset.jpg

최종 머티리얼 네트워크의 모습은 위와 같습니다. 이 경우 디퓨즈 머티리얼이 머티리얼의 스페큘러 맵으로 쓰이고 있는데, 꼭 그럴 필요는 없습니다.

발광

ex_glow_preview.jpg

표면의 일부에 발광, 즉 영향을 끼치는 빛이 없어도 완전 라이팅된 것처럼 보이는 효과를 내기 위해 Emissive(방출) 입력 채널을 사용하는 머티리얼입니다. 이 효과는 (월드에 라이트의 시각적 표현물로 사용된 피지컬 메시 등) 라이트나 파티클 이펙트 또는 빛을 뿜을만한 표면 제작에 좋습니다. 라이트매스와 함께 사용하면 빛을 내뿜는 데 Emissive(방출) 채널을 사용하여 표면 자체를 실제 라이팅으로 사용할 수도 있습니다.

(크게 보려면 클릭)

머티리얼의 Diffuse(확산)색은 TextureSample(텍스처 샘플) 의 알파 채널에서 옵니다.

TextureSample(텍스처 샘플) 의 R, G, B 채널은 모두 각각의 빨강, 초록, 파랑에 해당하는 Constant3Vectors(3상수 벡터) 로 곱해준 개별 마스크로 사용됩니다. 세 가지 색을 번갈아 쓰기 위해 Sine(사인) 표현식의 출력과 Constant(상수) 값을 비교하는 If 표현식 시리즈에 통과시킵니다. 최종 If 표현식의 출력이 Emissive(방출) 출력에 연결되어 발광 글자 효과를 냅니다.

투명

투명 머티리얼을 만들기 위해 Opacity(불투명)과 OpacityMask(불투명 마스크) 입력 채널을 사용하는 예제입니다.

마스킹된 투명

ex_transparency_masked_preview.jpg

마스킹된 투명을 사용하는 머티리얼로, 완전 불투명하거나 완전 투명한 표면을 뜻합니다. 표면의 일부를 감춰 내재된 지오메트리보다 표면이 복잡해 보이게 만드는데 사용할 수 있습니다. 예를 들어 나무나 식물의 잎 또는 풀과 같은 기타 잎사귀에 보통 단순한 평면과 이 기술을 사용하여 잎의 윤곽선 밖의 메시 부분을 감춥니다.

ex_transparency_masked.jpg

Diffuse(확산)색에는 디퓨즈 텍스처를 물립니다.

Specular(반사)색은 디퓨즈 텍스처의 녹색 채널에서 따오고, 상수 값 4.0을 곱해줘서 농도를 증폭시켰습니다.

디퓨즈 텍스처의 알파 채널에는 불투명 마스크가 포함되어 있으며, 이를 OpacityMask(불투명 마스크) 입력 채널에 연결해 줬습니다. 머티리얼의 속성에서 블렌드 모드를 BLEND_Masked로 설정해 주어 불투명 마스크가 하얀(, 정확히는 Opacity Mask Clip Value(불투명 마스크 클립 값)보다 큰) 머티리얼 부분만 보이게 했습니다.

라이팅의 디테일을 높이기 위해 노멀 맵을 Normal(법선) 입력 채널에 연결했습니다.

SoftMasked 블렌드 모드도 이와 매우 비슷한 효과가 나며, 셋업도 동일합니다.

반투명

ex_transparency_translucency_preview.jpg

완전히 투명하거나 불투명하지도 않고, 투명도가 다양한 표면을 만들기 위해 반투명을 사용하는 머티리얼입니다.

(크게 보려면 클릭)

Diffuse(확산)색은 견고한 부분에는 디퓨즈 텍스처와 스페큘러 텍스처의 조합인데, 스페큘러 텍스처에는 Multiply(곱)Constant3Vector(3상수 벡터) 표현식으로 증폭시키고 색조를 입혀 창을 표현하고 있습니다. 이 둘을 분리해 내기 위해 Mask(마스크)? 를 사용하여 이 둘을 분리해 내고 Add(합) 표현식으로 조합한 다음에 Diffuse(확산) 입력 채널에 연결해 주고 있습니다.

Specular(반사)색 및 농도는 스페큘러 텍스처로 주고 있습니다.

Diffuse(확산)색에 사용된 것과 같은 Mask(마스크)?OneMinus(1에서 빼기) 표현식을 사용하여 반전시킨 다음에 Opacity(불투명)에다 물려주고 있습니다.

노멀 맵이 Normal(법선) 입력 채널에 연결되어 라이팅 디테일을 높여주고 있습니다.

심도-기반 투명

ex_transparency_depth_preview.jpg

한 표면과 그 뒤 표면간 거리에 따라 표면의 투명도를 달리하기 위해 심도 계산을 사용하는 데모 머티리얼입니다. 이는 DepthBiasAlpha(심도 편향 알파) 표현식이 완전 조절 가능하기만 하다면 그와 비슷하다 하겠습니다. 해변 근처 바닷물의 자연스런 모습을 흉내내는 물 느낌을 내는 데 매우 좋겠습니다.

(크게 보려면 클릭)

Diffuse(확산)색에는 대비값을 낮추고 엄청 어둡게 해 놓은 Environment Map(환경 맵)이 물려 있습니다.

Opacity(불투명)은 딱 커스텀 심도 계산으로만 제어됩니다. 현재 픽셀의 심도는 PixelDepth(픽셀 심도) 표현식으로 나타내는데, 이것을 DestDepth(거리 심도) 표현식으로 나타내는 그 뒤 픽셀 심도에서 빼 줍니다. 그 결과값을 Constant(상수) 값 192.0으로 지정된 참조 심도로 나눠줍니다. 이 값이 표면이 완전 불투명해지는 심도차가 되겠습니다. 그리고서 결과값을 바라는 범위 내로 제한시켜 줍니다. 이 예제에서 그 범위는 디폴트값 [0, 1]로 놔뒀으나, 표면이 완전 불투명해 지거나 투명해 지지 않게 하려면 다른 값을 줘도 되겠습니다.

표면의 Normal(법선)은 물결 모양을 내기 위해 패닝하는 노멀 맵을 꽤나 복잡하게 꼬아놓은 네트워크의 결과물입니다.

굴절

ex_refraction_preview.jpg

빛이 표면을 지나면서 굴절되는 것을 흉내내기 위해 투명과 Distortion(왜곡) 입력 채널을 사용하는 머티리얼입니다. 이 효과는 유리나 물 표면은 물론 증기나 지열같은 파티클 이펙트에도 좋습니다.

(크게 보려면 클릭)

Diffuse(확산)색에는 Environment Map(환경 맵)Exponent (지수)가 0.5인 Fresnel(프레넬) 표현식을 곱해주어 표면이 카메라에서 멀어질 수록 반영이 점점 확연해 지게 하고 있습니다.

SpecularPower(반사력)에는 Constant(상수) 값 150.0을 물려 하이라이트를 매우 집중시키면서, Specular(반사)색에는 상수값 1.0을 물려 하이라이트를 꽤나 밝게 만들고 있습니다.

Opacity(불투명)에는 똑같은 Fresnel(프레넬) 표현식을 Constant(상수) 값 0.75로 곱한 다음 연결해 주고 있습니다.

Distortion(왜곡) 입력 채널은 Constant3Vector (3상수 벡터) 값 (5.0, 5.0, 0.0)을 Exponent (지수)가 1.0인 Fresnel(프레넬) 로 곱해주어 계산하고 있습니다.

하부표면 분산

ex_sss_preview.jpg

sub-surface scattering(하부표면 분산) 효과를 흉내내기 위해 Transmission(투과) 입력 채널을 사용하는 머티리얼입니다. 이 기술은 피부, 밀랍 등 투명하지는 않지만 반대편의 빛이 투과되어 보이는 느낌을 낼 때 좋습니다.

ex_sss.jpg

Diffuse(확산)색에는 Constant3vector(3상수 벡터) 가 물려 있는데, 만들려는 머티리얼에 따라 TextureSample(텍스처 샘플) 을 쓸 수도 있습니다.

SpecularPower(반사력)에는 Constant(상수) 값 25.0을 물려 하이라이트를 꽤 집중시킨 반면, Specular(반사)색에는 상수 값 0.5를 물려 하이라이트를 좀 희미하게 해 놨습니다.

예제의 TransmissionMask(투과 마스크)에는 Diffuse(확산)색의 어두운 버전 3상수 벡터가 물려 있습니다. Diffuse(확산)색에서와 마찬가지로 텍스처 샘플이 될 수도 있습니다.

디테일

ex_detail_preview.jpg

어떤 것은 원거리에서 큰 디테일, 어떤 것은 근거리에서 작은 디테일을 표시하기 위해 디퓨즈와 노멀 맵 여럿을 혼합시킨 머티리얼입니다. 흔히 돌, 바위, 콘크리트 느낌에 사용됩니다.

ex_detail.jpg

TextureCoordinate(텍스처 좌표) 표현식 하나를 두 개의 Constant(상수), 하나는 0.5 또하나는 4.0 값으로 곱해준 다음 디퓨즈와 노멀 맵의 UV 입력에 연결해 주고 있습니다. 0.5를 곱해준 텍스처 좌표는 큰 쪽, 원거리 디테일용 디퓨즈와 노멀 맵 TextureSample(텍스처 샘플) 의 UV 입력에 연결됩니다. 4.0을 곱해준 텍스처 좌표는 작은 쪽, 원거리 디테일용 디퓨즈와 노멀 맵 텍스처 샘플의 UV 입력에 연결됩니다. 디퓨즈 텍스처 샘플 둘은 Add(합) 표현식을 사용해서 혼합시킨 다음 Diffuse(확산) 입력 채널에, 노멀 맵 텍스처 샘플 둘 역시 합 표현식을 사용해서 혼합시킨 다음 Normal(법선) 입력 채널에 연결해 주고 있습니다.

이 예제는 스페큘러 하이라이트를 희미하고 퍼뜨려 놓은 콘크리트 머티리얼입니다.

UV 좌표 움직이기

Panner(패너)Rotator(회전기) 표현식의 사용을 통해 텍스처의 UV 좌표를 움직이는 다양한 방법에 대한 데모 예제입니다.

회전하기

(커서를 올리면 움직입니다.)

ex_rotating_preview.jpg

텍스처의 UV 텍스처 좌표를 변경하여 회전시키기 위해 Rotator(회전기) 표현식을 사용하는 머티리얼입니다. Time 입력에다가 Time 표현식을 연결해서 바퀴, 팬, 프로펠러 등과 같이 회전하는 것들을 흉내내는 데 사용할 수 있습니다. (Time 입력에 아무것도 연결하지 않아도 디폴트로 게임 시간을 쓰기는 합니다.)

단순히 머티리얼 내부에서 사용할 텍스처 회전에 사용할 수도 있습니다. 예를 들어 텍스처에 세로선이 있는데 가로선이 필요한 경우, 가로선 텍스처를 가지고 또하나 만들 필요 없이 텍스처를 Rotator(회전기)로 돌려 쓰면 됩니다. 이를 위해서는 Constant(상수) 를 Rotator(회전기)의 Time 입력에다 연결해 주면 됩니다. 상수 값에는 텍스처를 회전시킬 라디안 값을 넣어주면 됩니다.

Rotator(회전기)의 Time 입력에 연결된 ScalarParameter(스케일러 파라미터) 를 통해 플레이 도중 동적으로 회전을 제어할 수 있습니다.

ex_rotating.jpg

Speed 값이 5인 Rotator(회전기)가 디퓨즈 TextureSample(텍스처 샘플) 에 연결되었고, 그 출력은 머티리얼 노드의 Diffuse(확산) 입력 채널에 연결되었습니다.

디퓨즈 텍스처의 알파 채널에는 불투명 마스크가 포함되어 있습니다. 여기에다 원 모양의 다른 마스크를 곱해줍니다. 회전 텍스처에 보이는 부분 중 이질적인 부분(, 즉 회전 텍스처가 감싸는 모서리 부분)을 제거하기 위해서입니다. Multiply(곱) 표현식의 결과가 OpacityMask(불투명 마스크) 입력 채널에 연결되었으며, BLEND_Masked 블렌드 모드가 사용되었습니다.

패닝 및 왜곡

(커서를 올리면 움직입니다.)

ex_panning_preview.jpg

패닝하는 전류 텍스처 위에다 오프셋 범프 맵을 마스크로 결합한 효과입니다. 결과를 보면 최종 머티리얼의 상자에 흐르는 전류가 가려지는 것도 보는 각도에 따라 살짝 오프셋시켜 꽤나 깊이감이 느껴집니다. 지오메트리는 아니니 완벽한 오클루전, 가려짐 효과는 아니지만 그래도 깊이감은 그럴듯 합니다. 머티리얼 에디터에서의 전체 셋업을 보려면 아래 이미지를 클릭해 보십시오. (주: 매우 큰 이미지이니 로드 시간이 조금 걸릴 수 있습니다.)

(크게 보려면 클릭)

Diffuse(확산) 채널이 패닝 및 마스크 효과를 내는 데는 물론, 상자용 기본 텍스처로도 쓰이고 있습니다. Diffuse(확산) 채널에 직접 연결된 것은 Linear Interpolate(선형 보간) 노드로, 상자와 패닝 효과를 혼합해 주고 있습니다.

Grate_Texture.jpg

(위 그림과 같은) 기본 상자 텍스처는, 그 텍스처 샘플의 좌표 채널에 전달된 BumpOffset(범프 오프셋) 표현식을 포함하여 선형 보간 표현식의 A 채널에 전달되었습니다. 범프 오프셋이 바로 텍스처 자체적으로 가려지는 효과를 내는 것입니다.

선형 보간 표현식의 B 채널에서는 전류가 흐르는 효과가 나고 있습니다. 표현식 체인의 맨 오른쪽에는 속도값을 0.2 준 Panner(패너) 표현식으로 시작되고 있으며, 무지개 구름같은 텍스처 샘플에다 물려줘서 그게 X 방향으로 0.2 속도로 움직이게 하고 있습니다. 아래는 텍스처 샘플에 사용된 텍스처입니다.

WaterDistortion.jpg

그리고서 ComponentMask(컴포넌트 마스크) 로 빨강과 초록 컴포넌트만 통과시킨 다음 Add(합) 표현식에 보내고 있습니다. Add(합) 표현식이 SpeedX는 0.0이고 SpeedY는 0.2인 Panner(패너)를 패닝 텍스처 샘플의 R과 G 컴포넌트에 더하기 위해 사용됩니다. 이 Add(합) 표현식의 표현식의 결과는, Panner(패너)를 텍스처인 양 간주해서 해당 텍스처의 색을 Add(합) 표현식의 B 채널에 전달한 텍스처에다 더해주는 것입니다. 이런 것이 가능한 이유는, 머티리얼 에디터에서는 색과 숫자를 구분하지 않기 때문입니다.

방금 결과 Add(합) 표현식이 단순한 빔 텍스처의 UV에 전달되면서 텍스처의 반대 효과가 숫자값으로 사용되는 것을 봤습니다. 이런 복잡한 표현식 시리즈를 다른 샘플 텍스처의 UV에다 전달해 주므로써 결과 텍스처가 왜곡되고 변경되어, 좀 더 유기적인 불규칙성을 띈 패닝 효과가 텍스처 전반에 걸쳐 물결치게 되는 겁니다. 기본 텍스처와 모든 표현식을 적용한 텍스처의 대조 결과는 아래에서 확인해 볼 수 있습니다.

PowerBeam.gif PowerBeamModified.gif
기본 텍스처
표현식 적용

이제 요 전류에 색을 주기 위해, (R G B 값으로 각각 0.0, 0.2, 0.05 를 준) 3상수 벡터를 곱해주고 있습니다. 색을 입힌 다음 앞서 말한 선형 보간 표현식의 B 채널에 전달해 주고 있습니다.

선형 보간의 알파 채널에 알파 컴포넌트를 적용해 줄 일만 남았습니다. 선형 보간 표현식의 A 채널에 연결된 상자용 베이스 텍스처의 알파 컴포넌트에는 (아래 그림과 같은) 알파 레이어가 들어 있습니다:

Grate_Alpha.gif

자그마치 이러한 표현식 체인을 선형 보간 표현식에다 죄다 연결해 준 다음 Diffuse(확산) 채널에 연결해 주면, 머티리얼은 상자 마스크 뒤로 둔탁한 녹색 유기 전류가 흐르는 듯한 상자 텍스처를 표시하게 됩니다.

Emissive(방출) 채널은 순전히 상자 마스크 뒤의 녹색 전류를 밝게 하기 위해 쓰입니다. 이를 위해 선형 보간 표현식의 B 채널에 전달된 곱 표현식이 다시 둘째 곱 표현식에 전달되어 상수를 곱해주고 있습니다. 녹색 전류를 왕창 밝게 하기 위해, 상수 R 값을 20.0으로 설정했습니다. 그러고 난 결과 곱 표현식이 머티리얼의 Emissive(방출) 채널에 전달됩니다.

Diffuse(확산) 채널에 상자로 사용된 것과 똑같은 기본 텍스처를 샘플 텍스처 표현식을 통해 Specular(반사) 채널에다 적용시켜 빛의 섬광을 줄입니다.

Normal(법선) 채널에는 그냥 보통의 BumpOffset(범프 오프셋) 노멀 맵입니다. 이를 통해 보는 사람의 눈 위치에 따라 상자 자체적으로 가려지는 효과를 냅니다. 디폴트 HeightRatio(높이 비율)과 ReferencePlane(참조 평면)값을 가진 위 그림같은 노멀 맵이 범프 오프셋에 연결되고, 그 범프 오프셋이 다시 또다른 노멀 맵 인스턴스는 물론 디퓨즈 채널의 기본 텍스처로도 연결되고 있습니다. 마지막으로 노멀 맵과 범프 오프셋 표현식 묶음이 최종 머티리얼의 Normal(법선) 채널에 전달되고 있습니다.

이 머티리얼에 사용된 기본 노말 맵은 이렇습니다.

Grate_Normal.gif

방향 효과

방향 기반 효과, 즉 머티리얼을 바라보는 방향에 따라 달라지는 효과의 데모 예제입니다.

투 톤

ex_facing_twotone_preview.jpg

한 방향에서 봤을 때와 다른 방향에서 봤을 때의 색이 달라 보이는 투 톤 표면을 흉내내는 머티리얼입니다. 매우 광택? 이 나는 표면으로, Environment Map(환경 맵)을 사용하여 반영 효과도 냅니다. 일종의 차량 도색과 비슷합니다.

(크게 보려면 클릭)

Diffuse(확산)색은 투 톤 효과와 환경 맵의 조합입니다. 환경 맵은 Constant(상수) 값 0.1625로 곱해줘서 어둡게 했습니다. 그리고서 씬 뒤의 기본 반사성? 계산과 비슷한 계산 결과를 곱해줬습니다. LightVector(라이트 벡터)ReflectionVector(반영 벡터)DotProduct(도트 곱) 표현식에 전달됩니다. 그 결과를 ConstantClamp(상수 제한) 에다 통과시킨 다음, Exp (지수) 입력이 0.5인 Power(거듭제곱)Base (밑) 입력에다 전달해 줍니다. 이 계산식을 말로 풀자면, 표면 반사 방향이 빛을 향할 때는 1.0 값부터, 빛에 직각일 때는 0.0 값까지 보간되는 겁니다. 반사성? 작동 방식과 같죠. 이 값에다가 환경 맵을 곱해주는 겁니다.

투 톤 효과는 위에 설명한 반영과 비슷한 셋업을 사용합니다. 라이트 벡터와 반영 벡터가 도트 곱에 전달됩니다. 상수 제한 표현식으로 그 결과를 제한시키고, Exp (지수) 입력이 3.0인 거듭제곱의 Base (밑)에다 전달해 줍니다. 이 계산식을 말로 풀자면, 표면을 바라보는 각과 표면에 빛이 비추는 각이 일치할 때는 1.0 값부터, 표면을 빛과 수직인 곳에서 바라볼 때는 0.0 값까지 보간되는 겁니다. 이 값이 LinearInterpolate(선형 보간) 표현식의 Alpha (알파) 입력으로 사용됩니다. 선형 보간 표현식의 A B 입력에는 각각 Constant3Vector(3상수 벡터) 가 연결되어 있는데, 하나는 짙은 파랑(0.01, 0.0, 0.5), 또 하나는 밝은 파랑/보라(0.125, 0.0, 1.25) 입니다. 즉 표면을 빛의 방향에서 볼 때는 보라색, 빛과 수직 방향에서 볼 때는 파랑색이 되는 겁니다.

그리고서 Environment Map(환경 맵) 네트워크와 투 톤 네트워크가 Add(합) 표현식을 통해 결합된 다음 머티리얼 노드의 Diffuse(확산) 입력 채널에 연결되고 있습니다.

SpecularPower(반사력)에는 상수값 1.25가 연결되어 하이라이트를 퍼뜨리는 반면, Specular(반사)색에는 약간 변형된 보라색 3상수 벡터값 (0.1, 0.0, 1.2)가 연결되어 하이라이트가 너무 강하지는 않은 수준으로 부각시키고 있습니다.

림 라이팅 (역광)

ex_rimlighting_preview.jpg

엣지 라이팅 효과를 내기 위한 "하드-코딩된" 라이팅 생성 데모 머티리얼입니다. 라이팅되지 않은 머티리얼에 라이팅 효과를 흉내내기 위해 이 기술의 변종을 사용할 수도 있습니다. 라이팅되고 있는 듯한 모양새를 주면서도 머티리얼 렌더링 농도를 훨씬 낮추는 겁니다. 종종 메시 파티클의 라이팅은 비쌀 수가 있기에 이런 효과를 사용하곤 합니다.

(크게 보려면 클릭)

Diffuse(확산)색은 단순히 TextureSample(텍스처 샘플) 로 제어됩니다.

Emissive(방출)색에 주요 효과가 몰려 있습니다. Constant3Vector(3상수 벡터) 값 (0.0, 0.0, 1.0)을 탄젠트에서 월드 좌표로 변형, 즉 표면의 탄젠트 노멀을 월드 노멀로 바꿔주고 있습니다. 이게 또다른 3상수 벡터값 (1.0, 0.0, 0.0)과 함께 DotProduct(도트 곱) 에 연결됩니다. 둘째 3상수 벡터는 빛의 방향을 나타냅니다. 이 도트 곱 결과를 [0, 1] 범위로 제한시킨 다음 Exp (지수) 입력에 상수값 5.0이 연결된 Power(거듭제곱) 에다 연결합니다. 라이팅 효과에 담황갈색(fallow)을 얼마나 줄 지를 제어하는 값입니다. 그 결과를 Exponent (지수)는 10이고 Normal (법선) 입력에 노멀 맵이 연결된 Fresnel(프레넬) 표현식과 곱해줍니다. 빛이 비춰지는 면을 직접 바라볼 때도 메시의 가장자리 부근에만 라이팅 효과가 나게 하는 겁니다. 다음으로 이 값에다가 빛의 색을 나타내는 3상수 벡터를 곱해줍니다. 그리고서 디퓨즈 텍스처에도 곱해주고요. 마지막으로 여기다 엣지 라이팅의 농도를 나타내는 상수값 10.0을 곱해줍니다. 최종 결과가 Emissive(방출) 입력 채널에 연결되었습니다.

표면의 법선은 노멀 맵이 적용된 텍스처 샘플에 의해 제어됩니다.

모방된 HDR

ex_HDRCubeMap.jpg

위 그림과 같은 모방된 HDR 라이팅 포함 큐브 맵은, 다음과 같은 표현식과 텍스처로 쉽게 만들 수 있습니다.

ex_HDRCubeMap_Mat.jpg

효과를 만들기 위해 큐브샘플/리플렉션 텍스처를 찍고, 가장 밝은 픽셀을 고립시킨 다음, 그 픽셀의 농도를 변경하기 위한 콘트롤을 추가하고 난 것을 기본 큐브맵 위에다 다시 더해 줍니다. 이런 셋업으로 하이라이트 밝기를 조절하면서도 큐브맵 자체는 어둡게 할 수 있습니다.

실세계의 반영 원리를 복제합니다: 밝은 것들은 반투명이나 어두운 표면에 반영될 때도 밝습니다. 에디터 내에서 샘플링되는 큐브맵에서도 제대로 보이게 하기 위해서는, 큐브 텍스처 샘플의 SRGB 플랙을 꺼야 할 겁니다. 계속 꺼 놓을 수도 있지만, 매우 어둡고 명암이 심한 반영을 얻게 됩니다.

이런 접근법을 통해, 먼저 큐브 텍스처의 채도를 감소시키고, 거기서 밝은 픽셀을 고립시킨 다음, 그 결과에다 색을 다시 입히기 위해 원본 큐브 텍스처를 곱해주고 최종적으로 그 자체에다 더해줍니다. 이를 통해 색이 잘못 뽑히는 것을 방지하고, 밝은 부분에만 영향을 끼치도록 합니다.

눈 (Snow)

ex_Snow.jpg

반짝이는 눈의 느낌을 흉내내는 머티리얼입니다.

(크게 보려면 클릭)

먼저 512x512 반짝이 텍스처를 RGB 채널에 하나 (검은 배경에 1픽셀 크기 점을 퍼뜨려서) 만들고, 반짝이 효과용 마스크로 사용할 마크스 텍스처를 (포토샵에서 Cloud 필터를 사용하고 무겁게 대조시켜서) 알파 채널에 만듭니다. 또 에디터가 DDS 텍스처 바로 가져오기를 지원하는 버전이라면, 다양한 거리별 반짝이 텍스처의 밉맵 레벨을 수동으로 만들 수도 있습니다. 밉맵 레벨은 원본 반짝이 텍스처의 일부를 잘라다가 다음 밉맵 레벨에다 붙이는 식으로 뚝딱입니다.

머티리얼 에디터에서 Multiply(곱) 노드를 사용하여 RGB와 알파(, 둘 다 다른 타일링 속성을 가지고서 별개의 노드로 사용된) 채널을 섞습니다. RGB 채널/노드에는 그 타일링을 조절할 수 있도록 표준 TextureCoordinate(텍스처 좌표) 노드가 연결되어 있습니다. 알파 채널/노드에는 ReflectionVector(반영 벡터) 가 있으며, "콤포넌트 마스크"의 연결을 통해 R과 G 채널만 사용하도록, 거리와 관계없이 일정한 크기의 마스크를 갖도록 합니다. 마지막으로 반짝이 밝기를 임의로 변경할 수 있도록 Multiply(곱) 노드를 ScalarParameter(스케일러 파라미터) 로 곱합니다.

주요 문제는 원거리에서도 반짝이 효과를 내게 하는 것입니다. PixelDepth(픽셀 심도) 를 사용하는 것 보다는 밉맵을 수동으로 만드는 게 훨씬 나은 결과를 내며, 머티리얼 자체에 필요한 노드도 적습니다.

젖은

(커서를 올리면 움직입니다.)

ex_wet_preview.jpg

"젖은" 표면, 수직 표면에는 물이 흘러내리는 듯하면서 수평 표면에는 그냥 고여있는 효과 데모 머티리얼입니다. 젖었든 말랐든 다양한 표면을 빠르게 만들어 내기 위한 인스턴스 기능을 추가하기 위해 디퓨즈, 스페큘러, 노멀 맵 같은 것들에는 파라미터를 활용한 마스터 머티리얼로 셋업되어 있는 머티리얼입니다.

(크게 보려면 클릭)