2012-09-13 23 views
5

Tôi đang cố gắng viết đúng bản đồ kết cấu affine 2D trong GLSL.sửa sơ đồ kết cấu glsl đúng chính xác

Giải thích:

... NONE của hình ảnh này là chính xác cho mục đích của tôi. Đúng (dán nhãn đúng) có hiệu chỉnh phối cảnh mà tôi không muốn. Vì vậy, điều này: Getting to know the Q texture coordinate giải pháp (không có cải tiến hơn nữa) không phải là những gì tôi đang tìm kiếm.

Tôi muốn đơn giản là "căng" kết cấu bên trong tứ giác, một cái gì đó như thế này:

enter image description here

nhưng cấu tạo từ hai tam giác. Bất kỳ lời khuyên (GLSL) xin vui lòng?

+1

Có phải các đỉnh trên phía sau các cạnh dưới hay bạn chỉ cần chia tỷ lệ vị trí đỉnh của tứ giác? –

+0

chia tỷ lệ, tất cả tọa độ đều ở dạng 2D (tôi vừa sửa đổi bài đăng của tôi) – velkyel

Trả lời

-2

nhờ cho câu trả lời, nhưng sau khi thử nghiệm tôi tìm thấy một giải pháp.

hai hình tam giác bên trái có uv (strq) theo this và hai hình tam giác bên phải được modifed phiên bản điều chỉnh quan điểm này.

số và shader:

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)] 

tam giác chỉ đúng được trả lại bằng GLSL đổ bóng này (bên trái là đường ống cố định):

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

vì vậy .. chỉ là quan điểm U và V là tuyến tính .

+2

Đó chính xác là những gì tôi đã giới thiệu cho bạn, ngoại trừ nó không tính đến nhiều trường hợp. Không có sử dụng trong việc có sáu đỉnh. – Jessy

6

Điều này hoạt động tốt miễn là bạn có hình thang và cạnh song song của nó được căn chỉnh với một trong các trục địa phương. Tôi khuyên bạn nên chơi xung quanh với Unity package của tôi.

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

bạn có thể viết ra những đỉnh nào chứa không? Tôi đã thử 'đỉnh = [Vec2 (-1, -1), Vec2 (-0,5, 1), Vec2 (0,5, 1), Vec2 (1, -1)]' 'shiftedPositions = [Vec2 (0, 0), Vec2 (0, 2), Vec2 (1, 2), Vec2 (2, 0)] 'và' width_heights = [Vec2 (2, 2), Vec2 (1, 2), Vec2 (1, 2) ', Vec2 (2, 2)]. Và mảnh của tôi trông giống như: 'gl_FragColor = texture2D (colormap, gl_TexCoord [0] .xy/width_heights.xy);' (Tôi phải sử dụng gl_TexCoord). Và nó chỉ đơn giản là không hoạt động. – velkyel

+0

Vec2 của bạn đều ổn. Tôi không nghĩ rằng tôi có thể cung cấp cho bạn bất cứ điều gì hữu ích hơn một dự án Unity; đó là tất cả những gì tôi thực sự biết ngay bây giờ. Hãy cho tôi biết nếu bạn cần giúp đỡ bằng cách sử dụng nó, hoặc nếu bạn có thể nghĩ ra một số cách khác để tôi giúp bạn. Tôi chắc chắn nhận được kết quả bạn đang theo đuổi. Điều quan trọng là di chuyển các tính toán chiều rộng/chiều cao từ mỗi đỉnh đến mỗi "dòng quét". Điều tốt nhất chúng tôi có thể làm là mỗi pixel, điều này quá mức cần thiết, nhưng đó là những gì GPU cung cấp. – Jessy

+1

Cảm ơn bạn đã trả lời. Điều này làm việc hoàn hảo cho tôi! –

2

Gần đây tôi đã tìm ra giải pháp chung cho vấn đề này đối với bất kỳ loại tứ giác nào. Các tính toán và GLSL có thể giúp đỡ. Có một bản demo hoạt động trong java (chạy trên Android), nhưng gọn nhẹ và dễ đọc và phải dễ dàng di chuyển đến sự hiệp nhất hoặc iOS: http://www.bitlush.com/posts/arbitrary-quadrilaterals-in-opengl-es-2-0

+0

tốt, nhưng nó không phải là những gì tôi đang tìm kiếm. Vui lòng đọc kỹ câu hỏi đầu tiên. Lập bản đồ quad thứ ba là KHÔNG những gì tôi muốn. – velkyel

+0

vâng, xấu của tôi, không bông cho bạn cần nó mà không cần chỉnh sửa phối cảnh – keith