所以我有这行代码:
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_ALPHA
,GL_LUMINANCE
,GL_LUMINANCE_ALPHA
,GL_RGB
,GL_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,这种行为似乎都没有改变......)?
答案 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
类型的深度纹理。