2010-01-29 10 views
5

में डायग्नोस्टिक टेक्स्ट प्रदर्शित करने का सबसे अच्छा तरीका मेरे पास एक कलात्मक ओपनगल ऐप है जिस पर मैं काम कर रहा हूं। अंतिम उत्पाद को टेक्स्ट प्रदर्शित करने की आवश्यकता नहीं होगी। लेकिन विकास के दौरान मैं नैदानिक ​​उद्देश्यों के लिए डेटा की विषम बिट्स प्रदर्शित करना चाहता हूं, जैसे फ्रेमरेट, ऑब्जेक्ट गिनती। मैं पाठ के प्रतिपादन को नाटकीय रूप से कोड के प्रदर्शन को कम नहीं करना चाहता हूं।विंडोज ओपनजीएल

मुझे पता है यह एक हल्का व्यक्तिपरक सवाल है, लेकिन सभी एक ही मैं अपने विचारों को

उत्तर

1

यदि आपको केवल विकास के दौरान इसकी आवश्यकता है, तो आप Win32 फ़ंक्शन OutputDebugString() को देखना चाहेंगे। यह पाठ को एक संलग्न डीबगर को भेजता है और आपके मौजूदा कार्यक्रम में कोई बदलाव की आवश्यकता नहीं है। आप कंसोल एप्लिकेशन के रूप में अपना प्रोग्राम भी बना सकते हैं और टेक्स्ट को stdout (printf, std :: cout) पर लिख सकते हैं। यह कस्टम ओपनजीएल टेक्स्ट रेंडरर के रूप में उतना सुंदर नहीं हो सकता है, लेकिन यह जितना आसान हो उतना आसान है।

7

मैं सिर्फ gl_line पुरातन का उपयोग कर एक ओपन पाठ रेंडरर लिखा था की सराहना करेंगे कि अगर सूट अपनी आवश्यकताओं:

#ifndef SIMPLETEXT_H 
#define SIMPLETEXT_H 

#include <GL/gl.h> 

namespace SimpleText { 

    // internal vertex 
    union vertex { 
     float data[3]; 
    }; 

    // use 15 verts to hold all possible letters 
    // 0 - 1 - 2 
    // 3 - 4 - 5 
    // 6 - 7 - 8 
    // 9 - 10- 11 
    // 12- 13- 14 
    vertex verts[15] = { 
     {0, 4, 0}, {1, 4, 0}, {2, 4, 0}, 
     {0, 3, 0}, {1, 3, 0}, {2, 3, 0}, 
     {0, 2, 0}, {1, 2, 0}, {2, 2, 0}, 
     {0, 1, 0}, {1, 1, 0}, {2, 1, 0}, 
     {0, 0, 0}, {1, 0, 0}, {2, 0, 0} 
    }; 

    // start/end char values 
    const int START = 33; 
    const int END = 90; 

    // size of the window (assumed square) 
    // increase this to decrease the size of text 
    const int WINDOW_EXTENT = 300; 

