首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理glTexImage2D异常

处理glTexImage2D异常
EN

Stack Overflow用户
提问于 2017-07-16 21:04:19
回答 1查看 1.1K关注 0票数 0

我正在尝试加载.PNG图像,当我尝试使用以下代码从图像中创建纹理时

代码语言:javascript
复制
unsigned char *imageData1 = stbi_load("container.jpg", &width1, &height1, &noChannels1, 0); // succeeded to return data

if(imageData1) {
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width2, height2, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData1); // raise an exception here.
}

程序崩溃并引发异常。我认为我应该在数据类型中使用GL_RGB而不是GL_RGBA。

我的问题是,在OpenGL中有什么方法可以捕捉和处理这种异常吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-17 07:50:54

你从错误的角度来处理这件事。与其试图解决问题,不如解决实际问题。当前的问题是,您传递给OpenGL的是一组不匹配的参数和数据。

OpenGL本身从不引发异常。如果它能够检测到参数是无效的,它将生成一个内部错误,并从错误发生的函数返回,而不会做一些“奇怪”的事情。

在OpenGL函数中,程序崩溃意味着存在驱动程序错误(非常不可能),或者程序中有错误(可能)。glTexImage2D中的崩溃几乎总是由于对所传递的数据进行超出限制的读取所致。如果宽度、高度、边框的值(如果使用自OpenGL-3以来不支持的边框)、格式和glPixelStore设置的像素存储参数计算到比传递给数据的缓冲区更大的值,则OOB读取。

因此,在从这样一个缓冲区读取时,您必须确保将正确的参数传递给OpenGL。正如您已经注意到的,切换到GL_RGBA可以防止崩溃。现在的解决方案不是首先尝试使用GL_RGB,如果失败了,则采用另一种方法。事实上,异常(也是非关键的)应该永远不依赖于作为某种程序控制流决策逻辑!

机顶盒将提供您所需的所有信息:宽度,高度,通道数;采样深度总是假设每通道8位像素。使用该信息正确地参数化OpenGL图像加载。您必须至少对glPixelStore进行一次调用,才能将解压缩对齐设置为1(否则行启动可能会跳过;机顶盒返回打包严密的图像数据)。将宽度和高度传递给glTexImage2D并根据以下内容决定格式

代码语言:javascript
复制
assert( (1 <= channels) && (4 >= channels) );
GLenum glformat;
if( opengl3 ){
    switch( channels ){
    case 1: glformat = GL_RED;  break;
    case 2: glformat = GL_RG;   break;
    case 3: glformat = GL_RGB;  break;
    case 4: glformat = GL_RGBA; break;
    }
} else {
    switch( channels ){
    case 1: glformat = GL_LUMINANCE;       break;
    case 2: glformat = GL_LUMINANCE_ALPHA; break;
    case 3: glformat = GL_RGB;             break;
    case 4: glformat = GL_RGBA;            break;
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45133300

复制
相关文章

相似问题

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