我正在尝试在 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 位而没有其他内容,所以我想我会在这里试一试,我似乎真的无法理解这个......