2012-07-01 22 views
5

テクスチャコードの大部分を書き直しています。 GL_RGB8I、GL_RGB8UI、GL_RGB16I、GL_RGB16UI、GL_RGB32I、およびGL_RGB32UIのような特定の内部形式を指定できるようにしたいと考えています。これらのトークンはOpenGL 2には存在しません。OpenGL 2テクスチャ内部形式GL_RGB8I、GL_RGB32UIなど

glTexImage2Dの引数としてこれらの内部形式を指定すると、テクスチャが失敗します(テクスチャは白として表示されます)。エラーをチェックすると、私は[編集:] 1282( "無効な操作")を取得します。 OpenGLがまだglTexImage2DにOpenGL 2を使用しているので、呼び出しが失敗しているという意味です。明らかに、新しいバージョンを使用して成功する必要があります。 GL_RGB、GL_RGBA、(奇妙な)GL_RGB32F、GL_RGBA32Fなどの列挙型は、期待通りに機能します。

拡張機能にGLEWまたはGLeeを使用するように設定しました。他の場所で問題なくOpenGL 4呼び出しを使用できます(たとえば、glPatchParameteri、glBindFramebufferなど)。問題の列挙型は確実に存在します。完全性のために、glGetString(GL_VERSION)は "4.2.0"を返します。私の質問:これらの拡張ライブラリの1つにOpenGL 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

エラーをチェックすると、私は[EDITを取得:] 1282( "無効な操作")。 OpenGLがまだglTexImage2DにOpenGL 2を使用しているので、呼び出しが失敗しているという意味です。

OpenGL errorsはそれほど複雑ではありません。予期しない、サポートされていない、または範囲外の列挙型または値を渡すと、GL_INVALID_ENUM/VALUEがスローされます。内部形式として "17"をglTexImage2Dに渡すと、17は内部形式の有効な列挙型ではないため、GL_INVALID_ENUMになります。幅として103,422をglTexImage2Dに渡すと、GL_MAX_TEXTURE_2Dのサイズよりも103,422がかなり大きいため、GL_INVALID_VALUEが得られます。

GL_INVALID_OPERATIONは、常にの組み合わせに使用されます。は状態が間違っています。呼び出し元の関数と噛み合わないコンテキスト状態が以前に設定されているか、または2つ以上のパラメータが組み合わされて問題が発生しています。後者はあなたがここにいる場合です。

インプリメンテーションで整数テクスチャがまったくサポートされない場合は、内部フォーマットが有効なフォーマットではないため、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について言及していませんでした。上記のコードを変更するのは確かに有効ですが、整数テクスチャの場合は黒色になります(注: "data [i] =(unsigned char)(0);"を最初に128に変更してください)。これは、固定機能の解釈が「整数形式のベクトルに解決される」、すなわち固定機能の描画+ OpenGL 4のテクスチャ=未定義の動作と何か関係がありますか? – imallett

+0

@Ian:まず、整数テクスチャはGL 3ではなくGL 3です。第2に、整数テクスチャは固定関数では機能しません。シェーダを使用する必要があります。 –

+0

固定機能描画+整数テクスチャ!=センス;当然、浮動小数点GL 3、4テクスチャは正常に動作します。とにかく、すごく、ありがとう! – imallett

関連する問題