2012-09-13 7 views
5

GLSL에서 올바른 2D 어포 인 텍스처 매핑을 코딩하려고합니다.올바른 glsl affine 텍스처 매핑

설명 :

...이 이미지의 NONE 내 목적을 위해 올바른 없습니다. 오른쪽 (수정 됨)에는 원근감 교정이 있습니다. 그래서이 : Getting to know the Q texture coordinate 솔루션 (더 이상의 개선없이) 내가 무엇을 찾고 있지 않습니다.

이 같은 단순히 "스트레치"사각형 내부의 질감, ​​뭔가하고 싶은

:

enter image description here

하지만 두 개의 삼각형에서 구성. 어떤 조언 (GLSL)하시기 바랍니다?

+1

위쪽 꼭지점이 아래쪽 꼭지점 뒤에 있습니까, 아니면 쿼드의 꼭지점 위치 만 확대 중입니까? –

+0

스케일링, 모든 좌표가 2D입니다 (내 게시물을 수정 한 것입니다) – velkyel

답변

-2

감사하지만, 실험 후 나는 해결책을 찾아 냈다. 왼쪽

개의 삼각형 UV (strq) 오른쪽 this 두 개의 삼각형이 시각 보정의 버전에 따라 약간 변형을 갖는다.

번호 쉐이더 : 오직 U는 사시도이다 ..

void main() 
{ 
    gl_FragColor = texture2D(colormap, vec2(gl_TexCoord[0].x/glTexCoord[0].w, gl_TexCoord[0].y); 
} 

되도록 V는 선형이다

tri1 = [Vec2(-0.5, -1), Vec2(0.5, -1), Vec2(1, 1)] 
tri2 = [Vec2(-0.5, -1), Vec2(1, 1), Vec2(-1, 1)] 

d1 = length of top edge = 2 
d2 = length of bottom edge = 1 

tri1_uv = [Vec4(0, 0, 0, d2/d1), Vec4(d2/d1, 0, 0, d2/d1), Vec4(1, 1, 0, 1)] 
tri2_uv = [Vec4(0, 0, 0, d2/d1), Vec4(1, 1, 0, 1), Vec4(0, 1, 0, 1)] 

만 직각 삼각형이 GLSL 쉐이더를 이용하여 렌더링된다 (왼쪽 고정 파이프이다) .

+2

그건 내가 당신에게 보여준 것입니다. 많은 경우를 설명하지 않는다는 것을 제외하고는. 여섯 개의 꼭지점을 갖는 데는 아무 쓸모가 없습니다. – Jessy

6

이것은 사다리꼴이 있고 평행 한 모서리가 로컬 축 중 하나와 정렬되어있는 한 잘 작동합니다. 내 Unity package으로 놀아 볼 것을 권합니다.

GLSL :

varying vec2 shiftedPosition, width_height; 

#ifdef VERTEX 
void main() { 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    shiftedPosition = gl_MultiTexCoord0.xy; // left and bottom edges zeroed. 
    width_height = gl_MultiTexCoord1.xy; 
} 
#endif 

#ifdef FRAGMENT 
uniform sampler2D _MainTex; 
void main() { 
    gl_FragColor = texture2D(_MainTex, shiftedPosition/width_height); 
} 
#endif 

C 번호 : 답변

// Zero out the left and bottom edges, 
// leaving a right trapezoid with two sides on the axes and a vertex at the origin. 
var shiftedPositions = new Vector2[] { 
    Vector2.zero, 
    new Vector2(0, vertices[1].y - vertices[0].y), 
    new Vector2(vertices[2].x - vertices[1].x, vertices[2].y - vertices[3].y), 
    new Vector2(vertices[3].x - vertices[0].x, 0) 
}; 
mesh.uv = shiftedPositions; 

var widths_heights = new Vector2[4]; 
widths_heights[0].x = widths_heights[3].x = shiftedPositions[3].x; 
widths_heights[1].x = widths_heights[2].x = shiftedPositions[2].x; 
widths_heights[0].y = widths_heights[1].y = shiftedPositions[1].y; 
widths_heights[2].y = widths_heights[3].y = shiftedPositions[2].y; 
mesh.uv2 = widths_heights; 
+0

정점에 포함 된 것을 쓸 수 있습니까? 나는 vertex = [Vec2 (-1, -1), Vec2 (-0.5, 1), Vec2 (0.5, 1), Vec2 (1, -1)]'shiftedPositions = [Vec2 Vec2 (1, 2), Vec2 (1, 2) ', Vec2 (1, 2), Vec2 (1, 2), Vec2 (2, 2)]. 그리고 내 조각은 다음과 같습니다 :'gl_FragColor = texture2D (colormap, gl_TexCoord [0] .xy/width_heights.xy);'(gl_TexCoord를 사용해야합니다). 그리고 그것은 단순히 작동하지 않습니다. – velkyel

+0

귀하의 vec2s 모두 괜찮습니다. 나는 유니티 프로젝트보다 도움이되는 것을 당신에게 제공 할 수 있다고 생각하지 않는다. 그게 내가 지금 정말로 알고있는 전부 야. 그것을 사용하는 데 도움이 필요하거나 나를 돕기 위해 다른 방법을 생각할 수 있다면 알려주십시오. 나는 결과를 확실히 얻는다. 핵심은 꼭지점에서 너비/높이 계산을 "스캔 라인"으로 이동하는 것입니다. 우리가 할 수있는 최선의 방법은 과잉 픽셀 인 픽셀 단위이지만 GPU가 제공하는 것입니다. – Jessy

+1

답변 해 주셔서 감사합니다. 이것은 나를 위해 완벽하게 일했습니다! –

2

저는 최근에 모든 유형의 사변형에 대해이 문제에 대한 일반적인 해결책을 제시했습니다. 계산과 GLSL이 도움이 될 수 있습니다. Java에서 작동하는 데모가 있습니다 (Android에서 실행 됨). 작고 읽기 쉽기 때문에 유니티 또는 iOS에 쉽게 옮겨야합니다. http://www.bitlush.com/posts/arbitrary-quadrilaterals-in-opengl-es-2-0

+0

좋은데, 내가 찾던 것이 아니야. 먼저 질문을주의 깊게 읽으십시오. 3 쿼드 매핑은 내가 원하는 것이 아닙니다. – velkyel

+0

예, 내 잘못, 당신에게 원근감 교정없이 그것을 필요로하지 않는 면화는 없었습니다. – keith