当前位置: 首页 > 知识库问答 >
问题:

使用带多采样延迟渲染中断的sampler2DShadow

杭柏
2023-03-14

正如标题所述,使用sampler2DShadow会导致我的多采样FBO的照明着色器出错,但我无法检测到该问题,因为使用标准延迟渲染设置(无多采样)的配置非常类似,这很好。

openlGL中的sampler2DShadow和多采样是否存在兼容性问题,或者我应该使用的一些替代方案?

着色器编译得很好。

在我运行这行代码之前,代码运行良好:

texture(gShadowMap2D, vec3(pCoord.xy, (pCoord.z) / pCoord.w));

并检索结果。然后我得到GL_无效的_操作。

阴影贴图来自定向光(深度贴图有效且可见)并使用GL_COMPARE_R_TO_TEXTURE,设置为标准纹理(GL_TEXTURE_2D)。

多采样延迟FBO纹理使用GL_TEXTURE_2D_MULTISAMPLE。

我使用的是glsl 330(openGL 3.3核心配置文件)。

我认为问题与从多采样片段着色器中的位置贴图获取世界位置有关。

标准方式:

vec3 worldPos = texture(gPositionMap, texCoord).xyz;

多采样方式:

vec2 texCoordMS = floor(vertTextureSize * texCoord.xy);

for(int i = 0; i < samples; i++)
{
    worldPos += texelFetch(gPositionMapMS, ivec2(texCoordMS), i).xyz;
}

worldPos = worldPos / samples;

(我省略了其他采样器。)

我猜我在尝试访问sampler2DShadow时抛出了错误(pCoord是使用worldPos计算的)。

现在想知道如何让这个多样本worldPos获得与标准html" target="_blank">方法相同的结果???

标准方式(mDepthVP=mat4(灯光深度视图程序):

vec4 coord = gLight.mDepthVP * vec4(worldPos, 1.0);

共有1个答案

曹奇文
2023-03-14

好吧,在我几乎把头发拔出来拼命寻找一个关于为什么会发生这个问题的提示后,我终于找到了答案,但我不完全确定它为什么会导致这个问题。

在几何过程中(在照明过程之前),模型会按照您所期望的位置、颜色(漫反射)、法线和深度模板进行渲染。在此过程中,绑定纹理(网格的漫反射纹理),但仅作为单元零(GL_TEXTURE0)的标准纹理(GL_TEXTURE_2D)(我现在只使用漫反射)。

我在系统工作时就这样离开了它,因为当它绑定四个FBO纹理进行读取时,照明过程会覆盖该单元。然而,在多采样FBO中,它们被绑定为多采样纹理(GL_纹理_2D_多采样),碰巧“位置”贴图使用的是单位零(GL_纹理0)。

由于某种原因,这没有从几何传递中覆盖先前绑定的单元并导致GL_INVALID_OPERATION错误。调用后:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0); 

几何通过后,问题就消失了。

我问的问题归结为“为什么它没有覆盖?”

 类似资料:
  • 问题内容: 我有一个React组件,其中有许多子组件。我不希望立即渲染子组件,而是要经过一段时间的延迟(对于每个子组件而言,它们是统一的还是不同的)。 我想知道-有没有办法做到这一点? 问题答案: 我认为最直观的方法是给孩子一个“ wait” ,在从父代传递过来的持续时间内隐藏该组件。通过将默认状态设置为隐藏,React仍会立即渲染组件,但是直到状态更改后它才可见。然后,您可以设置为调用一个函数,

  • 我为我的草图创建了一个简单的延迟函数,并试图使用它,但似乎渲染停止了,也就是说,有一个简单的灰色屏幕,然后一切都被一次渲染。 有人能告诉我我在哪里吗出错了?到底发生了什么? 如何在内部定义绘制()和设置()?我知道,set()是一个一次性的渲染和绘制(),就像一个无限的循环。 代码:

  • 到目前为止我们实现的延迟渲染效果还算不错,但是当你将相机靠近物体观察时会出现在上一课的结尾提到的问题。第一个问题就是由于背面剔除的存在,当相机进入到光源体之后这个光源的光照效果就会消失。第二个问题则与光源的范围有关,这是因为在将光源的包围球投影到屏幕坐标系之后,我们会对被这个球体覆盖的所有像素都进行光照计算,即使这个像素离光源很远(也就是位于光源体之外)。 OpenGL 中的模板缓存可以帮助我们解

  • 在前面的课程中我们学习了延迟渲染的基础部分,而且将几何阶段的结果输出到了 G-Buffer 中。如果你运行了演示程序你就知道 G-Buffer 里面的内容是什么了。今天我们将完成延迟渲染的基本实现,并且使得最后渲染出来的场景看起来和使用正向渲染的结果一样!在这一课的最后会有一个问题显现出来,这个问题将在下一课中解决。 现在 G-buffer 中已经存放和合适的数据,我们要借助于它们来进行光照计算。

  • 从第十七课起到目前为止,我们所做的光照计算都叫做前向渲染(着色),这是一个十分直接的方式,我们在 VS 中对所有对象的顶点进行一系列的变换(这些变换通常是将顶点法线和顶点位置变换到裁剪空间中),之后在 FS 中逐像素进行光照计算。由于每个像素都只调用 FS 一次,所以当我们逐像素的计算每个像素的光照效果时,我们需要将所有的光照信息都传递到 FS 中。这个方法十分简单但是却有一些缺陷,如果场景十分复

  • 什么叫中断延迟 所谓中断延迟,其实在编写裸机程序中经常被用到,我们时常需要靠中断来捕获相关的数据或者事件输入,然后在中断中置起相关标志位,在主函数中的死循环中检查这个标志位,如果置起,说明中断发生了,然后进行相应的处理。与之类似的,freeRTOS的中断延迟是一个道理,中断服务函数不做相关的处理,而是由随后运行的任务来处理,这相比直接在中断服务函数中处理会有一个延迟,好处是不会占用太多的中断时间,