Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl glTexSubImage2D无法正常工作_Opengl_Texture Mapping - Fatal编程技术网

Opengl glTexSubImage2D无法正常工作

Opengl glTexSubImage2D无法正常工作,opengl,texture-mapping,Opengl,Texture Mapping,我已经编写了一个非常简单的OpenGL应用程序。其目标是加载纹理并在平面上绘制。如果使用函数“glTexSubImage2D”,则平面没有纹理,函数“glGetError”返回错误“1281”(无效值)。但是,如果我使用函数“GLTEXAGE2D”,我的平面纹理正确(并且没有错误) 这是我的一段代码: void core::RootDevice::LoadTexture(char const *pFileName) { SDL_Surface *pSurface = IMG_Load(p

我已经编写了一个非常简单的OpenGL应用程序。其目标是加载纹理并在平面上绘制。如果使用函数“glTexSubImage2D”,则平面没有纹理,函数“glGetError”返回错误“1281”(无效值)。但是,如果我使用函数“GLTEXAGE2D”,我的平面纹理正确(并且没有错误)

这是我的一段代码:

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);
}
结果如下:

有人能帮我吗?

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


OpenGL的较新版本(4.4和ES 3.0)有一个新的入口点
glTexStorage2D()
,可以作为
glTexImage2D()
的替代,为纹理分配图像数据,而无需指定数据。它类似于使用
data=NULL
调用
glTexImage2D()
,但也允许提前指定是否需要用于mipmap的空间。

非常感谢。再见。
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);
}