- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
到目前为止,在对自定义 FBO 进行深度测试时,我一直在使用渲染缓冲区。现在我需要用深度纹理替换它们(因为我需要在着色器中读取它)。我正在查看不同的来源,如 here并看到 GL_FLOAT 用作数据类型。在 other 中使用 GL_UNSIGNED_BYTE 的示例,有时甚至使用 GL_INT。内部格式也可以是 GL_DEPTH_COMPONENT16、GL_DEPTH_COMPONENT24、GL_DEPTH_COMPONENT32。
我的问题是哪种变体在性能和质量方面最好?我确信使用 32 位的深度分量,深度测试应该更精确,但是数据类型呢?通常应该使用哪种?
最佳答案
GL_UNSIGNED_BYTE
的使用, GL_FLOAT
等你描述的实际上是 Pixel Transfer
类型。这是 OpenGL 在从缓冲区读取/写入像素数据时使用的类型,在 OpenGL 中,驱动程序将进行数据类型转换以确保读取/写入的值兼容。在 OpenGL ES 中,这已被完全删除,但在所有情况下,深度渲染缓冲区的内部格式必须是 GL_DEPTH_COMPONENT<X>{F}
之一。或 GL_DEPTH<X>_STENCIL<Y>
.这些格式定义了内部使用的数据类型和格式。
为获得最佳性能,请将组件类型与像素传输类型相匹配,以避免驱动像素转换。 (例如 GL_FLOAT
用于像素传输非常适合 GL_DEPTH_COMPONENT32F
)。然而,这实际上仅适用于当您想要使用深度/模板缓冲区的内容在 OpenGL 之外执行某些操作时(例如,使用 PBO 读取或写入缓冲区)。
大多数时候,您可以在分配深度纹理时忽略像素传输格式和类型(除了确保它们是给定内部格式的合法值)。您可能不会在 OpenGL 之外读取它或从客户端内存中为其提供数据,这是唯一适用的情况。
关于opengl - FBO 深度纹理附件的最佳设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19300590/
我有以下 OpenGL 设置来解决帧缓冲区问题: 我将立方体渲染到帧缓冲区中。 我使用此帧缓冲区中的目标纹理绘制带纹理的四边形,它在我的视口(viewport)中显示立方体。 当流程的两个阶段都在同一
我一直在研究乒乓球着色,并认为在我上一个问题之后我已经破解了它。但是,随着对着色器的进一步了解,看起来虽然我能够在 FBO A 和 FBO B 上运行着色器,但 A 的输出并未用作 B 的源。换句话说
平台是iPhone OpenGL ES 2.0 框架已经创建了一个带有渲染缓冲区的主fbo,因为它是颜色附件。 我有自己的 fbo ,其中 texture2D 作为颜色附件。我想将主 fbo 的内容复
我有一个应用程序需要执行以下操作: 将纹理从磁盘加载到 GL 纹理 在其上运行图像过滤器(通过 FBO 将其渲染到另一个纹理上) 在屏幕上显示生成的纹理 我有那么多工作。 接下来,我希望能够将第 2
我正在尝试创建一个 FBO 来绘制 3D 场景,并创建另一个 FBO 来绘制 HUD。然后,我尝试通过将 3D 场景 block 传输到默认 FBO,然后将 HUD block 传输到默认 FBO,来
除了默认的帧缓冲区之外,在什么情况下我希望在 OpenGL FBO 中添加渲染缓冲区附件而不是纹理附件?因为,纹理附件似乎更加通用。 最佳答案 纹理为您提供更多功能(采样!、格式多样性),因此更有可能
我正在考虑重构我的渲染代码的很大一部分,然后我想到了一个问题:是否可以使用帧缓冲区对象中的多个颜色附件渲染到屏幕和纹理?尽管它有许多有用的应用程序,但我找不到任何信息是否可能。我想将我的纹理作为颜色a
我尝试在 OpenGL 中使用 FBO 的模板缓冲区,但无法正常工作。我将深度和模板目标的 depth24_stencil8 纹理绑定(bind)到 FBO。作为一个简单的测试,我尝试了: /* En
到目前为止,在对自定义 FBO 进行深度测试时,我一直在使用渲染缓冲区。现在我需要用深度纹理替换它们(因为我需要在着色器中读取它)。我正在查看不同的来源,如 here并看到 GL_FLOAT 用作数据
我现在正在尝试实现阴影贴图几天,我想我开始看到手头的真正问题:我有一个附加了深度纹理的 FBO,用于阴影贴图的光 channel ,但是其中没有任何内容被渲染。甚至没有硬编码值。 我已经仔细检查了程序
我正在尝试关注 ThinMatrix's water tutorial 。为此,我需要创建一个 FBO 并将其渲染为纹理。 但是正如您所看到的,水是完全黑色的: 我正在使用source code pr
我正在使用 A FBO 捕捉四边形表面上方的反射。前提是将相机移动到水面下然后渲染场景到fbo,然后恢复到原来的观看位置,像这样: WaterFrameBuffer fbos; Water test(
我有一个按以下方式创建的 FBO: glGenRenderbuffers(1, &m_depthStencilBuffer); glBindRenderbuffer(GL_RENDERBUFFER,
我无法使用 glreadpixels 函数从深度纹理读取正确的深度值。 FBO 状态完成。其他渲染目标在传输到另一个 FBO 后看起来也很好。 代码片段: // Create the FBO
我正在尝试将多采样场景渲染为纹理,这是我正在使用的代码。我得到一个黑屏。我在 init 结束时检查了 fbo 的完整性,他们报告两个 fbo 都是完整的。 void init_rendered_FBO
我读到在分层渲染中,我们创建了一个 2D 纹理数组(GL_TEXTURE_2D_ARRAY): glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTU
我在网上看到了很多示例(for example),它们执行以下操作 创建和绑定(bind) FBO 创建和绑定(bind)缓冲区 (纹理、渲染、深度、模板) 然后,解除绑定(bind)缓冲区 要使用
我想使用片段着色器输出到 FBO,然后将其纹理附件绘制到默认帧缓冲区。最终,我希望能够输出到一个 FBO,然后使用另一个着色器将其传递给另一个 FBO,依此类推。但我认为让它在默认帧缓冲区上工作是一个
在我的渲染器中,我在多重采样的 FBO 上生成抗锯齿场景,该场景被位 block 传输到颜色附件为纹理的 FBO。然后在渲染到帧缓冲区期间读取纹理。 我想更新它,以便获得 Gamma 正确的结果。使用
我想将图像处理 OpenGL 着色器程序的输出保存到图像文件中,并在屏幕上显示结果。我知道如何使用 glReadPixels() 保存窗口帧缓冲区。然而,屏幕的分辨率小于图像的尺寸。 如果我渲染到 F
我是一名优秀的程序员,十分优秀!