- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
到纹理绑定(bind)的屏幕外帧缓冲区对象的屏幕外渲染应该是微不足道的,但我遇到了一个我无法解决的问题。
我的完整示例程序(目前只有 2D!)在这里:
请参阅下面的一些说明。
我正在创建一个 rgba 纹理对象 512x512,将它绑定(bind)到一个 FBO。此时不需要深度或其他渲染缓冲区,严格来说是 2D。
以下极其简单的着色器渲染到该纹理:
顶点着色器:
varying vec2 vPos; attribute vec2 aPos;
void main (void) {
vPos = (aPos + 1) / 2;
gl_Position = vec4(aPos, 0.0, 1.0);
}
在 aPos 中,这只是得到一个包含四边形的 4 个 xy 坐标的 VBO (-1, -1::1, -1::1, 1::-1, 1)
因此,尽管帧缓冲区分辨率理论上应该为 512x512,显然着色器将其“纹理”渲染到“全(关闭)屏幕四边形”上,遵循 GLs -1..1 坐标范例。
片段着色器:
varying vec2 vPos;
void main (void) {
gl_FragColor = vec4(0.25, vPos, 1);
}
因此它设置了一种完全不透明的颜色,红色固定为 0.25,绿色/蓝色取决于 0 到 1 之间的任何 x/y。
此时我的假设是渲染 512x512 纹理仅显示 -1..1 全(关闭)屏幕四边形,从 0..1 开始对绿色/蓝色进行片段着色。
所以这是我的屏幕外设置。在屏幕上,我有另一个真正可见的全屏四边形,带有 4 个 xyz 坐标 { -1, -1, 1::: 1, -1, 1::: 1, 1, 1::: -1, 1, 1}。同样,现在这是二维的,所以没有矩阵,所以 z 总是 1。
这个四边形由不同的着色器绘制,简单地渲染给定的纹理,教科书 GL-101 风格。在我上面链接的示例程序中,我有一个简单的 bool 切换 doRtt,当它为 false(默认值)时,根本不执行渲染到纹理,这个着色器只显示使用当前目录中的 texture.jpg。
此 doRtt=false 模式显示第二个屏幕四重渲染器对于我当前的要求是“正确的”,并按照我的意愿执行纹理:垂直重复两次,水平重复两次(稍后将被夹紧,重复是仅用于此处测试),否则在没有纹理过滤或 mipmap 的情况下进行缩放。
因此无论窗口(以及视口(viewport))如何调整大小,我们总是会看到一个全屏四边形,其中一个纹理在水平方向重复两次,在垂直方向重复两次。
现在,在 doRtt=true 的情况下,第二个着色器仍然在执行它的工作,但纹理永远不会完全正确地缩放或绘制,我不确定,因为不幸的是我们不能只说“嘿 gl 保存这个 FBO到磁盘以进行调试。”
RTT 着色器确实执行了一些部分渲染(或者可能是完整渲染,再次无法确定屏幕外发生了什么......)特别是当你将视口(viewport)调整为比默认大小小很多时你会看到中断在纹理重复之间,并没有显示我们非常简单的 RTT 片段着色器所期望的所有颜色。
(A) 要么:我的代码正确创建了 512x512 纹理但未正确映射(但为什么使用完全相同的简单纹理四边形着色器的 doRtt=false 任何给定的 texture.jpg 文件显示得很好? )
(B) 或:512x512 纹理未正确渲染,并且 rtt frag 着色器以某种方式根据窗口分辨率更改其输出——但为什么呢?对于 x 和 y,离屏四边形始终为 -1..1,顶点着色器始终将其映射到片段坐标 0..1,对于这个简单的测试,RTT 纹理始终保持在 512x512!
请注意,屏幕外四边形和屏幕上四边形都不会改变它们的坐标,并且始终是“全屏”(两个维度上都是 -1..1)。
同样,这应该很简单。我到底错过了什么?
规范:OpenGL 4.2(但代码显然不需要任何 4.2 功能!),Nvidia Quadro 5010M,openSuse 12.1 64 位,Golang Weekly 22-Feb-2012。
最佳答案
首先 - 尝试检查 OpenGL 错误。在每个 OpenGL 函数之后调用 glGetError()。您还必须为绘图设置正确的视口(viewport)。在绘制到 FBO 之前调用 glViewport(0, 0, 512, 512)。在绘制到屏幕之前调用 glViewport(0, 0, display_width, display_height)。
此外,当您使用 FBO 渲染时,也无需绑定(bind) rttFrameTex。只有在着色器中读取纹理时才需要绑定(bind)纹理。
关于OpenGL render-to-texture-via-FBO——不正确的显示与正常的纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9629763/
我有以下 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
我是一名优秀的程序员,十分优秀!