问题标签 [deferred-shading]
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 - 延迟着色 - 多光源 (OpenGL/GLSL)
我正在开发一个延迟着色程序,现在我必须在场景中设置 50 种不同的灯光。为此,我使用以下代码随机生成其属性(位置、漫反射颜色、镜面反射颜色):
但是,我不太确定如何使用多盏灯进行照明。有人说环境光应该等于漫反射光,而镜面光应该是白色的。
调整我必须执行 Phong 照明的着色器,我有这个:
但是,我得到了丑陋的结果(如果不是错的话),如下图所示:
这个结果只使用了 2 盏灯。由于我必须使用 50,我认为我将看到的只是一个白屏......
opengl - 使用 OpenGL 和 GLSL 的模板缓冲区和延迟渲染
我想知道关于在延迟渲染上下文中使用模板缓冲区的一件事:屏幕空间上的所有片段着色器是否都在“遮挡”区域内使用?
这是网站http://www.learnopengl.com/#!Advanced-OpenGL/Stencil-testing的示例(只是模板缓冲区主题,与延迟渲染无关):
问题:这里的“其他人被丢弃”是什么意思?这意味着在掩码采样器中的值为 0 的情况下不会调用任何像素着色器,或者对于屏幕上的每个片段,将调用像素着色器但如果值为 0,则将应用一个条件来丢弃像素的填充?
让我们假设左边的第一张图片是没有模板缓冲的结果。信息的支持是由 2 个三角形组成的四边形(我们应用延迟渲染技术,因此我们在屏幕空间中工作 - 屏幕尺寸为 500x500)。所以在光栅化之后,会调用 500 * 500 个片段着色器来填充帧缓冲区,即使在没有光线的黑暗区域,它们也会全部使用。这意味着如果我们应用 blinn-phong 着色模型,最后一个将应用在屏幕上的任何地方,甚至在黑暗区域,我认为这对性能是一种浪费。
因此,在这种情况下,合乎逻辑的做法应该是创建一个遮罩(使用模板缓冲区或使用外部自定义遮罩渲染通道,使用其他帧缓冲区来填充它),最后仅使用 blinn-phong 着色模型作为示例其中屏幕空间中掩码采样器中的像素值为 1。这样,phong 着色模型将仅在我们的示例中应用于 2 个框和平面!
在第一种方法中正确完成工作的技巧应该是在片段着色器中添加一个条件,以判断我们是否需要根据采样蒙版纹理的值来计算当前片段的 blinn-phong 着色。
但我想知道(如果我们看上面的第三张图片)是否可以告诉 OpenGL API 调用仅与彩色区域相关的片段着色器!(这意味着我们不进入片段着色器的主要部分)。在这种情况下,使用的片段着色器的数量将大大减少,并且性能会更好!或者唯一的解决方案是像我上面提到的那样在片段着色器中设置一个条件?
opengl - 从一个帧缓冲区读取到另一个帧时出现问题
一段时间以来,我一直在尝试在我的引擎中实现延迟着色/渲染,但是我还没有真正看到它的最终产品。
为了测试问题可能出在哪里,我设计了一个实验来查看我的目标 FBO 是否实际上是通过 glBlitFramebuffer() 命令从我的默认 FBO 读取和读取的。
我已经做到了,在我的默认 FBO 自行清除之前,清除颜色设置为black,并且在我的目标 FBO 清除自己之前,清除颜色设置为red。
结果是,当我渲染我的场景时,我看到的都是黑色。
我的问题是这样的:
如果一个 fbo 设置为 read_framebuffer,并且默认设置为 draw_framebuffer,那么在“glBlitFramebuffer”操作期间是否也会复制“透明彩色”像素?
如果不是,则无法确定我的目标 FBO 是否实际被渲染,因为无论如何该颜色都不会被复制。
如果是,那么我应该看到红色,我不知道我的 FBO 设置有什么问题......
正如我之前所说,我一直在尝试使用延迟着色系统。该系统要求我在 FBO 中执行所有操作,然后将其全部渲染回默认的 FBO。
由于它不起作用,我已经简化了它的过程,要么将基本场景直接渲染到默认 FBO(可以工作),要么将其渲染到目标 FBO 并按照程序将该 FBO 复制回默认 FBO(这不起作用)。
我尝试使用的帧缓冲区设置与我一直关注的教程相同:
我像这样渲染我的场景(简化):
我在每一步都检查了我的帧缓冲区状态,我没有收到任何错误。
我已经找到了实际问题,当我完全理解它时,我将在此处更新此帖子并提供更多信息。
c++ - 延迟着色,存储位置或从深度构建它
我正在一个正在开发的引擎中实现延迟着色,现在我必须决定是使用完整的RGB32F纹理来存储位置,还是从深度缓冲区重建它,所以它基本上是一个RGB32F纹素fetch 与片段着色器中的矩阵向量乘法,以及内存和额外 ALU 操作之间的交易,
请将我重定向到有用的资源并告诉我你自己对该主题的经验。
c++ - 使用 FBO 的 OpenGL 着色管道效率
我一直在努力实现延迟着色,因为我想在我的场景中至少有 20 盏灯。我在使它足够快时遇到了问题(现在仍然如此),但后来我做了一个我认为会使其变慢的更改,但实际上几乎是我的帧速率的两倍。
初始代码:
我正在设置模板测试,如果在几何传递期间设置像素(即背景正常 = 0,0,0 和位置 = 0,0,0 和颜色 = 0 ,0,0。
但是,我很难将组合的深度/模板缓冲区复制到默认的深度/模板缓冲区。显然这不是很好,因为我们不知道系统深度/模板缓冲区采用什么格式。所以我读到最好设置另一个FBO,我们可以在其中指定深度/模板缓冲区格式,渲染到这个,然后blit或渲染一个屏幕四边形以将其输出到屏幕上。
因此,在添加任何模板材料之前,我只是添加了新的 FBO 以使该位工作。
我的新代码现在看起来像:
这按预期工作。出乎意料的是,我的帧速率从 25 FPS 跃升至 45 FPS。
为什么是这样?必须为屏幕四边形执行额外的着色器通道如何比不执行更有效?
快速跟进问题。哪个更有效地使用简单的顶点和片段着色器渲染屏幕四边形以基于 gl_FragCoord 对纹理进行采样,或者将颜色附件直接传送到系统 FBO?
opengl - 用于具有开放场景图的延迟着色的模板缓冲区
我正在尝试根据http://ogldev.atspace.co.uk/www/tutorial35/tutorial35.html上的教程 35-37使用 Open Scene Graph 3.4.0实现延迟着色
现在,我正在努力正确地通过模板,所以我尽可能地简化了我的代码。结果,现在我正在使用三个摄像头:
- 一台 RTT 相机,用于位置、法线和颜色纹理以及写入深度缓冲区。
- 一个模板相机(设置为 RTT 相机,在片段着色器中没有颜色输出),用于使用深度测试结果写入模板缓冲区
- 一个点光源相机(设置为 HUD 相机),使用延迟着色并设置为仅写入模板缓冲区不为 0 的位置。
当我尝试使用点光相机显示深度缓冲区时,它可以工作。当我将 pointLightCamera 的 clear mask 设置为 STENCIL_BUFFER_BIT 并将 stencil clear 设置为 1 时,它会显示所有内容。将其设置为 0 时不显示任何内容。当我禁用 pointLightCamera 中的清除设置(应该如此)并为模板相机中的模板缓冲区启用任何清除设置时,它没有任何效果。stencilFunc 和 stencilOperation 的设置与教程中的一样。
当我启动程序时,它不会显示任何内容(因此所有模板值都是 0)。这使我得出结论,我的 stencilCamera 实际上并没有写入模板缓冲区,但我不知道为什么,我找不到 osg 示例或互联网论坛的更多帮助,我已经尝试了我能想到的一切。
这是我对相机和查看器的设置(rttCamera 有我的场景组节点作为子节点,其中包含一个模型,stencilCamera 有一个球体模型作为光量的子节点,我的 pointLightCamera 有一个 screenQuad 作为子节点)。
(createRTTCamera 和 createHUDCamera 取自 OSG Cookbook)。
opengl - 没有计算着色器的平铺延迟着色
我正在构建一个延迟渲染器,因为我想在场景中支持大量灯光,所以我查看了平铺延迟着色。
问题是我必须以 OpenGL 3.3 硬件为目标,而且它不支持 GLSL 计算着色器。
是否有可能使用普通着色器实现平铺延迟着色?
webgl - 使用来自多个着色器文件的 gl_FragData[]
我有一个带有一些着色器的 webgl 着色器。我正在使用多个渲染目标(gl_FragData[])
在第一个着色器中,我可以输出到
现在使用我的第二个着色器,我想输出到 gl_FragData[3] 并保存纹理以传递给我的第三个着色器。
第二个着色器似乎没有输出到 gl_FragData[3],但如果我在第一个着色器中使用它,它就可以工作。我希望将 gl_FragData[3] 的输出存储在纹理中并发送到第三个着色器。
我认为这可能与帧缓冲区有关,但我已经尝试改变它并且没有运气。我错过了什么?
openscenegraph - 多渲染目标 (MRT) 和 OSG
伙计们,
我研究了 FBO、RTT 和 MRT 以在我的应用程序中包含此功能,但是我遇到了一些问题/疑问,我在搜索过程中没有找到答案/提示。下面是我的场景的描述。如果有人可以帮助我,我将不胜感激。
我想做的事?
- 将两个渲染纹理(用于颜色和深度缓冲区)附加到同一个相机;
- 仅显示后期渲染相机中的颜色缓冲区;
- 在最终绘制回调中从深度和颜色缓冲区中读取图像;
- 将收集的浮动图像写入磁盘。
到目前为止我得到了什么?
- 允许单独渲染颜色或深度缓冲区,但不能同时在同一个相机上渲染;
- 在后期渲染相机中显示颜色缓冲区;
- 在最终绘制回调中读取颜色或深度缓冲区;
- 将收集到的图像(颜色或深度)写入磁盘 - 仅将图像作为 GL_UNSIGNED_BYTE。出现以下错误:
写入文件 ./Test-depth.png 时出错:警告:写入“./Test-depth.png”时出错。
有什么疑问?(帮助!)
- 如何在同一个相机中正确渲染两个纹理(颜色和深度缓冲区)?
- 如何在最终绘制回调中正确读取深度和颜色缓冲区?
- 在磁盘中写入图像期间,为什么错误仅针对图像显示为 GL_FLOAT,而不是针对 GL_UNSIGNED_BYTE?
- 在此过程中,附加到 osg::Geode 的渲染纹理是强制性的还是可选的?我需要创建两个 osg::Geode (每个缓冲区一个),还是两个都只创建一个 osg::Geode?
请查看我当前的源代码(我在这里做错了什么?):
提前致谢,
罗姆洛·切尔凯拉