Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么OpenGL在使用FBO进行多重采样时会使我的场景变亮?_Opengl_Framebuffer_Multisampling - Fatal编程技术网

为什么OpenGL在使用FBO进行多重采样时会使我的场景变亮?

为什么OpenGL在使用FBO进行多重采样时会使我的场景变亮?,opengl,framebuffer,multisampling,Opengl,Framebuffer,Multisampling,我刚刚将我的OpenGL绘图代码从直接绘图切换到使用带有渲染缓冲区的离屏FBO显示。当我分配正常渲染缓冲区存储时,屏幕外FBO将正确地闪烁到屏幕 但是,当我在渲染缓冲区上启用多重采样(通过glRenderbufferStorageMultisample)时,场景中的每种颜色似乎都已变亮(从而提供与非多重采样部分不同的颜色) 我怀疑我需要设置一些glEnable选项来保持相同的颜色,但我似乎在别处找不到任何关于这个问题的提及 有什么想法吗?我偶然发现了同样的问题,因为由于样本位置不匹配而缺乏适当的

我刚刚将我的OpenGL绘图代码从直接绘图切换到使用带有渲染缓冲区的离屏FBO显示。当我分配正常渲染缓冲区存储时,屏幕外FBO将正确地闪烁到屏幕

但是,当我在渲染缓冲区上启用多重采样(通过
glRenderbufferStorageMultisample
)时,场景中的每种颜色似乎都已变亮(从而提供与非多重采样部分不同的颜色)

我怀疑我需要设置一些
glEnable
选项来保持相同的颜色,但我似乎在别处找不到任何关于这个问题的提及


有什么想法吗?

我偶然发现了同样的问题,因为由于样本位置不匹配而缺乏适当的下采样。对我起作用的是:

  • 一个单独的“单一样本”FBO,具有相同的附件、格式和尺寸(附加纹理或渲染缓冲区),用于blit到中进行下采样,然后将其绘制/blit到窗口缓冲区
  • 通过使用GLSL片段着色器传递每个片段的所有对应样本,渲染到具有与输入具有相同样本计数的多样本纹理的多样本窗口缓冲区中。这在启用采样着色的情况下起作用,是延迟着色的过度使用方法,因为您可以计算每个采样的灯光、阴影、AO等
  • 我还使用GLSL对单样本帧缓冲区进行了相当草率的手动下采样,我必须使用
    texelFetch()
    分别获取每个样本
多重采样的速度非常慢。尽管CSAA的性能比MSAA好,但我建议在性能出现问题或需要新的扩展(如ARB\u texture\u multisample)不可用时,将FXAA着色器作为一种重要的后处理选择

访问GLSL中的样本:

vec4 texelDownsampleAvg(sampler2DMS sampler,ivec2 texelCoord,const int sampleCount)
{
    vec4 accum = texelFetch(sampler,texelCoord,0);
    for(int sample = 1; sample < sampleCount; ++sample) {
        accum += texelFetch(sampler,texelCoord,sample);
    }
    return accum / sampleCount;
}
13) BlitFramebuffer颜色空间转换应如何进行 明确规定?我们是否允许上下文钳制状态影响 布利特

Resolved: Blitting to a fixed point buffer always clamps,
blitting to a floating point buffer never clamps.  The context
state is ignored.

我偶然发现了同样的问题,原因是由于样本位置不匹配而缺乏适当的下采样。对我起作用的是:

  • 一个单独的“单一样本”FBO,具有相同的附件、格式和尺寸(附加纹理或渲染缓冲区),用于blit到中进行下采样,然后将其绘制/blit到窗口缓冲区
  • 通过使用GLSL片段着色器传递每个片段的所有对应样本,渲染到具有与输入具有相同样本计数的多样本纹理的多样本窗口缓冲区中。这在启用采样着色的情况下起作用,是延迟着色的过度使用方法,因为您可以计算每个采样的灯光、阴影、AO等
  • 我还使用GLSL对单样本帧缓冲区进行了相当草率的手动下采样,我必须使用
    texelFetch()
    分别获取每个样本
多重采样的速度非常慢。尽管CSAA的性能比MSAA好,但我建议在性能出现问题或需要新的扩展(如ARB\u texture\u multisample)不可用时,将FXAA着色器作为一种重要的后处理选择

访问GLSL中的样本:

vec4 texelDownsampleAvg(sampler2DMS sampler,ivec2 texelCoord,const int sampleCount)
{
    vec4 accum = texelFetch(sampler,texelCoord,0);
    for(int sample = 1; sample < sampleCount; ++sample) {
        accum += texelFetch(sampler,texelCoord,sample);
    }
    return accum / sampleCount;
}
13) BlitFramebuffer颜色空间转换应如何进行 明确规定?我们是否允许上下文钳制状态影响 布利特

Resolved: Blitting to a fixed point buffer always clamps,
blitting to a floating point buffer never clamps.  The context
state is ignored.

    • 对我有效的解决方案是更改renderbuffer颜色格式。我选择了<代码> GLY-RGBA32 F/<代码>和代码> GLY-DEXTHORGRONTRONETFICE 32 F (我想最高精度),英伟达驱动程序解释不同(我怀疑SRGB补偿,但我可能错了)。
      我发现有效的渲染缓冲图像格式是
      GL\u RGBA8
      GL\u DEPTH\u组件24

      对我有效的解决方案是更改渲染缓冲颜色格式。我选择了<代码> GLY-RGBA32 F/<代码>和代码> GLY-DEXTHORGRONTRONETFICE 32 F (我想最高精度),英伟达驱动程序解释不同(我怀疑SRGB补偿,但我可能错了)。
      我发现的renderbuffer图像格式是
      GL_RGBA8
      GL_DEPTH\u component 24

      你能提供问题的快照和预期的正确结果吗?你能提供问题的快照和预期的正确结果吗?听起来,好像这个格式等于你窗口的像素格式,如您所述,颜色格式转换可能是原因。我已经使用GLSL片段将RGB16F转换为RGB8,其中可以隐含转换。即便如此,我也看不出sRGB的原因,因为这一定是一个驱动程序优化错误,因为sRGB有专用的扩展。那是我不理解的部分。你的解决方案比我需要的更能解决问题,但它是更正确的答案。我不认为我的答案是正确的,只要我自己不知道确切的原因。使用GLSL进行下采样是一种效率较低的解决方法,而不是我认为的“最先进的技术”。另一个想法是,alpha值会发生什么变化?是否有任何混合或阿尔法测试/功能处于活动状态?如果渲染为多采样RGB32F或禁用这些测试,会发生什么?我会尽快尝试。听起来,好像这个格式等于你的窗口的像素格式,颜色格式转换可能是你所说的原因。我已经使用GLSL片段将RGB16F转换为RGB8,其中可以隐含转换。即便如此,我也看不出sRGB的原因,因为这一定是一个驱动程序优化错误,因为sRGB有专用的扩展。那是我不理解的部分。你的解决方案比我需要的更能解决问题,但这是更正确的答案。我不知道