OpenGL 2 Texture Internal Formats GL_RGB8I, GL_RGB32UI, etc

前端 未结 1 969
Happy的楠姐
Happy的楠姐 2020-11-30 13:14

I\'m rewriting a large part of my texturing code. I would like to be able to specify certain internal formats: GL_RGB8I, GL_RGB8UI, GL_RGB16I, GL_RGB16UI, GL_RGB32I, and GL

相关标签:
1条回答
  • 2020-11-30 13:23

    When checking for errors, I get [EDIT:] 1282 ("invalid operation"). I take this to mean that the OpenGL is still using OpenGL 2 for glTexImage2D, and so the call is failing.

    OpenGL errors are not that complex to understand. GL_INVALID_ENUM/VALUE are thrown when you pass something an enum or value that is unexpected, unsupported, or out-of-range. If you pass "17" as the internal format to glTexImage2D, you will get GL_INVALID_ENUM, because 17 is not a valid enum number for an internal format. If you pass 103,422 as the width to glTexImage2D, you will get GL_INVALID_VALUE, because 103,422 is almost certainly larger than GL_MAX_TEXTURE_2D's size.

    GL_INVALID_OPERATION is always used for combinations of state that go wrong. Either there is some context state previously set that doesn't mesh with the function you're calling, or two or more parameters combined are causing a problem. The latter is the case you have here.

    If your implementation didn't support integer textures at all, then you would get INVALID_ENUM (because the internal format is not a valid format). Getting INVALID_OPERATION means that something else is wrong.

    Namely, this:

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

    Your get_type(2) call returns GL_RGB or GL_RGBA in all cases. However, when using integral image formats, you must use a pixel transfer format with _INTEGER at the end.

    So your get_type(2) needs to be this:

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

    And similarly for other integral image formats.

    0 讨论(0)
提交回复
热议问题