2012-07-01 15 views
5

मैं अपने टेक्स्टिंग कोड का एक बड़ा हिस्सा पुनः लिख रहा हूं। मैं कुछ आंतरिक प्रारूपों को निर्दिष्ट करने में सक्षम होना चाहता हूं: GL_RGB8I, GL_RGB8UI, GL_RGB16I, GL_RGB16UI, GL_RGB32I, और GL_RGB32UI। ये टोकन ओपनजीएल 2 में मौजूद नहीं हैं।ओपनजीएल 2 बनावट आंतरिक प्रारूप GL_RGB8I, GL_RGB32UI, आदि

glTexImage2D पर तर्क के रूप में इन आंतरिक स्वरूपों को निर्दिष्ट करते समय, बनावट विफल हो जाती है (बनावट सफेद के रूप में दिखाई देती है)। त्रुटियों की जांच करते समय, मुझे [EDIT:] 1282 ("अमान्य ऑपरेशन") मिलता है। मैं इसका मतलब यह लेता हूं कि ओपनजीएल अभी भी glTexImage2D के लिए ओपनजीएल 2 का उपयोग कर रहा है, और इसलिए कॉल विफल हो रहा है। जाहिर है, इसे सफल होने के लिए एक नए संस्करण का उपयोग करने की आवश्यकता होगी। GL_RGB, GL_RGBA, और (विचित्र रूप से) GL_RGB32F जैसे Gums, GL_RGBA32F अपेक्षित कार्य करता है।

मैं एक्सटेंशन के लिए GLEW या GLee का उपयोग करने के लिए कॉन्फ़िगर करता हूं। मैं ओपनजीएल 4 कॉल का उपयोग कहीं और समस्या के साथ नहीं कर सकता (उदा।, ग्लैचच पैरामीटर, ग्लिंडफ्रेमबफर, इत्यादि), और प्रश्न में enums निश्चित रूप से मौजूद हैं। पूर्णता के लिए, glGetString (GL_VERSION) "4.2.0" देता है। मेरा प्रश्न: क्या मैं ओपनजीएल 4.2 संस्करण का उपयोग करने के लिए इन एक्सटेंशन पुस्तकालयों में से एक को मजबूर कर सकता हूं? यदि हां, तो कैसे?

संपादित करें: कोड भी पोस्ट करने के लिए जटिल है, लेकिन यहाँ एक सरल, आत्म निहित उल्लास का उपयोग कर उदाहरण है कि यह भी समस्या को दर्शाता है है:

#include <GLee5_4/GLee.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <gl/glut.h> 
//For Windows 
#pragma comment(lib,"GLee.lib") 
#pragma comment(lib,"opengl32.lib") 
#pragma comment(lib,"glu32.lib") 
#pragma comment(lib,"glut32.lib") 

#include <stdlib.h> 
#include <stdio.h> 

const int screen_size[2] = {512,512}; 
#define TEXTURE_SIZE 64 

//Choose a selection. If you see black, then texturing is working. If you see red, then the quad isn't drawing. If you see white, texturing has failed. 
#define TYPE 1 

void error_check(void) { 
    GLenum error_code = glGetError(); 
    const GLubyte* error_string = gluErrorString(error_code); 
    (error_string==NULL) ? printf("%d = (unrecognized error--an extension error?)\n",error_code) : printf("%d = \"%s\"\n",error_code,error_string); 
} 

#if TYPE==1 //############ 8-BIT TESTS ############ 
    inline GLenum get_type(int which) { return (which==1)? GL_RGB8: GL_RGB; } //works 
#elif TYPE==2 
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA8:GL_RGBA; } //works 
#elif TYPE==3 
    inline GLenum get_type(int which) { return (which==1)? GL_RGB8UI: GL_RGB; } //doesn't work (invalid op) 
#elif TYPE==4 
    inline GLenum get_type(int which) { return (which==1)? GL_RGB8I: GL_RGB; } //doesn't work (invalid op) 
#elif TYPE==5 
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA8UI:GL_RGBA; } //doesn't work (invalid op) 
#elif TYPE==6 
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA8I:GL_RGBA; } //doesn't work (invalid op) 
#elif TYPE==7 //############ 16-BIT TESTS ############ 
    inline GLenum get_type(int which) { return (which==1)? GL_RGB16: GL_RGB; } //works 
