我正在尝试加载.PNG图像,当我尝试使用以下代码从图像中创建纹理时
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中有什么方法可以捕捉和处理这种异常吗?
发布于 2017-07-17 07:50:54
你从错误的角度来处理这件事。与其试图解决问题,不如解决实际问题。当前的问题是,您传递给OpenGL的是一组不匹配的参数和数据。
OpenGL本身从不引发异常。如果它能够检测到参数是无效的,它将生成一个内部错误,并从错误发生的函数返回,而不会做一些“奇怪”的事情。
在OpenGL函数中,程序崩溃意味着存在驱动程序错误(非常不可能),或者程序中有错误(可能)。glTexImage2D中的崩溃几乎总是由于对所传递的数据进行超出限制的读取所致。如果宽度、高度、边框的值(如果使用自OpenGL-3以来不支持的边框)、格式和glPixelStore设置的像素存储参数计算到比传递给数据的缓冲区更大的值,则OOB读取。
因此,在从这样一个缓冲区读取时,您必须确保将正确的参数传递给OpenGL。正如您已经注意到的,切换到GL_RGBA可以防止崩溃。现在的解决方案不是首先尝试使用GL_RGB,如果失败了,则采用另一种方法。事实上,异常(也是非关键的)应该永远不依赖于,作为某种程序控制流决策逻辑!
机顶盒将提供您所需的所有信息:宽度,高度,通道数;采样深度总是假设每通道8位像素。使用该信息正确地参数化OpenGL图像加载。您必须至少对glPixelStore进行一次调用,才能将解压缩对齐设置为1(否则行启动可能会跳过;机顶盒返回打包严密的图像数据)。将宽度和高度传递给glTexImage2D并根据以下内容决定格式
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;
}
}https://stackoverflow.com/questions/45133300
复制相似问题