问题标签 [deferred-rendering]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
opengl - 从一个帧缓冲区读取到另一个帧时出现问题
一段时间以来,我一直在尝试在我的引擎中实现延迟着色/渲染,但是我还没有真正看到它的最终产品。
为了测试问题可能出在哪里,我设计了一个实验来查看我的目标 FBO 是否实际上是通过 glBlitFramebuffer() 命令从我的默认 FBO 读取和读取的。
我已经做到了,在我的默认 FBO 自行清除之前,清除颜色设置为black,并且在我的目标 FBO 清除自己之前,清除颜色设置为red。
结果是,当我渲染我的场景时,我看到的都是黑色。
我的问题是这样的:
如果一个 fbo 设置为 read_framebuffer,并且默认设置为 draw_framebuffer,那么在“glBlitFramebuffer”操作期间是否也会复制“透明彩色”像素?
如果不是,则无法确定我的目标 FBO 是否实际被渲染,因为无论如何该颜色都不会被复制。
如果是,那么我应该看到红色,我不知道我的 FBO 设置有什么问题......
正如我之前所说,我一直在尝试使用延迟着色系统。该系统要求我在 FBO 中执行所有操作,然后将其全部渲染回默认的 FBO。
由于它不起作用,我已经简化了它的过程,要么将基本场景直接渲染到默认 FBO(可以工作),要么将其渲染到目标 FBO 并按照程序将该 FBO 复制回默认 FBO(这不起作用)。
我尝试使用的帧缓冲区设置与我一直关注的教程相同:
我像这样渲染我的场景(简化):
我在每一步都检查了我的帧缓冲区状态,我没有收到任何错误。
我已经找到了实际问题,当我完全理解它时,我将在此处更新此帖子并提供更多信息。
opengl - 在现代 OpenGL 中如何渲染多个纹理?
如果我正确理解 FBO,我可以将多个 2D 纹理附加到不同颜色的附加点。我想使用此功能从片段着色器中写出几种不同类型的数据(例如世界位置和法线)。看起来在过去,这涉及在不同索引处写入 gl_FragData,但 gl_FragData 不再存在。现在这是如何完成的?
c++ - 延迟着色,存储位置或从深度构建它
我正在一个正在开发的引擎中实现延迟着色,现在我必须决定是使用完整的RGB32F纹理来存储位置,还是从深度缓冲区重建它,所以它基本上是一个RGB32F纹素fetch 与片段着色器中的矩阵向量乘法,以及内存和额外 ALU 操作之间的交易,
请将我重定向到有用的资源并告诉我你自己对该主题的经验。
opengl - 延迟着色天空盒,在全屏四边形之后渲染
因此,作为延迟着色器的最后一步,我一直在尝试让天空盒工作。基本上我会完成所有常规的延迟着色器步骤,然后使用一些后期处理东西,如 HDR 和绽放,最后一步使用前向着色器渲染到全屏四边形。现在,如果我只是单独渲染天空盒或延迟着色结果,一切看起来都很好。当我尝试最后渲染天空盒时,它并没有出现在屏幕上。
所以基本上在我用结果渲染四边形之后,我想使用几何通道中的深度值来渲染天空盒。我已经尝试按照延迟渲染 Skybox OpenGL的建议对深度缓冲区进行 blitting,但它没有任何效果,我认为问题在于我如何为 FBO 设置深度缓冲区,因为它共享一个模板附件。
我对天空盒的渲染调用:
以及我如何设置延期 FBO
我在想 GL_DEPTH_STENCIL_ATTACHMENT 是什么搞砸了,但我也看不出为什么你不应该能够在 blit 函数中指定深度附件
结果的图像,没有天空盒:结果
编辑
我尝试搜索了一下并将格式更改为 GL_DEPTH_24_STENCIL8 以防主 fbo 具有不同的浮点格式,但这也无济于事。
ios - 设置 SCNTechnique 会停止 SCNSceneRendererDelegate
当我为我的 SCNView 设置 SCNTechnique 时,我的 SCNSceneRendererDelegate 停止工作。有什么解决方法吗?我想在场景渲染之前和之后执行一些代码。我试图重置委托,但它没有帮助。谢谢!
opengl - OpenGL 在延迟渲染器中实现天空盒
我试图弄清楚如何在延迟渲染器中渲染天空盒,以便它可以包含在后期处理效果中,但是我的几何阶段在视图空间中,不幸的是,这个阶段的天空盒将受到它相对于像任何物体一样发光(它的行为就像离光源很远的大盒子,并且显示得很暗)。我没有尝试在后期处理中加入天空盒的设置如下:
1:(绑定 FBO)将几何体渲染到颜色、法线、位置 FBO 纹理附件(取消绑定 FBO)。
2:(绑定FBO)渲染场景并计算屏幕空间的光照。(取消绑定FBO)
3:(绑定FBO)应用后期处理效果(取消绑定FBO)
4:将几何FBO的深度缓冲区blit到默认帧缓冲区
5:渲染天空盒。
我试图用 3 像这样切换第 5 步:
2:(绑定FBO)渲染场景并计算屏幕空间中的光照。
5:渲染天空盒
(解除绑定FBO)
3:(绑定FBO)应用后期处理效果(取消绑定FBO)
4:将几何FBO的深度缓冲区blit到默认帧缓冲区
但显然天空盒没有关于场景的深度信息,而是在灯光舞台上渲染。如果我尝试在 2 和 5 之间进行任何深度 blitting,我相信我正在进行无效的 GL 调用,因为我在调用时已经绑定到 FBO
c++ - 使用 FBO 的 OpenGL 着色管道效率
我一直在努力实现延迟着色,因为我想在我的场景中至少有 20 盏灯。我在使它足够快时遇到了问题(现在仍然如此),但后来我做了一个我认为会使其变慢的更改,但实际上几乎是我的帧速率的两倍。
初始代码:
我正在设置模板测试,如果在几何传递期间设置像素(即背景正常 = 0,0,0 和位置 = 0,0,0 和颜色 = 0 ,0,0。
但是,我很难将组合的深度/模板缓冲区复制到默认的深度/模板缓冲区。显然这不是很好,因为我们不知道系统深度/模板缓冲区采用什么格式。所以我读到最好设置另一个FBO,我们可以在其中指定深度/模板缓冲区格式,渲染到这个,然后blit或渲染一个屏幕四边形以将其输出到屏幕上。
因此,在添加任何模板材料之前,我只是添加了新的 FBO 以使该位工作。
我的新代码现在看起来像:
这按预期工作。出乎意料的是,我的帧速率从 25 FPS 跃升至 45 FPS。
为什么是这样?必须为屏幕四边形执行额外的着色器通道如何比不执行更有效?
快速跟进问题。哪个更有效地使用简单的顶点和片段着色器渲染屏幕四边形以基于 gl_FragCoord 对纹理进行采样,或者将颜色附件直接传送到系统 FBO?
c++ - 使用 OpenGL 使用延迟渲染绑定 FBO 后卡在渲染灯上
首先,在尝试一整天完成这项工作后,我对这篇长篇文章感到抱歉。
我对此有很多疑问,尤其是因为我在 C++ 中使用继承来构建灯光。
我使用定向光作为光的核心模型,因为我可以给出光的方向,它会计算光,然后在它上面我构建点光,我只计算从光到片段位置的矢量,最后是聚光我使用带有截止角的点光来创建聚光灯(只需忽略圆锥外的任何东西)。我已经测试了灯光,它们在前向渲染中工作得很好,但现在我想将我的灯光模型更改为 PBR(基本上只是改变我在定向光中计算灯光的方式)并转向不同的渲染。
今天我开始研究延迟渲染,我可以获得位置、纹理、法线和深度缓冲区,但是在尝试渲染灯光时遇到了问题。
这是第一个问题,第二个问题,因为每种类型的光都有自己的着色器,我使用多态性构建它们。我的第二个问题是我可以循环遍历 C++ 中的每个灯光并将每个灯光称为渲染器,或者还有另一种方法可以在着色器中解决这个问题。灯的原型是编辑:我修复了一个小问题,即我用 VP 投影转换渲染 quat,但我仍然无法绘制任何东西,我不知道 FB 现在是否工作正常。Nvidia opengl 调试器正在崩溃。
我的渲染路径如下所示。
我开始构建的着色器代码是(PS 我现在删除了阴影)顶点着色器
片段着色器困扰我的一件事是,即使我使用它们,我也无法为 gPosition、gPosition 和 gAlbedoSpec 设置统一值,并且无论我在着色器中进行什么更改,输出都将是相同的。
全局网格
全局着色器
javascript - 解析 THREE.js json 网格格式法线错误
编辑:演示终于上线了:http: //bharling.github.io/deferred/index.html使用下拉菜单切换到环面模型来现场查看问题。注意:需要 Webgl MRT 扩展。
我已经在 WebGL 中开发自己的延迟渲染引擎已有一段时间了,并且已经到了使用 GBuffers 和 MRT 扩展的工作原型的阶段,它可以非常令人满意地渲染一些茶壶。这是从头开始开发的,主要是为了让我在不使用任何框架的情况下正确学习 WebGL,并理解延迟渲染。对于任何感兴趣的人 - 来源在 github 上:https ://github.com/bharling/webgl-defer
我已经到了厌倦了只看到茶壶并尝试为 THREE.js JSON 格式模型实现加载器的阶段。我已经移植(复制)了加载器的主要部分,我可以让网格以正确的顶点和索引缓冲区出现,这很棒,但法线一直很混乱。我选择只支持带有顶点 UV 和顶点法线以及单一材质的索引几何体(最终这应该是基于 PBR 的),所以我忽略 JSON 中的任何其他内容,只将我支持的内容直接写入 Float32Arrays (等) . 下面是我的导入代码,以及我看到的奇怪法线的屏幕截图。
上面的屏幕截图应该是扩展的世界空间法线 gbuffer。
我的引擎的一大区别是我不将面部信息存储在类中(例如 THREE.Face3 ),而是将数据直接写入缓冲区属性,更像是 THREE.BufferGeometry。
到目前为止,我一直在使用“学习 WebGL”课程中的犹他茶壶模型,特别是这个链接http://learningwebgl.com/blog/?p=1658。这个模型在我的引擎中工作得很好,据说是三个 JSON 格式的早期版本。我通过将顶点、texcoords 等的 json 数组直接写入 webgl 缓冲区来加载该模型,这在我的引擎中非常有效,但即使是从最新的搅拌机导出器导出的简单立方体似乎也不能很好地工作.
任何建议都非常感谢,谢谢!
编辑:使用 webgl 教程中的茶壶模型的法线截图。注意:我并不是说三个导出器坏了,而是我解析它的代码。在过去一年左右的时间里,我在这个引擎中多次使用 GBuffer 实现,现在我很确定这是正确的,我只是在理解三种 json 模型格式时遇到了一些问题。