Questions tagged «deferred-rendering»

一类渲染技术的名称,在该技术中,几何形状和材质属性与照明计算明确分开。这是通过将各种对象的材质属性渲染到几个缓冲区中,然后使用在这些“ g缓冲区”上的传递来进行照明计算(一次全屏显示)来完成的。该技术使用大量带宽,但是在有很多灯光的情况下可以是一个强大的优化。


1
游戏引擎设计– Ubershader-着色器管理设计
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我想实现一个带有延迟着色的灵活的Ubershader系统。我目前的想法是从模块中创建着色器,以处理某些功能,例如FlatTexture,BumpTexture,位移映射等。也有一些模块可以解码颜色,进行色调映射等。这具有我可以如果GPU不支持某些类型的模块,请更换它们,以便我可以适应当前的GPU功能。我不确定这种设计是否良好。我担心我现在可能会做出错误的设计选择,以后再为此付出代价。 我的问题是,在哪里可以找到有关如何有效实施着色器管理系统的资源,示例和文章?有谁知道大型游戏引擎是如何做到的?

2
延迟着色渲染器中用于几何传递的常见渲染优化技术是什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我一直在使用OpenGL 3和C ++(以及用于窗口管理的glfw)开发游戏引擎。到目前为止,我已经取得了进步,完成了除声音实体和优化之外的大部分工作。该引擎使用延迟着色,因此由于延迟着色本身是普通GPU的累赘过程,因此我想尽可能地优化渲染过程。 当前系统由一个场景组成,其中包含一个渲染器,并且当前世界和世界将实体和照明实体分开std::vectors。 因此,基本上每次场景被调用时->render(),它都会调用渲染器,将世界作为参数传递,并从世界中获取实体迭代器,将其吸引到FBO,然后通过照明实体进行第二遍。而且我认为这还不够。 即使实体不在屏幕空间中,我当前的算法也会遍历所有内容。我正在考虑一种优化当前渲染算法的方法,使其仅针对可见对象调用API函数,那么优化此类渲染器的常用技术有哪些?

1
SSAO实施未获得理想的结果
在实现了延迟渲染之后,我通过本教程尝试了SSAO实现。不幸的是,我没有得到任何看起来像SSAO的东西,您可以在下面看到我的结果。 您会看到有一些奇怪的图案形成,并且在需要的地方(即在物体之间和地面上)没有遮挡阴影。我实现的着色器如下: #VS #version 330 core uniform mat4 invProjMatrix; layout(location = 0) in vec3 in_Position; layout(location = 2) in vec2 in_TexCoord; noperspective out vec2 pass_TexCoord; smooth out vec3 viewRay; void main(void){ pass_TexCoord = in_TexCoord; viewRay = (invProjMatrix * vec4(in_Position, 1.0)).xyz; gl_Position = vec4(in_Position, 1.0); } #FS #version 330 core uniform …

2
延期渲染是未来吗?
延迟渲染是否可以在PC硬件上进行实时3D渲染的未来(至少在光线跟踪变得可行之前)?我知道它的好处(很多指示灯,状态更改更少),还遇到了一些麻烦,例如抗锯齿,半透明的项目和更高的内存带宽。 但是下一代引擎会全部推迟使用吗?前向渲染已成为过去吗?

2
延迟渲染中的阴影
我已经阅读了一些有关延迟渲染的材料,我想我对此有所了解。但是我不明白的是它如何实现阴影。据我所知,G缓冲区不涉及为每个光线创建一个阴影贴图,所以我对于光照通过如何知道每个像素是否被遮挡感到困惑。毕竟,从摄影机的角度可见的给定像素实际上可能从任何给定的光的角度都不可见,并且从摄影机的角度可能看不到遮挡的几何形状,因此在G缓冲区中没有任何内容。 如果开始渲染阴影贴图,则看起来与正向渲染几乎相同-为每个光源渲染场景中的所有几何图形以渲染阴影贴图。 那么延迟渲染如何完成与正向渲染等效的阴影?

2
OpenGL中的延迟平铺阴影,平铺视锥面计算
我正在尝试使用计算着色器在OpenGL中进行延迟的平铺着色,但是在尝试为每个平铺创建平截头体时遇到了障碍。我正在使用AMD的Forward +演示(用D3D编写)作为指导,但是当不应该使用时,灯光似乎被剔除了。 更新 阅读下面的更新。 这是我的(完整)计算着色器: #version 430 core #define MAX_LIGHTS 1024 #define MAX_LIGHTS_PER_TILE 40 #define WORK_GROUP_SIZE 16 struct PointLight { vec3 position; float radius; vec3 color; float intensity; }; layout (binding = 0, rgba32f) uniform writeonly image2D outTexture; layout (binding = 1, rgba32f) uniform readonly image2D normalDepth; layout (binding = …