    // use index arrays to create letters 
    unsigned int letters[END - START + 1][15] = { 
     {4, 1, 7, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // ! 
     {4, 1, 4, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // " 
     {8, 0, 12, 2, 14, 3, 5, 9, 11, 0, 0, 0, 0, 0, 0},  // # 
     {8, 2, 3, 3, 11, 11, 12, 1, 13, 0, 0, 0, 0, 0, 0}, // $ 
     {14, 2, 12, 0, 3, 3, 1, 1, 0, 11, 13, 13, 14, 14, 11}, // % 
     {14, 14, 3, 3, 1, 1, 7, 7, 9, 9, 12, 12, 13, 13, 11}, // & 
     {2, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // ' 
     {6, 1, 3, 3, 9, 9, 13, 0, 0, 0, 0, 0, 0, 0, 0},  // (
     {6, 1, 5, 5, 11, 11, 13, 0, 0, 0, 0, 0, 0, 0, 0},  //) 
     {6, 0, 8, 6, 2, 1, 7, 0, 0, 0, 0, 0, 0, 0, 0},  // * 
     {4, 6, 8, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // + 
     {2, 10, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // , 
     {2, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // - 
     {8, 12, 13, 13, 10, 10, 9, 9, 12, 0, 0, 0, 0, 0, 0}, // . 
     {2, 2, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  ///
     {10, 0, 2, 2, 14, 14, 12, 12, 0, 0, 14, 0, 0, 0, 0}, // 0 
     {6, 3, 1, 1, 13, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0},  // 1 
     {10, 3, 1, 1, 5, 5, 8, 8, 12, 12, 14, 0, 0, 0, 0}, // 2 
     {12, 0, 1, 1, 5, 5, 11, 11, 13, 13, 12, 8, 7, 0, 0}, // 3 
     {6, 14, 2, 2, 6, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0},  // 4 
     {12, 2, 0, 0, 6, 6, 7, 7, 11, 11, 13, 13, 12, 0, 0}, // 5 
     {14, 2, 1, 1, 3, 3, 12, 12, 13, 13, 11, 11, 7, 7, 6}, // 6 
     {4, 0, 2, 2, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // 7 
     {12, 1, 3, 3, 11, 11, 13, 13, 9, 9, 5, 5, 1, 0, 0}, // 8 
     {10, 2, 1, 1, 3, 3, 7, 7, 8, 2, 14, 0, 0, 0, 0},  // 9 
     {4, 1, 4, 10, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // : 
     {4, 1, 4, 10, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // ; 
     {4, 5, 6, 6, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // < 
     {4, 5, 3, 9, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // = 
     {4, 3, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // > 
     {8, 3, 1, 1, 5, 5, 7, 7, 10, 0, 0, 0, 0, 0, 0},  // ? 
     {14, 4, 7, 7, 8, 8, 5, 5, 1, 1, 3, 3, 9, 9, 14},  // @ 
     {10, 1, 6, 1, 8, 6, 12, 8, 14, 6, 8, 0, 0, 0, 0},  // A 
     {14, 0, 12, 0, 5, 5, 7, 7, 6, 7, 11, 11, 13, 13, 12}, // B 
     {10, 2, 1, 1, 3, 3, 9, 9, 13, 13, 14, 0, 0, 0, 0}, // C 
     {12, 0, 1, 1, 5, 5, 11, 11, 13, 13, 12, 12, 0, 0, 0}, // D 
     {8, 0, 12, 0, 2, 6, 7, 12, 14, 0, 0, 0, 0, 0, 0},  // E 
     {6, 0, 12, 0, 2, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0},  // F 
     {14, 2, 1, 1, 3, 3, 9, 9, 13, 13, 11, 11, 8, 8, 7}, // G 
     {6, 0, 12, 6, 8, 2, 14, 0, 0, 0, 0, 0, 0, 0, 0},  // H 
     {6, 0, 2, 1, 13, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0},  // I 
     {8, 1, 2, 2, 11, 11, 13, 13, 9, 0, 0, 0, 0, 0, 0}, // J 
     {6, 0, 12, 6, 2, 6, 14, 0, 0, 0, 0, 0, 0, 0, 0},  // K 
     {4, 0, 12, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // L 
     {8, 0, 12, 0, 7, 7, 2, 2, 14, 0, 0, 0, 0, 0, 0},  // M 
     {6, 0, 12, 0, 14, 14, 2, 0, 0, 0, 0, 0, 0, 0, 0},  // N 
     {12, 1, 5, 5, 11, 11, 13, 13, 9, 9, 3, 3, 1, 0, 0}, // O 
     {10, 0, 12, 0, 1, 1, 5, 5, 7, 7, 6, 0, 0, 0, 0},  // P 
     {12, 0, 12, 12, 13, 13, 11, 11, 2, 2, 0, 10, 14, 0, 0}, // Q 
     {12, 0, 12, 0, 1, 1, 5, 5, 7, 7, 6, 7, 14, 0, 0},  // R 
     {14, 2, 1, 1, 3, 3, 6, 6, 8, 8, 11, 11, 13, 13, 12}, // S 
     {4, 0, 2, 1, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // T 
     {8, 0, 9, 9, 13, 13, 11, 11, 2, 0, 0, 0, 0, 0, 0}, // U 
     {4, 0, 13, 13, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // V 
     {8, 0, 12, 12, 1, 1, 14, 14, 2, 0, 0, 0, 0, 0, 0}, // W 
     {4, 0, 14, 2, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // X 
     {6, 0, 7, 7, 2, 7, 13, 0, 0, 0, 0, 0, 0, 0, 0},  // Y 
     {6, 0, 2, 2, 12, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0}  // Z 
    }; 

} 

// Draws a string of length <len> at an <x>/<y> position on the screen, optionally with a <shadow> 
// The screen is set up to be 0,0 at the lower left and 150,150 at the upper right for positioning 
// by default. 
static void DrawText(const char * string, int len, float x, float y, bool shadow = false) { 
    if (len <= 0) return; 

    glPushMatrix(); 
    glLoadIdentity(); 

    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 

    glLoadIdentity(); 
    glOrtho(0, SimpleText::WINDOW_EXTENT, 0, SimpleText::WINDOW_EXTENT, -10, 10); 

    glMatrixMode(GL_MODELVIEW); 

    glBindTexture(GL_TEXTURE_2D, 0); 

    glVertexPointer(3, GL_FLOAT, 0, SimpleText::verts); 
    glEnableClientState(GL_VERTEX_ARRAY); 

    char temp = 0; 

    // draw first copy if we need a shadow 
    if (shadow) { 
     glTranslatef(x + 0.3, y - 0.5, 0); 
     glColor4f(0.0f, 0.0f, 0.0f, 1.0f); 

     for (int i = 0; i < len; i++) { 
     temp = string[i]; 
     temp = (temp < 97) ? temp : temp - 32; 
     if (temp >= SimpleText::START && temp <= SimpleText::END) { 

      glDrawElements(
       GL_LINES, 
       SimpleText::letters[temp - SimpleText::START][0], 
       GL_UNSIGNED_INT, 
       &(SimpleText::letters[temp - SimpleText::START][1]) 
      ); 
     } 

     glTranslatef(2.7f, 0, 0); 
     } 
    } 

    glLoadIdentity(); 
    glTranslatef(x, y, 0); 
    glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 

    // draw regular text 
    for (int i = 0; i < len; i++) { 
     temp = string[i]; 
     temp = (temp < 97) ? temp : temp - 32; 
     if (temp >= SimpleText::START && temp <= SimpleText::END) { 

     glDrawElements(
      GL_LINES, 
      SimpleText::letters[temp - SimpleText::START][0], 
      GL_UNSIGNED_INT, 
      &(SimpleText::letters[temp - SimpleText::START][1]) 
     ); 
     } 

     glTranslatef(2.7f, 0, 0); 
    } 

    glDisableClientState(GL_VERTEX_ARRAY); 


    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 

    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix(); 
} 

#endif 
+0

मुझे ध्यान रखना चाहिए कि इसका परीक्षण लिनक्स और विंडोज पर काम करने का परीक्षण किया गया है और शायद कुछ भी उचित रूप से अच्छी तरह से काम करना चाहिए। मैंने प्रदर्शन का परीक्षण नहीं किया है लेकिन यह अधिकांश वातावरण के तहत उचित होना चाहिए। –

+0

पोस्टर ने उल्लेख किया कि प्रदर्शन एक मुद्दा था। क्या एक char [] बफर में आवश्यक टेक्स्ट को स्प्रिंटफ करना आसान नहीं होगा और फिर ओपनजीएल के अंतर्निर्मित टेक्स्ट-डिस्प्लेिंग फ़ंक्शंस (GLRasterPos, glutBitmapCharacter) का उपयोग करना आसान नहीं होगा? इस तरह से अधिक प्राचीन, और शायद कम प्रदर्शन आक्रामक है। – AndyG

+1

यह उन सिस्टमों के लिए डिज़ाइन किया गया था जो बाह्य पुस्तकालयों या क्रॉस-प्लेटफ़ॉर्म ओएस कोड के बारे में चिंता किए बिना त्वरित डीबग टेक्स्ट चाहते थे। टेक्स्ट प्रदर्शित करने के लिए निश्चित रूप से बेहतर तरीके हैं लेकिन जब आपको स्क्रीन पर कुछ प्राप्त करने की आवश्यकता होती है तो यह देखने के लिए कि क्या काम चल रहा है, यह काम ठीक है। उस ने कहा कि ओपनजीएल में 'बिल्ट-इन' टेक्स्ट प्रतिपादन नहीं है। जीएलयूटी में एक टेक्स्ट रेंडरिंग इंटरफ़ेस है और ओएस कुछ मामलों में सुविधाएं प्रदान करता है (glXUseXFont या wglFontBitmaps) लेकिन इसका शुद्ध सी ++ और ओपनजीएल कॉल का लाभ है। –

1

यह देखते हुए कि आप विंडोज़ पर ऐसा कर रहे हैं, चीजों को संभालने का आसान तरीका wglUseFontBitmaps का उपयोग डिस्प्ले सूची में अक्षरों का एक सेट लोड करने के लिए करना है, फिर पाठ को आकर्षित करने के लिए glRasterPos2i और glCallLists स्ट्रिंग खींचने के लिए। यदि आप डायग्नोस्टिक्स की तुलना में कुछ फैनसीयर चाहते थे, तो आप थोड़ा फैनसीयर प्राप्त करने के लिए wglUseFontOutlines का उपयोग कर सकते हैं, जैसे 2.5 डी (एक्स्ट्राउड) टेक्स्ट बनाना।

0

8x8 CP437 ग्लिफ पकड़ो और 128x128 बनावट में उन्हें (ASCII क्रम में) चिपकाएं। चूंकि वे कसकर पैक कर रहे हैं, बीलिनर फ़िल्टरिंग को चालू करना सुनिश्चित करें या अन्यथा आप आसन्न ग्लिफ में खून बहेंगे।