2012-12-18 37 views
9

बहुत समय पहले मुझे एक बनावट प्रदर्शित करने में कोई समस्या नहीं थी क्योंकि मैं टेक्सास के केंद्रों के बजाय बनावट के किनारों के रूप में टेक्सल्स के किनारों का उपयोग कर रहा था। यह, रैखिक मिश्रण के संयोजन में बनावट द्वारा दिए गए शुद्ध रंगों के बजाय रंगों का एक चिकना परिणाम देता है।टेक्साल केंद्रों पर नमूना उचित परिणाम नहीं देता है, ओपनजीएल, सी ++

मुझे यहां दिए गए सलाहों के लिए धन्यवाद, मैंने सोचा कि मेरी समस्या हल हो गई है क्योंकि मैंने टेक्सास के केंद्रों को निर्देशांक के रूप में उपयोग करना शुरू किया था, लेकिन यह केवल एक मामले में काम करता था और मुझे नहीं पता कि केवल उस मामले में क्यों।

फिर मैं कुछ तस्वीरें दिखाऊंगा।

2 पिक्सल के सीमा के साथ एक बनावट मैं उपयोग कर रहा हूँ (32x32 पिक्सल) है:

enter image description here

मेरी पूरी वस्तु है कि तैयार की जा रही 9 quads के होते हैं, लेकिन वे (केवल एक बनावट का उपयोग मैंने दिखाया)। उनमें से एक मेरी समस्या के लिए एक स्पष्टीकरण के रूप में काम करेगा:

enter image description here

मुझे लगता है कि यह अच्छी तरह से दिखाई दे रहा है कि कि ट्रैक्टर के रंग ठीक से बनावट के अनुसार सेट नहीं हैं।

यह सम्मिश्रण के साथ एक समस्या की तरह लग रहा है, लेकिन मैं texels 'केन्द्रों का इस्तेमाल किया है निर्देशांक बनावट स्थापित करने के लिए इस तरह,:

glBegin(GL_QUADS); 
    // Bottom left 
    glTexCoord2f(0.0 + texelCentersOffset, maxTexCoordBorderY + texelCentersOffset); 
    glVertex2i(pos.x, pos.y + height - m_borderWidth); 

    // Top left 
    glTexCoord2f(0.0 + texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset); 
    glVertex2i(pos.x, pos.y + m_borderWidth); 

    // Top right 
    glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset); 
    glVertex2i(pos.x + m_borderWidth, pos.y + m_borderWidth); 

    // Bottom right 
    glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, maxTexCoordBorderY + texelCentersOffset); 
    glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth); 
glEnd(); 

स्पष्टीकरण के लिए:

m_borderWidth = 2

maxTexCoordBorderX = maxTexCoordBorderY = 2/32 = 0.0625

texelCentersOffset = 1/64 = 0.015625

क्या कोई मुझे बता सकता है कि मैंने जो लिखा है उसमें क्या गलत है?

EDIT1:

यहाँ मेरी बनावट के लिए सेटिंग्स हैं:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
       GL_LINEAR_MIPMAP_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 
        GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 
        GL_REPEAT); 
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, m_width, m_height, 
        GL_RGBA, GL_UNSIGNED_BYTE, pixmap); 

जब मैं GL_NEAREST को GL_LINEAR से बदलने के लिए, यह ठीक से काम करता है ताकि यह स्पष्ट रूप से सम्मिश्रण साथ एक समस्या है, लेकिन अभी भी समझ नहीं यह गलत क्यों है।

EDIT2:

जब मैं ट्रैक्टर की ऊंचाई बढ़ाने के रूप में एक ही या बनावट की ऊंचाई से भी बड़ा हो सकता है, यह किसी भी बनावट निर्देशांक बदले बिना सही ढंग से काम करता है।

+0

आप अपना प्रक्षेपण और मॉडलव्यू मैट्रिक्स कहां सेट करते हैं? 'Pos' का मूल्य क्या है? – genpfault

+0

@genpfault pos.x और pos।y 0 हैं इसलिए उन्हें छोड़ा जा सकता है। मैट्रिस इस तरह की शुरुआत में सेट हैं: glViewport (0, 0, चौड़ाई, ऊंचाई); // वर्तमान व्यूपोर्ट रीसेट करें glMatrixMode (GL_PROJECTION); // प्रक्षेपण मैट्रिक्स का चयन करें glLoadIdentity(); \t \t \t \t \t \t \t \t \t // प्रोजेक्शन मैट्रिक्स \t glOrtho (0.0, चौड़ाई, ऊंचाई, 0.0, 0.0, 1.0) रीसेट; glMatrixMode (GL_MODELVIEW); \t \t \t \t \t \t // Modelview मैट्रिक्स glLoadIdentity() का चयन करें; \t \t \t \t \t \t \t \t \t // Modelview मैट्रिक्स –

+0

रीसेट आप कोने के Texel केन्द्रों आवंटित करने के लिए कोशिश नहीं करनी चाहिए। आप वास्तव में क्या चाहते हैं कि रेक्सराइजेशन के बाद * परिणामी टुकड़ों पर केंद्रित होना चाहिए। मैंने उत्तर के माध्यम से एक सुंदरता (चित्रों के साथ व्याख्या करने के लिए) लिखा है, शायद इसे पढ़ने से आपको समझने में मदद मिलेगी: http://stackoverflow.com/a/11458037/1236185 – Tim

उत्तर

1

ऐसा लगता है कि जब आप बनावट के आकार से कम क्वाड आकार सेट करते हैं। यह एक mipmap का उपयोग कर बनावट नमूना चाहिए।

मिपमैप्स 4 टेक्सल ब्लॉक औसत से बनाए जाते हैं। इसलिए, जब आप mipmap का नमूना देते हैं तो आपको एक से अधिक टेक्स्ट से जानकारी मिलती है। इसलिए, अपने क्वाड को बनावट से छोटा होने के कारण इसे एक मिपमैप का नमूना देना होगा और आपको बनावट का खून बह रहा है। मिपमैपिंग बंद करें और मेरा अनुमान है कि यह दूर जायेगा।

+0

देर से प्रतिक्रिया के लिए खेद है, लेकिन हाँ, यह एक समस्या थी। धन्यवाद, टॉक्स! –