2012-09-13 13 views
5

मैं जीएलएसएल में सही 2 डी एफ़िन बनावट मैपिंग कोड करने की कोशिश कर रहा हूं।सही glsl affine बनावट मानचित्रण

स्पष्टीकरण:

... इस छवियों से कोई भी मेरी प्रयोजनों के लिए सही है। दाएं (सही लेबल लेबल) में परिप्रेक्ष्य सुधार है जो मैं नहीं चाहता हूं। तो यह: Getting to know the Q texture coordinate समाधान (आगे के सुधार के बिना) वह नहीं है जिसे मैं ढूंढ रहा हूं।

मैं बस "खिंचाव" बनावट चतुर्भुज के अंदर, कुछ इस तरह करना चाहते हैं:

enter image description here

लेकिन दो त्रिकोण से बना। कोई सलाह (जीएलएसएल) कृपया?

+1

निचले लोगों के पीछे ऊपरी भाग हैं, या आप केवल क्वाड की वर्टेक्स स्थितियों को स्केल कर रहे हैं? –

+0

स्केलिंग, सभी निर्देशांक 2 डी में हैं (मैंने अभी अपनी पोस्ट में संशोधन किया है) – velkyel

उत्तर

-2

जवाब के लिए धन्यवाद, लेकिन प्रयोग करने के बाद मैं एक समाधान मिल गया। बाईं तरफ

दो त्रिकोण यूवी (strq) के अनुसार सही पर this और दो त्रिकोण इस परिप्रेक्ष्य सुधार के संस्करण modifed कर रहे हैं।

नंबर और शेडर:

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 शेडर का उपयोग कर गाया जाता है (बाईं ओर निश्चित पाइपलाइन है):

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

तो .. केवल यू परिप्रेक्ष्य है और वी रेखीय है ।

+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 

सी #:

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

क्या आप लिख सकते हैं कि कौन से शिखर सम्मिलित हैं? मैंने 'vertices = [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)] 'और' width_heights = [Vec2 (2, 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

आपका वीसी 2 सब ठीक है। मुझे नहीं लगता कि मैं आपको एकता परियोजना से ज्यादा उपयोगी प्रदान कर सकता हूं; यह सब मुझे वास्तव में अभी पता है। अगर आपको इसका उपयोग करने में मदद की ज़रूरत है, तो मुझे बताएं, या अगर आप मेरी मदद करने के लिए किसी अन्य तरीके से सोच सकते हैं। मैं निश्चित रूप से आपके परिणाम के बाद प्राप्त करता हूं। चाबी/ऊंचाई गणना प्रति-वर्टेक्स से प्रति-"स्कैन लाइन" तक ले जाने की कुंजी है। सबसे अच्छा हम कर सकते हैं प्रति पिक्सेल है, जो ओवरकिल है, लेकिन यही एक जीपीयू प्रदान करता है। – Jessy

+1

आपके उत्तर के लिए धन्यवाद। यह मेरे लिए पूरी तरह से काम किया! –

2

मैं हाल ही में किसी भी प्रकार के चतुर्भुज के लिए इस समस्या के सामान्य समाधान के साथ आने में कामयाब रहा। गणना और जीएलएसएल शायद मदद की। जावा (जो एंड्रॉइड पर चलता है) में एक कामकाजी डेमो है, लेकिन कॉम्पैक्ट और पठनीय है और इसे एकता या आईओएस के लिए आसानी से पोर्टेबल होना चाहिए: http://www.bitlush.com/posts/arbitrary-quadrilaterals-in-opengl-es-2-0

+0

अच्छा है, लेकिन यह वह नहीं है जिसे मैं ढूंढ रहा था। ध्यान से पहले सवाल पढ़ें। तीसरा क्वाड मैपिंग वह नहीं है जो मैं चाहता था। – velkyel

+0

हां, मेरा बुरा, परिप्रेक्ष्य सुधार के बिना आपको इसकी आवश्यकता नहीं है – keith

0

टेस्सेलेशन इस समस्या को हल करता है। उप-विभाजित क्वाड वर्टेक्स पिक्सल को इंटरपोल करने के लिए संकेत जोड़ता है।

इस लिंक को देखें। https://www.youtube.com/watch?v=8TleepxIORU&feature=youtu.be

संबंधित मुद्दे