OpenGL 2纹理内部格式GL_RGB8I、GL_RGB32UI等

OpenGL 2纹理内部格式GL_RGB8I、GL_RGB32UI等,opengl,textures,Opengl,Textures,我正在重写大部分纹理代码。我希望能够指定某些内部格式:GL_RGB8I、GL_RGB8UI、GL_RGB16I、GL_RGB16UI、GL_RGB32I和GL_RGB32UI。这些标记在OpenGL 2中不存在 将这些内部格式指定为glTexImage2D的参数时,纹理生成失败(纹理显示为白色)。检查错误时,我得到[EDIT:]1282(“无效操作”)。我认为这意味着OpenGL仍然在使用OpenGL2来处理glTexImage2D,因此调用失败。显然,它需要使用更新的版本才能成功。像GL_RG

我正在重写大部分纹理代码。我希望能够指定某些内部格式:GL_RGB8I、GL_RGB8UI、GL_RGB16I、GL_RGB16UI、GL_RGB32I和GL_RGB32UI。这些标记在OpenGL 2中不存在

将这些内部格式指定为glTexImage2D的参数时,纹理生成失败(纹理显示为白色)。检查错误时,我得到[EDIT:]1282(“无效操作”)。我认为这意味着OpenGL仍然在使用OpenGL2来处理glTexImage2D,因此调用失败。显然,它需要使用更新的版本才能成功。像GL_RGB、GL_RGBA和(奇怪的)GL_RGB32F、GL_RGBA32F这样的枚举按预期工作

我将配置为使用GLEW或GLee进行扩展。我可以在其他地方使用OpenGL4调用而不会出现问题(例如,glPatchParameteri、glBindFramebuffer等),而且有问题的枚举肯定存在。为完整起见,glGetString(GL_版本)返回“4.2.0”。我的问题是:我可以强制其中一个扩展库使用OpenGL 4.2版本吗?如果是,怎么做

编辑:代码太复杂,无法发布,但下面是一个使用GLee的简单、自包含的示例,它也演示了问题:

#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;
}
#包括
#包括
#包括
#包括
//窗户
#pragma注释(lib,“GLee.lib”)
#pragma注释(lib,“opengl32.lib”)
#pragma注释(lib,“glu32.lib”)
#pragma注释(lib,“glut32.lib”)
#包括
#包括
const int screen_size[2]={512512};
#定义纹理大小64
//选择一个选项。如果您看到黑色,则纹理正在工作。如果看到红色,则表示四边形没有绘制。如果看到白色,则纹理处理失败。
#定义类型1
无效错误检查(无效){
GLenum error_code=glGetError();
常量GLubyte*错误字符串=gluErrorString(错误代码);
(error\u string==NULL)?printf(“%d=(无法识别的错误--扩展错误?)\n”,错误代码):printf(“%d=\%s\”\n,错误代码,错误字符串);
}
#如果类型==1//八位测试############
内联GLenum get_type(int which){return(which==1)?GL_RGB8:GL_RGB;}//有效
#elif类型==2
内联GLenum get_type(int which){return(which==1)?GL_RGBA8:GL_RGBA;}//有效
#elif类型==3
内联GLenum get_type(int which){return(which==1)?GL_RGB8UI:GL_RGB;}//不工作(操作无效)
#elif类型==4
内联GLenum get_type(int which){return(which==1)?GL_RGB8I:GL_RGB;}//不工作(操作无效)
#elif类型==5
内联GLenum get_type(int which){return(which==1)?GL_RGBA8UI:GL_RGBA;}//不工作(操作无效)
#elif类型==6
内联GLenum get_type(int which){return(which==1)?GL_RGBA8I:GL_RGBA;}//不工作(操作无效)
#elif类型==7//16位测试############
内联GLenum get_type(int which){return(which==1)?GL_RGB16:GL_RGB;}//有效
#elif类型==8
内联GLenum get_type(int which){return(which==1)?GL_RGBA16:GL_RGBA;}//有效
#elif类型==9
内联GLenum get_type(int which){return(which==1)?GL_RGB16UI:GL_RGB;}//不工作(操作无效)
#elif类型==10
内联GLenum get_type(int which){return(which==1)?GL_RGB16I:GL_RGB;}//不工作(操作无效)
#elif类型==11
内联GLenum get_type(int which){return(which==1)?GL_RGBA16UI:GL_RGBA;}//不工作(操作无效)
#elif类型==12
内联GLenum get_type(int which){return(which==1)?GL_RGBA16I:GL_RGBA;}//不工作(操作无效)
#elif类型==13//32位测试############
内联GLenum get_type(int which){return(which==1)?GL_RGB32:GL_RGB;}//令牌不存在
#elif类型==14
内联GLenum get_type(int which){return(which==1)?GL_RGBA32:GL_RGBA;}//令牌不存在
#elif类型==15
内联GLenum get_type(int which){return(which==1)?GL_RGB32UI:GL_RGB;}//不工作(操作无效)
#elif类型==16
内联GLenum get_type(int which){return(which==1)?GL_RGB32I:GL_RGB;}//不工作(操作无效)
#elif类型==17
内联GLenum get_type(int which){return(which==1)?GL_RGBA32UI:GL_RGBA;}//不工作(操作无效)
#elif类型==18
内联GLenum get_type(int which){return(which==1)?GL_RGBA32I:GL_RGBA;}//不工作(操作无效)
#elif类型==19//32位浮点############
内联GLenum get_type(int which){return(which==1)?GL_RGB32F:GL_RGB;}//有效
#elif类型==20
内联GLenum get_type(int which){return(which==1)?GL_RGBA32F:GL_RGBA;}//有效
#恩迪夫
胶合结构;
void创建纹理(void){
printf(“纹理设置前的状态:”;错误检查();
glGenTextures(1,&纹理);
glBindTexture(GL_TEXTURE_2D,纹理);
printf(“创建纹理后的状态:”;错误检查();
GLenum数据类型=无符号字节;
int data\u length=TEXTURE\u SIZE*TEXTURE\u SIZE*4;//最大通道数,因此它适用于所有情况
无符号字符*数据=新的无符号字符[数据长度];
对于(int i=0;i
当检查错误时,我得到[EDIT:]1282(“无效操作”)。我认为这意味着OpenGL仍在使用OpenGL 2 for glTexImage2D,因此调用失败

没有那么复杂,难以理解。
GL\u INVALID\u ENUM/VALUE
在传递意外、不受支持或超出范围的枚举或值时抛出。如果传递“17”作为
glTexImage2D
的内部格式,您将获得
GL_INVALID_ENUM
,因为17不是内部格式的有效枚举数。如果将103422作为宽度传递给
glTexImage2D
,您将获得
GL_INVALID_值,因为103422几乎肯定大于
GL_MAX_TEXTURE_2D
的si泽

GL\u无效\u操作
总是用于错误状态的组合。或者以前设置的某些上下文状态与您调用的函数不匹配,或者两个或多个参数组合在一起会导致问题。后面就是您在这里的情况

如果你的实施
glTexImage2D(GL_TEXTURE_2D,0,get_type(1), TEXTURE_SIZE,TEXTURE_SIZE, 0,get_type(2),data_type,data);
inline GLenum get_type(int which) { return (which==1)? GL_RGB16UI: GL_RGB_INTEGER; }