문제

이전 에이 질문이 묻는 경우, 나는이 모든 일에 대한 답변을 찾고 있었고, 나는 타일 기반의 2D 게임에 도움이되는 것입니다. x ~ x

Direct3D 9에서 Skinnable GUI를 만들려고하고 있으며 각 요소에 대한 위치가있는 XML 파일과 스트레칭 또는 타일 옵션을 사용합니다. 스트레칭은 충분히 간단한 절차가 있지만, 텍스처의 작은 부분을 타일하는 방법을 알아낼 수 없었습니다. 전통적으로 텍스처를 타일 러블에 UV 좌표를> 1.0으로 설정할 것입니다. 그러나 소스 텍스처 좌표는 0.4 ~ 0.5와 같은 전체 텍스처의 작은 부분 집합 만있을 것입니다.

나는 정말로 분명한 것을 놓친 느낌을 가지고 있지만 스트레칭 대신에 어떻게 만드는 것에 대해 어떻게 가야합니까? 나의 가장 좋은 추측은 하나 이상의 텍스처 좌표 세트를 갖는 것과 관련이 있지만 거기에서 어디로 가야하는지 확실하지 않습니다.

프로젝트는 현재 고정 된 기능 파이프 라인을 사용하므로 가능한 경우 해당 답변을 선호하지만, 셰이더를 사용하는 답변을 드러내지 않을 것입니다.

도움이 되었습니까?

해결책

나는 당신이 질감의 하위 집합만을 타일 것을 이해하고, 맞습니까?그런 다음 일이 복잡해집니다.

U1 & U2 값 사이의 U o-coord, u1

우리는 기능 F (U)가 필요하므로

f(0.0) = u1
f(0.5) = (u1+u2)/2
f(0.9999) = u2
f(1.0) = u1
f(1.5) = (u1+u2)/2
f(1.9999) = u2
f(2.0) = u1
and so on...
.

적절한 기능은 f(u) = frac(u) * (u2-u1) + u1

V-coord, f(v) = frac(v) * (v2-v1) + v1 에 대해서도 동일합니다.

미러링 없이는 바둑판 식으로합니다.미러링이 필요한 경우 함수는 t(x) = arcsin(sin(pi*(x-0.5)))/pi+0.5f(u) = t(u) * (u2-u1) + u1 인 삼각형 웨이브 함수 여야합니다.삼각 함수를 사용하면 비쌉니다.

고정 된 파이프 라인으로 가능하면 알 수 없지만 픽셀 쉐이더 (HLSL 코드)에서 쉽게 수행 할 수 있습니다.

// float2 tex_coord -> (u,v) from vertex shader, in [0,n] range,
//                     n - number of repetitions
// float2 tex1, tex2 -> constants, subrange of [0,1] coords that will be tiled

// no mirroring
float4 color = tex2D(sampler, frac(tex_coord) * (tex2-tex1) + tex1);
.

또는

// mirroring, t(x) = arcsin(sin(pi*(x-0.5)))/pi+0.5
float4 color = tex2D(sampler, t(tex_coord) * (tex2-tex1) + tex1);
.

편집 : triangular-wave 함수를 계산하는 더 좋은 방법 : t1(x) = abs(2(0.5x-floor(0.5x+0.5))) 또는 t2(x) = abs(2(frac(0.5x+0.5))-1) (t1와 정확히 동일하지만 음수가 아닌 경우 정확하지 않음).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top