지형을 텍스처 매핑하는 방법은 무엇입니까?


10

3D 게임에서 XNA와 함께 일하고 있으며 적절하고 멋진 환경을 조성하려고합니다. 실제로 하이트 맵에서 터 레인을 만들기 위해 튜토리얼을 따랐습니다. 질감을 내기 위해 잔디 질감을 적용하고 여러 번 바둑판 식으로 배열합니다.

그러나 내가하고 싶은 것은 실제로 현실적인 텍스처링을하고 자동으로 생성하는 것입니다 (예를 들어 Perlin 노이즈를 사용하여 지형을 생성 한 다음 질감을 원한다면).

이미 다중 텍스처링에 대해 배웠고 다른 질감에 대해 다른 색상의 맵 파일을로드했지만 절벽이나 매우 가파른 지역과 같이 실제로 효과적이라고는 생각하지 않습니다. 상단. (또한 도로 나 흙길을 어떻게 그릴 지 모르겠습니다.)

매핑 절차 적으로 생성 된 지형을 사실적으로 텍스처링하는 효율적인 솔루션을 찾고 있습니다.


1
매핑 문제가 전혀 사소한 것은 아닙니다. 몇 단락에서 제대로 대답 할 수 없습니다. 고조파 매핑과이 백서에 설명 된 내용을 살펴 보는 것이 좋습니다. cs.ubc.ca/~sheffa/papers/TOG02.pdf
teodron

답변:


2

블렌드 맵이나 텍스처 스플래 팅에 대해서는 신경 쓰지 않습니다 (UV 매핑과 무관합니다). 매핑으로 인한 왜곡을 최소화하도록 특별히 요청했기 때문에이 GPU Gems 기사의 섹션 1.5를 참조하십시오.

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch01.html

이것은 절차 적으로 생성 된 지형에서도 작동 할 수 있습니다. 이 개념은 "triplanar texturing"이라고도 합니다.

나중에 편집 : 매핑에 사전 계산 된 UV를 사용하지 않고 자체 지형 렌더러에서이 기술을 테스트했습니다. 3 개의 다른 투영 평면 (XY, YZ 및 ZX)에 대해 3 세트의 UV를 계산하기 만하면됩니다. 간단한 버텍스 및 프래그먼트 셰이더 스 니펫을 사용하면됩니다.

VShader :

float tileSize = 2.0;
vec4 worldPos = ( gl_Vertex);//So we obtain the world position

TexCoordX = (worldPos.zy/tileSize);//here are our texture coordinates...
TexCoordY = (worldPos.xz/tileSize);
TexCoordZ = (worldPos.xy/tileSize);
normal =  gl_Normal;
wNormal = normal;

FShader :

vec3 n = wNormal;
n*=n;
vec2 tcX = fract(TexCoordX);
vec2 tcY = fract(TexCoordY);
vec2 tcZ = fract(TexCoordZ);

vec4 grassCol = texture2D(grassTexture,tcX)*n.x+
                texture2D(grassTexture,tcY)*n.y+
                texture2D(grassTexture,tcZ)*n.z;

3

텍스처 세트 (잔디, 흙, 바위)를 정의하고 사용할 수 있습니다. 이 세 레이어 (하단의 바위, 맨 위의 흙 및 맨 위의 잔디)를 사용하여 세 개의 알파 채널을 정의하여 각 텍스처가 얼마나 많이 표시되는지 정의 할 수 있습니다. 알파 채널에 대한 간단한 노이즈 맵으로 시작하고 지형의 기울기를 고려하십시오. 경사가 많을수록 더 많은 바위가 비춰집니다. 이것은 내가 기억하는 한 'Texture Splatting'이라는 기술입니다. 다음은 시작할 수있는 몇 가지 링크입니다. 고급 텍스처 스플래 팅 (가마 수트라)

TextureSplatting (찰스 블룸,이 주제를 시작하는 데 사용한 것)

좋은 결과를 얻을 수 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.