问题标签 [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 - Pre-Pass Lighting OpenGL 实现神器
在实现了延迟渲染器之后,我正在为我的硕士论文项目在 OpenGL 中实现 Pre-Pass Lighting 算法。Deferred 渲染器完美运行,我基于它实现了 PPL。在算法的光照传递之后,我得到了一个非常奇怪的伪影:L-缓冲区中包含的数据,我在其中累积了场景中灯光的贡献,是正确的,但结果相对于几何形状略有偏差,所以当我将它应用到材质中的场景时,结果是清晰可见的!(我不能在这里发布图片,但这里有一个链接可以看到它http://postimage.org/image/kxhlbnl9v/)
看起来光照贴图立方体以某种方式计算出与几何体的偏移量(在每个轴上都不同)。我多次检查着色器和C++代码,我不明白这个问题来自哪里。我的想法不多了。下面是按顺序调用的算法的 3 遍代码。该代码现在是实验性的,所以我知道它在这个阶段设计得不好。我还添加了我在每个阶段使用的着色器,以按顺序写入 G-buffer、L-buffer 和 framebuffer。
C++代码:
NVIDIA CG 着色器:
有什么建议么?
c++ - Ogre3d / 延迟渲染 / 点光源
我正在尝试使用 ogre 合成器框架设置延迟渲染器。我尝试在下面的代码中实现点光源着色器(作为全屏四边形效果,没有衰减或镜面反射计算):
将延迟数据输出到 GBuffer 的材质:
顶点程序说明:
片段程序说明:
轻材质脚本:
灯光着色器:
这就是我在 .cpp 文件中声明光的方式:
我得到了输出,一切正常——除了我不能让照明正常工作。G 缓冲区包含有效数据 - 视图空间法线、线性 z 深度、纹理。我还将视图空间中的光线位置作为参数 - 但是在矢量计算期间存在一些问题 - 输出与点光源完全不同。我在这里做错了什么?
谢谢!
PS我还尝试通过合成器侦听器手动传递lightPos参数,但是灯光看起来更像是定向光......
jquery - 无法创建 Ajax 延迟数据表
我想制作延迟初始化数据表,以便在单击页码时加载数据。
我这样做是为了根据请求加载数据,但是表格在开始时呈现空表格,当单击任何其他数字时,所有页码都会出现 10 多条记录,并且这个标题也会出现“从 NaN 显示 41 到 Nan (从 NaN 总条目中过滤)”点击页码,当然数字 41 会根据点击的页码而变化。
编辑
Json 回报是巨大的,但这里是它的样本
c++ - opengl multitexturing glsl - 一次只有一个纹理
好像如果我使用texture(texture0,textCoord)
一次然后我尝试再次使用texture(texture1,textCoord);
它返回的另一个纹理(0,0,0,0);我只是不知道为什么。
在我的程序中,它似乎是一个工作顺序,如果深度比其他工作不工作,如果我不使用深度比颜色工作等等。(深度,颜色,正常,位置,光泽是顺序)
这是绑定部分:
这可能是 FBO 类:
java - 延迟渲染管道在笔记本电脑显卡上不起作用,以及奇怪的“模型重影”问题 (glBlendFunc)
编辑:更改片段着色器,以便每次运行只有一个光可以解决我的第一个问题。我的第二个问题仍然存在。
提前感谢您提供的任何帮助。几周以来,我一直在为我的 LWJGL 渲染引擎开发延迟着色管道。虽然我已经设法让一切都按预期工作,但是在将程序分发给我认识的几个人之后,我开始遇到问题。我会尽量保持简短。谢谢你和我在一起。
我将从标题中的两个问题中的第一个开始。在我的机器(AMD Phenom II 965 和 Nvidia GTX 480)上,渲染器的最终产品完全符合预期。(我打算发布一个图片的链接,但由于我是一个新用户,我无法发布超过 3 个超链接。但可以说,它看起来应该有。)
这正是我想要的,所以我虽然渲染器工作正常。我把它寄给了一个朋友(他正在使用 GT 440),他们得到了相同的结果。
此后不久,我将引擎的构建提供给了我的一位拥有笔记本电脑(使用 GT 540M)的朋友。这是渲染器产生的(忽略 FPS 计数器,它不起作用):
http://i.imgur.com/DxxFEpy.png
显然,这根本不是我预期的结果。我在能够测试的所有其他移动显卡上都体验到了相同的结果。经过一个多星期的头撞桌子后,我能够将问题缩小到调用 glBlendFunc 的照明通道。我的代码如下:
您可能会注意到的第一件事是我绘制了一个四边形,然后清除了深度和颜色缓冲区。这将在我的下一个问题中得到解决,尽管如果我下一个问题中的问题与这个问题中的问题密切相关,我不会感到惊讶。我几乎可以肯定 (99%) 问题出在这种方法上,因为在使用仅支持一盏灯但仍在使用延迟管道的较旧版本的引擎进行测试时,我能够在我测试的每台计算机上获得完美的结果. 再一次,渲染器适用于我测试过的每张台式机显卡,但不适用于任何笔记本电脑显卡。除了这种方法,我几乎排除了一切。可能值得注意的是,我没有成功使用内部格式不是GL_RGBA32f
或GL_RGBA16f
作为渲染目标。有没有人见过这个,或者任何人都可以提供帮助?如果有人知道在这一点上从哪里开始寻找问题,我会很高兴,因为我什么都没有。我已经完全无法自己找到解决方案。
然后继续第二个问题和第二个问题。在最后一个代码块的开头,我有几行代码在屏幕上创建了一个没有着色器的四边形:
据我所知,这段代码应该什么都不做。但是当我删除四边形的绘图时,窗口会显示:
http://i.imgur.com/mkMsP0F.png
除了“重影”之外,我不知道还能称之为什么,因为它就像一个幽灵图像(至少在我看来是这样)。当我旋转 MV 矩阵时,它会在我旋转的方向上扭曲,第一组灯(我使用 7 个阵列)照亮它,但其余的照亮实际模型。我无法解释为什么会发生这种情况,因为生成此图像的代码与上面的代码完全一样,没有glCallList(quadList);
这意味着深度和颜色缓冲区在我进入循环之前仍然被清除。我根本无法解释这个问题。有谁知道出了什么问题以及如何解决它,或者至少知道出了什么问题?
编辑我发现这只发生在具有纹理坐标的模型上。我不知道为什么。
编辑看起来当我将每个着色器中允许的灯光数量限制为 1 时,重影变得不那么明显,但仍然存在,所以我认为这意味着片段着色器的一次运行会导致这些重影。
感谢任何人对这两个问题的任何帮助,非常感谢。如果您有任何问题要问我,尽管我可能需要一些时间才能回复您,但我会尽快回复您。
编辑对不起,我忘记了我的着色器代码:GeometryPass 顶点:
GeometryPass 片段:
LightPass Phong 顶点:
LightPass Phong 片段
opengl - 延迟渲染是否需要位置缓冲区?
我试图通过将屏幕空间点投影回视图空间以与照明一起使用来避免使用位置缓冲区。我试过乘以逆投影矩阵,但这并没有返回视图空间点。添加矩阵乘法以避免位置缓冲区是否值得?
最终通道着色器:
visual-c++ - 在新视频卡上的 nvoglv32.dll 中绘制调用崩溃
几天前,由于某些硬件更改,我设置了计算机并安装了 Windows 8 的新副本。其中,我将显卡从 Radeon HD 7870 更改为 Nvidia GTX 660。
再次设置 Visual Studio 11 后,我从 Github 下载了我的最后一个 OpenGL 项目并重建了整个项目。我从 Visual Studio 中运行了应用程序,但由于nvoglv32.dll
.
Application.exe 中 0x5D9F74E3 (nvoglv32.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。
在旧环境中,应用程序按预期工作。我没有更改项目或源代码的任何内容。唯一的区别是 Visual Studio 安装的语言,现在是英语,以前是德语。因此我创建了一个新项目并采用了所有设置,但错误仍然存在。
为了定位崩溃,我注意到所有初始化(窗口,着色器,...)都成功了,错误出现在绘制调用glDrawElements()
上,它引用了我的延迟渲染器的几何传递。
经过一番研究,我发现它nvoglv32.dll
来自 Nvidia,是关于一个名为Compatible OpenGL ICD
. 这是否意味着我的应用程序以兼容模式运行?这听起来像是一种支持旧应用程序的模式,我希望我的应用程序以常规模式运行!顺便说一句,我为我的显卡安装了最新的稳定驱动程序。
老实说,我不知道如何解决这个崩溃问题。什么可能导致它以及如何解决它?
更新:我在 Geforce 论坛上找到了一篇关于我的问题的帖子。虽然没有回复,但作者可以通过更改两个 OpenGL 调用的顺序来解决问题。
大家好,
在浏览了我的应用程序源代码几个小时后,我发现调用这些函数......
...按此顺序会导致 nvoglv64.dll 崩溃。将这些调用的顺序颠倒到...
...防止崩溃并且表现良好。
干杯,罗伯特格拉夫
由于我不使用顶点数组,因此无法简单地进行此修复,但可能存在类似问题。我会报告我的进展。
更新:我完全不知道如何解决我的问题。我尝试了不同的视频驱动程序版本,但没有区别。我使用最少的着色器和简单的前向渲染完全重写了渲染器。但是崩溃发生在第一次绘制调用时。
opengl - 延迟渲染中的阴影贴图投影 (OpenGL 3.3)
我有一个有效的 G 缓冲区(颜色、法线、深度),对于每个聚光灯,我都有从灯光的角度看的深度图。问题出在光照贴图阶段,我无法让它工作。你能指出这里有什么问题吗?
这是我对这个过程的“理解”:
unity3d - 大场景中的Unity3D点光源
我目前正在 Unity 中构建一个包含大量点光源的大型场景。场景中的每个房间(约 40 个房间)都有 2 个点光源,我正在使用延迟渲染(启用阴影以使光线不会泄漏到房间外)。
使用前向渲染时,我的游戏以 60 fps 的速度运行,但当切换到延迟照明时,它的运行速度约为 25-30 fps(因为它计算了我假设的点光源的软阴影)。
我怎样才能解决这个问题,同时还能防止灯光从墙壁漏出?
谢谢!
java - 使用 Java VisualVM 分析 JOGL
我正在开发一个 OpenGL 3D 渲染器。我正在使用 Java 和 JOGL API。现在我正在尝试对我的延迟渲染器进行性能调整。为此,我使用 VisualVM Profiler 来查看是什么占用了我宝贵的 CPU 周期,并使用 gDEBugger 来跟踪我的 OpenGL 函数调用。现在,即使只有 20 到 30 个灯光(并且需要点亮的实际网格数量非常少),它的 FPS 也会下降到 30 帧以下。而且我什至还没有添加阴影贴图和法线贴图之类的东西。
这就是它目前的样子(41 盏灯,但只有 20 FPS):
在 VisualVM 中,我注意到大部分CPU时间都花在了本机jogamp.opengl.windows.wgl.WGLUtil.SwapBuffers
方法上。但是,我不确定这些信息是否与我的着色器的运行时间相关或以任何方式相关。调用的运行时间glDrawArrays
可以忽略不计,这证实了这个方法只是向 GPU 发出调用,并且显然没有等待它们完成后再返回。为什么我的应用程序的大部分时间都花在该函数调用上?
同样比较奇怪的是:当我有 3-4 盏灯时,我以 60FPS 的速度运行。当我将该数字增加到 20 时,该数字下降到 20FPS。当我添加 1000-1100 盏灯时,我仍然可以获得大约 10 FPS。这是为什么?由于光照计算是相加的,当有 1000 个光照时,每个像素运行的片段着色器应该比有 20 个光照时多得多,这意味着渲染器理论上应该比 20 个光照慢得多。为什么从 3-4 盏灯跳到 20 盏灯时会出现如此巨大的性能?
现在我的问题的第二部分:就像我之前说的,我也开始使用 gDEBugger 来分析我的 OpenGL 调用,但是,遗憾的是,我似乎无法找到一种方法来准确确定执行时间最长的内容 -我只获得有关哪些函数被调用最多的信息。在尝试寻找冗余状态更改之类的事情时它会有所帮助,但对于我所处的阶段,我确信存在更大的问题会减慢我的渲染器速度。
有谁知道一种可靠的方法来跟踪我的片段着色器的执行时间,并准确查看哪些片段中哪些计算花费的时间最长?我知道 nVidia nSight 提供了一些出色的图形调试功能,但其中大部分仅适用于 DirectX 应用程序。