#elif TYPE==8 
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA16:GL_RGBA; } //works 
#elif TYPE==9 
    inline GLenum get_type(int which) { return (which==1)? GL_RGB16UI: GL_RGB; } //doesn't work (invalid op) 
#elif TYPE==10 
    inline GLenum get_type(int which) { return (which==1)? GL_RGB16I: GL_RGB; } //doesn't work (invalid op) 
#elif TYPE==11 
    inline GLenum get_type(int which) { return (which==1)?GL_RGBA16UI:GL_RGBA; } //doesn't work (invalid op) 
#elif TYPE==12 
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA16I:GL_RGBA; } //doesn't work (invalid op) 
#elif TYPE==13 //############ 32-BIT TESTS ############ 
    inline GLenum get_type(int which) { return (which==1)? GL_RGB32: GL_RGB; } //token doesn't exist 
#elif TYPE==14 
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA32:GL_RGBA; } //token doesn't exist 
#elif TYPE==15 
    inline GLenum get_type(int which) { return (which==1)? GL_RGB32UI: GL_RGB; } //doesn't work (invalid op) 
#elif TYPE==16 
    inline GLenum get_type(int which) { return (which==1)? GL_RGB32I: GL_RGB; } //doesn't work (invalid op) 
#elif TYPE==17 
    inline GLenum get_type(int which) { return (which==1)?GL_RGBA32UI:GL_RGBA; } //doesn't work (invalid op) 
#elif TYPE==18 
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA32I:GL_RGBA; } //doesn't work (invalid op) 
#elif TYPE==19 //############ 32-BIT FLOAT ############ 
    inline GLenum get_type(int which) { return (which==1)? GL_RGB32F: GL_RGB; } //works 
#elif TYPE==20 
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA32F:GL_RGBA; } //works 
#endif 

GLuint texture; 
void create_texture(void) { 
    printf(" Status before texture setup: "); error_check(); 

    glGenTextures(1,&texture); 
    glBindTexture(GL_TEXTURE_2D,texture); 

    printf(" Status after texture created: "); error_check(); 

    GLenum data_type = GL_UNSIGNED_BYTE; 
    int data_length = TEXTURE_SIZE*TEXTURE_SIZE*4; //maximum number of channels, so it will work for everything 
    unsigned char* data = new unsigned char[data_length]; 
    for (int i=0;i<data_length;++i) { 
     data[i] = (unsigned char)(0); 
    }; 

    glTexImage2D(GL_TEXTURE_2D,0,get_type(1), TEXTURE_SIZE,TEXTURE_SIZE, 0,get_type(2),data_type,data); 

    printf(" Status after glTexImage2D: "); error_check(); 

    delete [] data; 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

    printf(" Status after texture filters defined: "); error_check(); 
} 

void keyboard(unsigned char key, int x, int y) { 
    switch (key) { 
     case 27: //esc 
      exit(0); 
      break; 
    } 
} 

void draw(void) { 
    glClearColor(1.0,0.0,0.0,1.0); //in case the quad doesn't draw 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

    glViewport(0,0,screen_size[0],screen_size[1]); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0,screen_size[0],0,screen_size[1]); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glBegin(GL_QUADS); 
    glTexCoord2f(0,0); glVertex2f(0,0); 
    glTexCoord2f(2,0); glVertex2f(screen_size[0],0); 
    glTexCoord2f(2,2); glVertex2f(screen_size[0],screen_size[1]); 
    glTexCoord2f(0,2); glVertex2f(0,screen_size[1]); 
    glEnd(); 

    glutSwapBuffers(); 
} 

int main(int argc, char* argv[]) { 
    glutInit(&argc,argv); 
    glutInitWindowSize(screen_size[0],screen_size[1]); 
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH); 
    glutCreateWindow("Texture Types - Ian Mallett"); 

    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 

    printf("Status after OpenGL setup: "); error_check(); 

    create_texture(); 

    printf("Status after texture setup: "); error_check(); 

    glutDisplayFunc(draw); 
    glutIdleFunc(draw); 
    glutKeyboardFunc(keyboard); 

    glutMainLoop(); 

    return 0; 
} 
+1

glTexImage2D कॉल पोस्ट करें, त्रुटि हो सकती है जो आप सोचते हैं। –

+0

यह भी सुनिश्चित करें कि 'glTexImage2D' को कॉल करने से पहले सभी त्रुटियों को संसाधित किया गया था, ताकि आप वहां से आने वाली त्रुटियों को देख सकें। –

+0