1
延期贴花正常问题
我一直在研究延迟贴花系统。到目前为止,我已经完成了投影部分,这意味着我可以单击场景中的某些东西,它将正确地将贴图投影到对象的表面上。 我希望添加到此系统中的其他几项内容:普通裁剪和普通映射贴花。正常剪裁是当我丢弃延伸锐角的片段时。在这里看到。解决此问题的一种方法是,丢弃G缓冲区中的法线与贴花法线之间存在较大差异的片段。这将需要读取G缓冲区的正常纹理。 为了进行贴图法线贴图,我需要将贴图的法线(来自法线贴图)与G缓冲区的法线混合。需要写入G缓冲区的常规纹理。 我希望很明显,为了支持这两个功能,我需要在同一着色器通道中读取和写入普通纹理。可悲的是,这是未定义的行为,所以我想知道是否还有其他方法可以实现这些功能。

1
具有相同位大小的渲染目标为何很重要?
我目前正在考虑需要哪种类型的GBuffer进行延迟着色,因此我也尝试在线上记录最常见的GBuffer及其格式。 我见过的大多数GBuffer都为每个渲染目标使用了相同的位大小,通常还导致未使用的通道。但是,作为我的GBuffer的第一个猜测,在纸上,我需要两个24位目标和两个32个目标,或者三个24和一个32。 我知道每个附件都具有相同的“大小”可以更好地对齐,但是实际上来讲,浪费信道(或保留它们以供将来使用)并拥有所有大小相同的RT更好还是还是应该使用所需的大小?在前一种情况下,为什么有这样的优势,是否仍将24位填充到32位呢?

2
投射纹理和延迟照明
在上一个问题中,我问是否可以使用延迟照明进行投影纹理化。现在(半年后),我对同一件事的实现有疑问。我正在尝试将这种技术应用于轻型通行证。(我的投影仪不影响反照率)。我有这台投影机查看投影矩阵: Matrix projection = Matrix.CreateOrthographicOffCenter(-halfWidth * Scale, halfWidth * Scale, -halfHeight * Scale, halfHeight * Scale, 1, 100000); Matrix view = Matrix.CreateLookAt(Position, Target, Vector3.Up); 其中halfWidth和halfHeight是纹理的宽度和高度的一半,Position是投影机的位置,target是投影机的目标。这似乎还可以。我正在使用此着色器绘制全屏四边形: float4x4 InvViewProjection; texture2D DepthTexture; texture2D NormalTexture; texture2D ProjectorTexture; float4x4 ProjectorViewProjection; sampler2D depthSampler = sampler_state { texture = <DepthTexture>; minfilter = point; magfilter = point; mipfilter …

2
延迟照明设置中的双抛物面点光源阴影
我一直在玩这个教程/示例代码,该代码演示了预照明的简单实现,这是一种延迟照明设置。 我正在使用双抛物线阴影贴图实现点光源阴影。我正在对DPM进行以下描述:http : //gamedevelop.eu/en/tutorials/dual-paraboloid-shadow-mapping.htm 我能够创建阴影贴图,它们看起来还不错。 我认为当前存在的问题是像素着色器,当渲染点光源时,该着色器会在阴影贴图中查找深度值。 这是我的点光源着色器代码:http : //olhovsky.com/shadow_mapping/PointLight.fx 感兴趣的像素着色器功能为PointLightMeshShadowPS。 有人在该功能中看到明显错误吗? 希望有人解决了这个问题:) 如您在上图中所看到的,帖子的阴影与帖子的位置不匹配,因此某些地方的转换是错误的... 当点光源非常靠近地面(几乎接触地面)时,它就是这样。 当点光源移近地面时,阴影会聚在一起并沿着两个阴影贴图相交的线(即,沿着光相机翻转以捕获两个阴影贴图的平面)接触。 编辑: 更多的信息: 当我将点光源移离原点时,有一条线平行于光摄像机的“右”矢量来裁剪阴影。上图显示了将点光源向左移动的结果。如果将点光源向右移动,则在右边有一条等效的剪切线。因此,我认为这表明我在像素着色器中进行了错误的转换,就像我想的那样。 编辑:为了使这个问题更清楚,这里有一些代码。 这是我当前用来绘制阴影聚光灯的代码。这可以正常工作,并且可以按照您的期望使用阴影映射。 VertexShaderOutputMeshBased SpotLightMeshVS(VertexShaderInput input) { VertexShaderOutputMeshBased output = (VertexShaderOutputMeshBased)0; output.Position = mul(input.Position, WorldViewProjection); //we will compute our texture coords based on pixel position further output.TexCoordScreenSpace = output.Position; return output; } ////////////////////////////////////////////////////// …

3
延迟阴影-如何合并多个灯光?
我从GLSL开始,已经实现了简单的延迟着色,该着色输出带有位置,法线和反照率的G缓冲区。 我还编写了一个简单的点光源着色器。 现在,我为点光源绘制一个球体,输出进入照明缓冲区。 问题是,绘制多个灯光时如何合并灯光缓冲区的结果? 例如,当我使用点光源着色器将第二个光源绘制到光缓冲区时,如何将第一个光源添加到照明缓冲区中的第二个光源。我的意思是,您不能读取和写入相同的输出缓冲区吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.