2012-03-11 2 views
2

전에 물어 본 적이 있다면 용서해주세요. 하루 종일 응답을 찾고 있었고 타일 기반 2D 게임에 도움이 될 것입니다. x ~ x화면 공간에 텍스처 섹션을 타일링하는 방법은 무엇입니까?

각 요소에 대한 위치가있는 XML 파일과 스트레치 또는 타일링 옵션을 사용하여 Direct3D 9에서 스킨 가능한 GUI를 만들려고합니다. 스트레칭은 절차가 간단하지만 텍스쳐의 작은 부분을 타일링하는 방법을 찾지 못했습니다. 전통적으로 텍스처를 바둑판 식으로 배열하기 위해 UV 좌표를> 1.0으로 설정했지만 소스 텍스처 좌표는 전체 텍스처의 작은 부분 집합 (예 : 0.4에서 0.5) 일뿐입니다.

나는 정말 뻔한 무엇인가 놓친 느낌이 들지만, 스트레칭 대신 간단하게 타일링하는 방법은 무엇입니까? 내 생각 엔 텍스처 좌표가 두 세트 이상있는 것과 관련이 있지만 거기에서 어디로 가야할지 모르겠다.

프로젝트는 현재 고정 함수 파이프 라인을 사용하므로 가능한 경우 해당 답변을 사용하는 것이 좋지만 유일한 방법 인 경우 쉐이더를 사용하는 대답은 거절하지 않습니다.

답변

1

텍스처의 하위 집합 만 타일링한다고 알고 있습니다. 맞습니까? 그러면 일이 복잡해집니다.

u1과 u2 값 u-coord를 u1 < u2로 바꿔야한다고 가정합니다.

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... 

것이 적합한 함수는 동일한 V-COORD 간다 f(u) = frac(u) * (u2-u1) + u1

그것이 타일링없이하다는 f(v) = frac(v) * (v2-v1) + v1

통지하므로

그렇다면 우리는 (U)를 함수 (F) 필요 미러링. 미러링이 필요한 경우 함수는 삼각파 함수 (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); 

편집 : 더 나은 삼각형 파 함수 계산 방법 : t1(x) = abs(2(0.5x-floor(0.5x+0.5))) 또는 t2(x) = abs(2(frac(0.5x+0.5))-1) (정확히 t1과 같지 않지만 음수가 아닌 숫자는 정확함).

+0

고정 기능 파이프 라인에서 처리하는 것이 실제로 불가능하다는 것을 보여주었습니다.하지만 슬픈 일이지만, 픽셀 쉐이더 코드에서 이상을 볼 수있어서 좋았습니다. 응답 주셔서 감사합니다 : D 조 – Addi

관련 문제