एक उदाहरण जोड़ा गया जो त्रुटि त्रुटि जांच के साथ समस्या का प्रदर्शन करता है। धन्यवाद, – imallett

उत्तर

8

जब त्रुटियों के लिए जाँच, मैं [संपादित मिल :] 1282 ("अमान्य ऑपरेशन")। मैं इसका मतलब यह लेता हूं कि ओपनजीएल अभी भी glTexImage2D के लिए ओपनजीएल 2 का उपयोग कर रहा है, और इसलिए कॉल विफल हो रहा है।

OpenGL errors समझने के लिए जटिल नहीं हैं। GL_INVALID_ENUM/VALUE फेंक दिए जाते हैं जब आप किसी ऐसे एनम या मान को पास करते हैं जो अप्रत्याशित, असमर्थित या बाहर की सीमा है। यदि आप glTexImage2D पर आंतरिक प्रारूप के रूप में "17" पास करते हैं, तो आपको GL_INVALID_ENUM मिल जाएगा, क्योंकि 17 आंतरिक प्रारूप के लिए मान्य एनम संख्या नहीं है। यदि आप 0,की चौड़ाई के रूप में 103,422 पास करते हैं, तो आपको GL_INVALID_VALUE मिलेगा, क्योंकि 103,422 लगभग GL_MAX_TEXTURE_2D के आकार से लगभग निश्चित रूप से बड़ा है।

GL_INVALID_OPERATION हमेशा संयोजन के लिए गलत है जो गलत हो जाता है। या तो पहले कुछ सेट स्टेटस सेट है जो आपके द्वारा कॉल किए जा रहे फ़ंक्शन के साथ जाल नहीं करता है, या संयुक्त या दो या अधिक पैरामीटर संयुक्त समस्या पैदा कर रहे हैं। उत्तरार्द्ध वह मामला है जो आपके पास है।

यदि आपके कार्यान्वयन में पूर्णांक बनावट का समर्थन नहीं किया गया है, तो आपको INVALID_ENUM मिलेगा (क्योंकि आंतरिक प्रारूप मान्य प्रारूप नहीं है)। INVALID_OPERATION प्राप्त करना मतलब है कि कुछ और गलत है।

अर्थात्, इस:

glTexImage2D(GL_TEXTURE_2D,0,get_type(1), TEXTURE_SIZE,TEXTURE_SIZE, 0,get_type(2),data_type,data); 

आपका get_type(2) कॉल GL_RGB या GL_RGBA सभी मामलों में वापस आती है। हालांकि, अभिन्न image formats का उपयोग करते समय, आप pixel transfer format with _INTEGER at the end का उपयोग करें।

तो अपने get_type(2) जरूरतों इस होना करने के लिए:

inline GLenum get_type(int which) { return (which==1)? GL_RGB16UI: GL_RGB_INTEGER; } 

और इसी तरह अन्य अभिन्न छवि प्रारूप के लिए।

+0

मैं पहले लिंक से काम कर रहा था, ज्यादातर, जिसमें _INTEGER का उल्लेख नहीं किया गया था। उपरोक्त कोड को बदलना निश्चित रूप से काम करता है, लेकिन पूर्णांक बनावट के लिए, मुझे काला दिखाई देता है (नोट, बदलें "डेटा [i] = (हस्ताक्षरित चार) (0);" पहले 128 तक)। क्या इसमें निश्चित फ़ंक्शन की व्याख्या के साथ कुछ भी करना है "अभिन्न स्वरूप पूर्णांक के वेक्टर को हल करेंगे" - यानी, फिक्स्ड फ़ंक्शन ड्राइंग + ओपनजीएल 4 बनावट = अपरिभाषित व्यवहार? – imallett

+0

@Ian: सबसे पहले, पूर्णांक बनावट जीएल 3 हैं, जीएल 4 नहीं। दूसरा, पूर्णांक बनावट निश्चित फ़ंक्शन के साथ काम नहीं करती है; आपको उनके साथ शेडर्स का उपयोग करना होगा। –

+0

मुझे यह स्पष्ट करना चाहिए कि मेरा मतलब था: फिक्स्ड फ़ंक्शन ड्राइंग + पूर्णांक बनावट! = भावना; स्वाभाविक रूप से, फ्लोटिंग पॉइंट जीएल 3, 4 टेक्सचर ठीक काम करते हैं। वैसे भी, कमाल, धन्यवाद! – imallett

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