Articles of 延迟着色

材质属性和延期渲染

我正在使用assimp导入三维模型,每个模型也定义一组材质属性,例如材质diffuseColor,ambientColor,specularColor和emissiveColor。 我将在哪里存储这些信息,另外4个纹理,每个材质属性还是有一个更明智的方法? 以下是我目前第一遍的片段着色器 "#version 330 \n \ \n \ layout(std140) uniform; \n \ \n \ uniform UnifGeometry \n \ { \n \ mat4 mWVPMatrix; \n \ mat4 mWorldMatrix; \n \ bool mHasDiffuseTexture; \n \ bool mHasNormalTexture; \n \ float mTextureTilingFactor; \n \ } UnifGeometryPass; \n \ \n \ uniform sampler2D unifDiffuseTexture; \n \ uniform sampler2D […]

延期照明 – 如何映射到生成的纹理?

我试图实现延期照明,我已经完成了第一次和第二次,但我被困在第三,因为我不知道如何映射从当前像素被绘制到生成的纹理与光。 用光计算生成的纹理 当前图片 我将不胜感激,如果有人能帮我弄清楚如何映射我生成的纹理与我正在绘制的当前像素。 我不知道是否重要,但是我正在使用DirectX,但是OpenGL的解释也会受到欢迎。

延迟渲染中的重叠光线平滑接缝和条带

我终于设法使用延迟渲染器在屏幕上显示多个灯光,但结果令人失望。 特别是我有严重的条带问题 除了对单个光线进行清晰的条带之外,在某些情况下重叠光线的接缝会受到干扰。 目前,我的边界球的比例是用最小光强为0.01求解二次方程,并使用每个光源的衰减项(在上面的屏幕中,每一个光都有相等的体积)。 着色器中的衰减仅为1 / (const + linear * dist + quadr * dist * dist) 。 位置是从一个32位深度缓冲区重建,照明是在视图空间。 光线通过简单的混合在一起 glEnable(GL_BLEND); glBlendEquation(GL_FUNC_ADD); glBlendFunc(GL_ONE,GL_ONE); 有没有办法轻松解决这个问题? 谢谢!

延迟着色器中的重叠表面通过彼此混合

我刚刚在我的引擎中完成了延迟着色,并且注意到当一个大对象与另一个较小的对象重叠时,它就会混合在一起。 例如,在这个场景中,我有一个大的飞机的地板,在它的上面有3个长方形的墙壁。 当从地板上方的任何地方看到这些墙壁时,可以看到地板通过墙壁混合在一起。 或者,这是一个小video剪辑,显示我的意思 我一直在关注OGLDev的系列教程,并且非常仔细地遵循了这个指南,唯一的例外就是我使用了一个基于组件的系统。 我的渲染循环的一般格式如下: 准备GBuffer 渲染传递(呈现给FBO,输出属性作为纹理) 模板通过(为模板操作提供光源对象) 光线通过(来自先前纹理的样本用于照明计算) 最终通过(退回到默认的FBO) 具体来说,在我的渲染过程中,使用几何对象(例如点光源的边界球(目前唯一实现的光源))呈现灯光。 我认为这个问题是与function有关的 glBlendFunc(GL_ONE,GL_ONE); 我可能在场景中有多个灯光,所以我需要能够将它们融合在一起,但是当我这样做的时候,我似乎也将表面混合在一起。 如果我禁用混合function,问题消失,但只有最后处理的光线将呈现。 混合函数发生在以下函数中: 照明通行证: void DLightPointComponent::LightPass(DCamera *cam, GBuffer *gbuffer) { // Obtain required objects for lighting pass PointLight point = getPointLight(); BaseLight base = point.getBaseLight(); Attenuation atten = point.getAtten(); DModelComponent *BSphere = getSphere(); DSuperShader *shader = getSuperShaderProgram(); QMatrix4x4 mat = getModelMatrix(), […]

从深度快速重建位置

我正在以高性能的方式(全屏幕后处理)从深度(通过读取深度缓冲区)重建世界空间位置(或者视图空间位置),我正在苦苦挣扎。 到目前为止,我一直在使用这种方法: vec3 calculate_world_position(vec2 texture_coordinate, float depth_from_depth_buffer) { vec4 clip_space_position = vec4(texture_coordinate * 2.0 – vec2(1.0), 2.0 * depth_from_depth_buffer – 1.0, 1.0); //vec4 position = inverse_projection_matrix * clip_space_position; // Use this for view space vec4 position = inverse_view_projection_matrix * clip_space_position; // Use this for world space return(position.xyz / position.w); } 虽然这完美的作品,但它真的很慢。 我正在寻找的方法是这样的: vec3 world_position = […]

独立的着色器程序或着色器分支?

我有一堆点灯和方向灯。 而不是检查片段着色器中的光源types,然后分支点光源计算或定向光源计算,使用两个单独的程序(一个用于点光源和一个用于定向光源)会更有效率? (在OpenGL 3.3中使用延迟着色)

在延迟着色中加速照明

我实现了一个简单的延期着色渲染器。 我使用3个G缓冲区来存储位置(R32F),正常(G16R16F)和reflection率(ARGB8)。 我使用球形地图algorithm来存储法线在世界空间。 目前我使用view *投影matrix的逆来计算每个像素从存储深度值的位置。 首先,我想避免每个像素matrix乘法计算位置。 有没有另外一种方法来存储和计算G-Buffer中的位置而不需要matrix乘法 将法线存储在视图空间中 我的引擎中的每个灯光都在世界的空间, 我想在视野中做灯光来加速我的灯光传递。 我想为我的延期引擎优化照明通行证。

在延期渲染中,实体是否可以拥有自己的着色器?

既然你需要使用通用的g-buffer着色器来填充g缓冲区,那么实体如何拥有自己的着色器,比如给出一个正常的映射function呢? 我记得,你不能同时使用两个着色器。 所以有一个可能的解决scheme,每个对象都有自己的渲染器,但是如果我必须让每个实体都有自己的渲染器,在渲染器中也包含g-buffer填充,那么不会有无处不在的g-buffer shader代码,额外的variables传递给GPU?

延迟渲染中的帧缓冲区对象中的空白纹理

我正在运行olgdev.atspace.co.uk 的教程35 ,这很奇怪,结果是一个空白的屏幕。 本教程将执行延迟着色的第一步,这意味着几何计算和光照计算的解耦。 该过程包括以下步骤。 布丁逻辑纹理到帧缓冲区对象 渲染1:只将顶点属性写入这种纹理。 渲染2:将这些纹理的数据复制到屏幕上。 在第一步,我将纹理绑定到Frame Buffer Object,如下所示: // Create the FBO glGenFramebuffers(1, &m_fbo); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo); // Create the buffer textures glGenTextures(ARRAY_SIZE_IN_ELEMENTS(m_textures), m_textures); glGenTextures(1, &m_depthTexture); //Set up texture format and bound to FBO for (unsigned int i = 0 ; i < ARRAY_SIZE_IN_ELEMENTS(m_textures) ; i++) { glBindTexture(GL_TEXTURE_2D, m_textures[i]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, WindowWidth, […]

无计算着色器的平铺延迟着色

我正在构建一个延迟渲染器,并且由于我想支持场景中的大量灯光,所以我查看了平铺延迟着色。 问题是我必须针对OpenGL 3.3硬件,它不支持GLSL计算着色器。 有没有可能实现与普通着色器平铺延迟着色?