glTexImage2D错误在iOS,android-不一致的文档之间的微妙之处

时间:2016-09-21 02:15:53

标签: ios textures opengl-es-2.0

所以我有这行代码:

glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT,shadow_tex_dim.x,shadow_tex_dim.y,0,GL_DEPTH_COMPONENT,GL_FLOAT,shadow_texture_data);

可以很好地在Android上运行深度纹理(运行 OpenGLES2 )(以及 OSX )。

当我在iOS(iOS 10,也在运行OpenGLES2)中运行它时,glGetError()会返回GL_INVALID_OPERATION。 (glGetError()在此行返回干净之前)。

这是glTexImage2D的文档:http://docs.gl/es2/glTexImage2D

请注意' internalformat'指定唯一有效的参数是" GL_ALPHAGL_LUMINANCEGL_LUMINANCE_ALPHAGL_RGBGL_RGBA",但是在& #34;实施例"部分,它显示glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT , fbo_width, fbo_height, 0, GL_DEPTH_COMPONENT , GL_UNSIGNED_BYTE , NULL); (这与我当前的行非常相似,但GL_UNSIGNED_BYTE而不是GL_FLOAT }。

那么,我可以使用GL_DEPTH_COMPONENT吗?为什么这适用于Android的OpenGLES2,而不是iOS?我从哪里得到的,我应该使用GL_FLOAT(请注意,无论是iOS 还是 android,这种行为似乎都没有改变......)?

1 个答案:

答案 0 :(得分:1)

Apple将在此处定义对深度纹理的支持:https://www.khronos.org/registry/gles/extensions/OES/OES_depth_texture.txt

从文档中有两个相关的领域:

  

纹理和DEPTH_COMPONENT的值   指的是包含深度组件数据的纹理。用来   确定用于指定深度纹理元素值的位数。

     

UNSIGNED_SHORT的值是指16位深度值。一个    UNSIGNED_INT的值是指32位深度值。

  

如果和,则生成错误INVALID_OPERATION   是DEPTH_COMPONENT,不是UNSIGNED_SHORT或UNSIGNED_INT。

这也很有趣:https://www.opengl.org/wiki/Common_Mistakes

  

在OpenGL中,所有深度值都在[0,1]范围内。整数   规范化过程只是将此浮点范围转换为   适当精度的整数值。它是整数值   存储在深度缓冲区中。

     

通常,24位深度缓冲区将每个深度值填充到   32位,因此每像素8位将不使用。但是,如果你要求   一个8位模板缓冲区和深度缓冲区,两者分开   通常将图像组合成单个深度/模板图像。   24位将用于深度,其余8位用于模板。

     

现在关于深度缓冲区的浮点误差是   已解决,此次通话有什么问题?

     

glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, my pixels);

     

因为深度格式是标准化的整数格式,   驱动程序必须使用CPU来转换规范化的整数   数据为浮点值。这很慢。

Android似乎支持GL_FLOAT类型的深度纹理。