1

我正在尝试在 GLSL 中实现“尽可能简单”的 SSR。有人可以帮我设置一个非常基本的ssr代码吗?

我不需要(目前)任何粗糙度/金属度计算,没有菲涅尔,没有淡入淡出效果,没有什么花哨的——我只想要最简单的设置,我可以理解、学习并可能在以后改进。

我有 4 个源纹理:颜色、位置、法线和上一个最终帧图像的副本(反射)

attributes.position是位置纹理 (FLOAT16F) - WorldSpace

attributes.normal是法线纹理 (FLOAT16F) - WorldSpace

sys_CameraPosition是眼睛在WorldSpace中的位置

rd应该是WorldSpace中的反射方向

texture(SOURCE_2, projectionCoord.xy)是当前反射目录端点的位置纹理

vec3 rd = normalize(reflect(attributes.position - sys_CameraPosition, attributes.normal));

vec2 uvs;
vec4 projectedCoord;

for (int i = 0; i < 10; i++)
{
    // Calculate screen space position from ray's current world position:
    projectedCoord = sys_ProjectionMatrix * sys_ViewMatrix * vec4(attributes.position + rd, 1.0);
    projectedCoord.xy /= projectedCoord.w;
    projectedCoord.xy = projectedCoord.xy * 0.5 + 0.5;

    // this bit is tripping me up
    if (distance(texture(SOURCE_2, projectedCoord.xy).xyz, (attributes.position + rd)) > 0.1)
        rd += rd;
    else
        uvs = projectedCoord.xy;
        break;
}

out_color += (texture(SOURCE_REFL, uvs).rgb);

这甚至可能,使用世界空间坐标吗?当我将第一遍的输出与 viewMatrix 以及 modelMatrix 相乘时,我的光照计算就会上升,因为它们也在 worldSpace 中......

不幸的是,互联网上没有基本的 SSR 教程,只解释了 SSR 位而没有其他内容,所以我想我会在这里试一试,我似乎真的无法理解这个......

4

0 回答 0