首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >glTexSubImage2D不能正常工作

glTexSubImage2D不能正常工作
EN

Stack Overflow用户
提问于 2014-05-13 12:21:53
回答 1查看 5.5K关注 0票数 4

我编写了一个非常简单的OpenGL应用程序。它的目标是加载一个纹理并在平面上绘制它。如果我使用函数'glTexSubImage2D‘,平面没有纹理,函数'glGetError’返回错误'1281‘(无效值)。然而,如果我使用'glTexImage2D‘函数,我的平面是正确的纹理(而且我没有错误)。

下面是我的一段代码:

代码语言:javascript
运行
复制
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);
}

而渲染代码:

代码语言:javascript
运行
复制
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);
}

其结果如下:

有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-13 15:01:01

glTexSubImage2D()用于替换已经分配图像数据的部分或所有纹理。您必须在纹理上调用至少一次glTexImage2D(),然后才能在纹理上使用glTexSubImage2D()。与glTexSubImage2D()不同,glTexImage2D()分配图像数据。如果只想分配图像数据,则可以将NULL用于最后一个(data)参数到glTexImage2D(),然后使用glTexSubImage2D()设置数据。

较新版本的OpenGL (4.4和ES3.0)有一个新的入口点glTexStorage2D(),它可以作为glTexImage2D()的替代方案,在不指定数据的情况下为纹理分配图像数据。它类似于用glTexImage2D()调用data = NULL,但也允许提前指定是否需要mipmap空间。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23631129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档