glTexSubImage2D函数无法正常工作

4
我写了一个非常简单的OpenGL应用程序,它的目标是加载纹理并在平面上绘制它。如果我使用函数“glTexSubImage2D”,平面没有纹理,并且函数“glGetError”返回错误“1281”(无效值)。但是,如果我使用函数“glTexImage2D”,我的平面可以正确地贴上纹理(而且没有错误)。
这是我的一部分代码:
void core::RootDevice::LoadTexture(char const *pFileName)
{
    SDL_Surface *pSurface = IMG_Load(pFileName);
    char *pPixels = reinterpret_cast<char*>(pSurface->pixels);
    uint32_t bytePerPixel = pSurface->format->BitsPerPixel;

    glGenTextures(1, &textureId);
    glBindTexture(GL_TEXTURE_2D, textureId);
    {
        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboID);
        {
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

            //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pSurface->w,       //NO ERROR : All is ok
                //pSurface->h, 0, GL_RGB, GL_UNSIGNED_BYTE, pPixels);

            glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pSurface->w,        //ERROR : 1281
                pSurface->h, GL_RGB, GL_UNSIGNED_BYTE, pPixels);

            std::cout << glGetError() << std::endl;
            getchar();
        }
        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
    }
    glBindTexture(GL_TEXTURE_2D, 0);
}

翻译:渲染代码如下:
void core::RootDevice::Render(void)
{
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, textureId);
    {
        glBegin(GL_QUADS);
            glTexCoord2f(0.0f, 0.0f);
            glVertex3f(-1.0f, -1.0f, 0.0f);
            glTexCoord2f(1.0f, 0.0f);
            glVertex3f(1.0f, -1.0f, 0.0f);
            glTexCoord2f(1.0f, 1.0f);
            glVertex3f(1.0f, 1.0f, 0.0f);
            glTexCoord2f(0.0f, 1.0f);
            glVertex3f(-1.0f, 1.0f, 0.0f);
        glEnd();
    }
    glBindTexture(GL_TEXTURE_2D, 0);
}

结果如下所示:

enter image description here

有人能帮我吗?
1个回答

7

glTexSubImage2D()用于替换已经分配了图像数据的纹理的部分或全部。在使用glTexSubImage2D()之前,您必须至少调用一次glTexImage2D()创建纹理。与glTexSubImage2D()不同的是,glTexImage2D()会分配图像数据。如果您只想分配图像数据并稍后使用glTexSubImage2D()设置数据,则可以将最后一个参数data传递为NULL

OpenGL的新版本(4.4和ES 3.0)有一个新的入口点glTexStorage2D()可用作glTexImage2D()的替代方法来分配纹理的图像数据而不指定数据。它类似于使用data = NULL调用glTexImage2D(),但还允许预先指定是否需要为mipmap留出空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接