2012-12-18 31 views
8

मैं छवियों के साथ अपनी समस्या को समझाने की कोशिश करूंगा।बनावट ठीक से प्रदर्शित नहीं हो रही है - शायद निर्देशांक गलत हैं OpenGL, C++

जैसा कि आप देख सकते हैं, वहाँ अलग अलग रंग के साथ छवि के चारों ओर एक 2-पिक्सल चौड़ा सीमा है मुझे देखने के लिए सक्षम होने के लिए के लिए: तो यह एक परीक्षण बनावट मैं अपने ओपन आवेदन के लिए उपयोग कर रहा हूँ है यदि निर्देशांक मेरे आवेदन में ठीक तरह से सेट हैं।

मैं 9-सेल पैटर्न का उपयोग कर रहा हूं इसलिए मैं विशिष्ट बनावट निर्देशांक के साथ 9 क्वाड खींच रहा हूं। पहली नजर में सब कुछ पर ठीक काम करता है, लेकिन वहाँ एक बनावट प्रदर्शित साथ एक छोटी सी समस्या है:

enter image description here

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

यह है कि वे कैसे स्थापित कर रहे हैं है:

// Bottom left quad [1st quad] 
glBegin(GL_QUADS); 
    // Bottom left 
    glTexCoord2f(0.0f, 1.0);     
    glVertex2i(pos.x, pos.y + height); 

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

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

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

// Bottom middle quad [2nd quad] 
glBegin(GL_QUADS); 
    // Bottom left 
    glTexCoord2f(maxTexCoordBorderX, 1.0);   
    glVertex2i(pos.x + m_borderWidth, pos.y + height); 

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

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

    // Bottom right 
    glTexCoord2f((GLfloat)1.0 - maxTexCoordBorderX, 1.0); 
    glVertex2i(pos.x + width - m_borderWidth, pos.y + height); 
glEnd(); 

कि मैं maxTexCoordBorderX चर जो सीमा और छवि आकार के आधार पर की गणना का उपयोग कर रहा है आप देख सकते हैं। छवि चौड़ाई 32 और बॉर्डर चौड़ाई 2.

maxTexCoordBorderX = 2/32 = 0,0625

किसी को भी कृपया मदद कर सके है जानने जहां समस्या है के साथ साथ?

उत्तर

4

सबसे अधिक संभावना अपराधी यह है कि आप टेक्सेल केंद्रों पर नमूना नहीं दे रहे हैं। उदाहरण के लिए, यदि आपके पास 32x32 पिक्सेल बनावट है, तो टेक्स्टल-केंद्रों को 1/64 से ऑफसेट किया जाता है।

यहां 4x4 बनावट का एक मोटा आरेख है। वर्ग छवि के texels (या पिक्सल) हैं।

 
_________________1,1 
| | | | | 
| | | | | 
|___|___|___|___|_0.75 
| | | | | 
| | | | | 
|___|___|___|___|_0.5 
| | | | | 
| | | | | 
|___|___|___|___|_0.25 
| | | | | 
| X | | | | 
|___|___|___|___| 
0,0 | 0.5 | 1 
    0.25 0.75 

x = (0.125, 0.125) 

आप लाइनों में से एक पर नमूना हैं, तो आप ठीक दो texels है, जो होगा (आप रैखिक मिश्रण करने के लिए बनावट सेट नमूना है तो) आप एक औसत मूल्य देना बीच कोई मान मिल जाएगा। यदि आप सटीक टेक्स्ट मान का नमूना देना चाहते हैं, तो आपको टेक्साइल के केंद्र में यू, वी निर्दिष्ट करना होगा।

+0

जवाब जेसन के लिए धन्यवाद, लेकिन तुम मुझे समझा सकता है आप Texel केन्द्रों पर नमूने के द्वारा क्या मतलब था? –

+0

मैंने किसी न किसी आरेख के साथ अद्यतन किया है। – JasonD

+0

धन्यवाद जेसन, यह मेरी समस्या हल! –

-2

आप पूर्णांक और नाव का उपयोग करें ...

यही कारण है, यह भी जिस तरह से आप ओपन खिड़की पर छवि दिखा सकते हैं भी कुछ रंग प्रभाव दे सकता है हो सकता है।

+0

आपका मतलब है कि बनावट निर्देशांक इनट्स में फ्लोट्स और क्वाड 'वर्टिस' स्थिति में सेट हैं? मुझे नहीं लगता कि यह एक समस्या होनी चाहिए क्योंकि उनके पास एक दूसरे के साथ कुछ भी नहीं है ... –

+1

मुझे लगता है कि जीपीयू diff बना देगा। अगर आप यहां पढ़ते हैं: http://www.cs.sun.ac.za/~lvzijl/courses/rw778/grafika/OpenGLtuts/Big/graphicsnotes016.html आप देखेंगे (उदाहरण के लिए: प्रोजेक्टिव बनावट का उपयोग करके स्पॉटलाइट प्रभाव) कई कुछ गलत पाने के कारण।Http://free-tutorials.org -> ट्यूटोरियल -> लिनक्स प्रोग्रामिंग पर कुछ उदाहरण देखें। GL_NEAREST का उपयोग करने का प्रयास करें (देखें http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-2.1:-Buffers-and-Textures.html) –

+0

देखें कि मैं इसे कैसे हल करता हूं: http://stackoverflow.com/questions/11361583/gl-texture-rectangle-arb/11363905#11363905 –

4

आप एक बाड़ की समस्या में भाग ले रहे हैं। मैं यहाँ अपने बहुत समस्या के समाधान के जवाब दिए

https://stackoverflow.com/a/5879551/524368

+0

उत्तर के लिए धन्यवाद datenwolf, यह सहायक था! –