use*_*743 3 opengl texture-mapping
我写了一个非常简单的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);
}
Run Code Online (Sandbox Code Playgroud)
并且渲染代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
结果如下:

有人能帮帮我吗?
glTexSubImage2D()用于替换已经分配了图像数据的部分或全部纹理.glTexImage2D()在使用纹理之前,您必须至少调用一次纹理glTexSubImage2D().不同的是glTexSubImage2D(),glTexImage2D()分配图像数据.如果您只想分配图像数据,以后再设置数据,则可以使用NULLlast(data)参数.glTexImage2D()glTexSubImage2D()
较新版本的OpenGL(4.4和ES 3.0)有一个新的入口点glTexStorage2D(),可用作为glTexImage2D()纹理分配图像数据而无需指定数据的替代方法.它类似于调用glTexImage2D()带data = NULL,也可以让时间提前指定是否将需要的贴图空间.