gpt4 book ai didi

opengl - SSLR(屏幕空间局部反射)跟踪不正确

转载 作者:行者123 更新时间:2023-12-02 03:55:31 29 4
gpt4 key购买 nike

在实现 SSLR 时,我遇到了错误显示对象的问题:它们无限地“向下”投影,并且在镜子中根本没有显示。我在下面给出了代码和屏幕截图。

片段 SSLR 着色器:

#version 330 core

uniform sampler2D normalMap; // in view space
uniform sampler2D depthMap; // in view space
uniform sampler2D colorMap;
uniform sampler2D reflectionStrengthMap;
uniform mat4 projection;
uniform mat4 inv_projection;

in vec2 texCoord;

layout (location = 0) out vec4 fragColor;

vec3 calcViewPosition(in vec2 texCoord) {
// Combine UV & depth into XY & Z (NDC)
vec3 rawPosition = vec3(texCoord, texture(depthMap, texCoord).r);

// Convert from (0, 1) range to (-1, 1)
vec4 ScreenSpacePosition = vec4(rawPosition * 2 - 1, 1);

// Undo Perspective transformation to bring into view space
vec4 ViewPosition = inv_projection * ScreenSpacePosition;

// Perform perspective divide and return
return ViewPosition.xyz / ViewPosition.w;
}

vec2 rayCast(vec3 dir, inout vec3 hitCoord, out float dDepth) {
dir *= 0.25f;

for (int i = 0; i < 20; i++) {
hitCoord += dir;

vec4 projectedCoord = projection * vec4(hitCoord, 1.0);
projectedCoord.xy /= projectedCoord.w;
projectedCoord.xy = projectedCoord.xy * 0.5 + 0.5;

float depth = calcViewPosition(projectedCoord.xy).z;
dDepth = hitCoord.z - depth;

if(dDepth < 0.0) return projectedCoord.xy;
}

return vec2(-1.0);
}

void main() {
vec3 normal = texture(normalMap, texCoord).xyz * 2.0 - 1.0;
vec3 viewPos = calcViewPosition(texCoord);

// Reflection vector
vec3 reflected = normalize(reflect(normalize(viewPos), normalize(normal)));

// Ray cast
vec3 hitPos = viewPos;
float dDepth;
float minRayStep = 0.1f;
vec2 coords = rayCast(reflected * max(minRayStep, -viewPos.z), hitPos, dDepth);
if (coords != vec2(-1.0)) fragColor = mix(texture(colorMap, texCoord), texture(colorMap, coords), texture(reflectionStrengthMap, texCoord).r);
else fragColor = texture(colorMap, texCoord);
}

截图: sslr

此外,灯根本不反射

我将感谢您的帮助

更新:

颜色映射:cm

法线贴图:nm

深度图:dm

更新:我用错误的反射解决了问题,但仍然存在问题。

我解决如下:ViewPosition.y *= -1

现在,正如您在屏幕截图中看到的那样,由于某种原因,对象的下部部分没有被反射。 screenshot

问题仍然悬而未决。

最佳答案

我也在努力获得一个好的ssr。我发现有两件事可以提供帮助。

  1. 要获得 View 空间法线,您必须仅保留相机的旋转并删除平移,因为如果不这样做,您将得到法线拉伸(stretch)到相机移动的相反方向,并且将不再即使您再次标准化它们,也有正确的方向,对于列主要 mat4,您可以这样做:

    mat4 viewNoTranslation = View ;viewNoTranslation[3] = vec4(0.0, 0.0, 0.0, 1.0);

  2. 深度图像的深度采样是对数的,如果将其线性化,您确实会得到从 0 到 1 的值,但它们对于所需的精度来说是不准确的。我尝试直接从顶点着色器获取深度值:

    gl_Position = ubo.projection * ubo.view * ubo.model * inPos;深度= gl_Position.z;

我不知道这是否正确,但现在的深度更准确。

如果您取得进展,请更新:)

关于opengl - SSLR(屏幕空间局部反射)跟踪不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53145377/

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