gpt4 book ai didi

c++ - 延迟 MSAA 伪造

转载 作者:太空狗 更新时间:2023-10-29 23:11:55 26 4
gpt4 key购买 nike

这是我渲染场景的过程:

  • 绑定(bind) MSAA x4 GBuffer(4 种颜色附件、位置、法线、颜色和无光照颜色(仅天空盒。我还有一个深度组件/纹理)。
  • 绘制天空盒
  • 绘制地理
  • 将所有颜色和深度分量 block 传输到单个样本 FBO
  • 应用光照(我使用深度纹理通过检查深度纹理值是否小于 1 来检查它是否应该被点亮)。
  • 渲染四边形

这就是正在发生的事情:

Single-Sample Multi-Sample

如您所见,我在边缘周围得到了这些白色和黑色的人工制品,而不是光滑的边缘。 (值得一提的是,如果我移除照明并只在没有照明的情况下渲染纹理,我不会得到它并且它会正确平滑)。

这是我的着色器(它实现了 SSAO,但似乎对此没有影响)。

#version 410 core
in vec2 Texcoord;
out vec4 outColor;
uniform sampler2D texFramebuffer;
uniform sampler2D ssaoTex;

uniform sampler2D gPosition;
uniform sampler2D gNormal;
uniform sampler2D gAlbedo;
uniform sampler2D gAlbedoUnlit;
uniform sampler2D gDepth;

uniform mat4 View;
struct Light {
vec3 Pos;
vec3 Color;
float Linear;
float Quadratic;
float Radius;
};

const int MAX_LIGHTS = 32;
uniform Light lights[MAX_LIGHTS];
uniform vec3 viewPos;

uniform bool SSAO;

void main()
{
vec3 color = texture(gAlbedo, Texcoord).rgb;
vec3 colorUnlit = texture(gAlbedoUnlit, Texcoord).rgb;
vec3 pos = texture(gPosition, Texcoord).rgb;
vec3 norm = normalize(texture( gNormal, Texcoord)).rgb;
vec3 depth = texture(gDepth, Texcoord).rgb;
float ssaoValue = texture(ssaoTex, Texcoord).r;

// then calculate lighting as usual
vec3 lighting;
if(SSAO)
{
lighting = vec3(0.3 * color.rgb * ssaoValue); // hard-coded ambient component
}
else
{
lighting = vec3(0.3 * color.rgb); // hard-coded ambient component
}
vec3 posWorld = pos.rgb;

vec3 viewDir = normalize(viewPos - posWorld);

for(int i = 0; i < MAX_LIGHTS; ++i)
{

vec4 lightPos = View * vec4(lights[i].Pos,1.0);
vec3 normLight = normalize(lightPos.xyz);
float distance = length(lightPos.xyz - posWorld);
if(distance < lights[i].Radius)
{
// diffuse
vec3 lightDir = normalize(lightPos.xyz - posWorld);
vec3 diffuse = max(dot(norm.rgb, lightDir), 0.0) * color.rgb *
lights[i].Color;

float attenuation = 1.0 / (1.0 + lights[i].Linear * distance + lights[i].Quadratic * distance * distance);
lighting += (diffuse*attenuation);
}
}

if(depth.r >= 1)
{
outColor = vec4(colorUnlit, 1.0);
}
else
{
outColor = vec4(lighting, 1.0);
}

}

所以最后一个 if 语句检查它是否在深度纹理中,如果它在应用光照,如果不在则只绘制天空盒(这样光照就不会应用到天空盒)。

我花了几天时间试图解决这个问题,通过比较法线、位置和深度来改变检查它是否应该是光的方式,将格式更改为更高分辨率(例如使用 RGB16F 而不是 RGB8 等)但是我无法弄清楚是什么原因造成的,并且对每个样本进行照明(使用纹素获取)将是密集的方式。

有什么想法吗?

最佳答案

这个问题现在有点老了,但我想我会说我是如何解决我的问题的。

我在我的着色器中运行基本的 Sobel 过滤器,我用它来绘制屏幕空间轮廓,但除此之外,我还检查是否启用了 MSAA,如果启用了,计算边缘像素周围每个纹素的光照!

关于c++ - 延迟 MSAA 伪造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49063871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com