You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GLSL ES光线步进SDF自定义相机配置失效,求问题排查

光线步进SDF相机配置问题排查

我在Shadertoy的GLSL ES中研究光线步进SDF,定义了如下相机参数:

vec2 VISIBLE_SIZE = vec2( 20.0, 15.0 );     // 场景中可见的世界范围尺寸
vec3 CAM_POI      = vec3( 0.0,0.0,0.0 );    // 场景兴趣点
vec3 CAM_UP       = vec3( 0.0,1.0,0.0 );    // 相机上方向
vec3 CAM_DIR      = vec3( 0.0,0.0,1.0 );    // 相机前方向
float CAM_FL      = 2.5;                    // 相机焦距

基于上述参数推导并编写了相机配置代码:

//+ -VS.x/2   + POI       + VS.x/2          || 其中 d = length( POI - cam ):
// \          |          /                  || -----------------------------
//  \         |         /                   || VS.x/2    1
//   \        |        /                    || ------ = --  =>  d = fl * VS.x / 2
//    \       |       /                     ||   d      FL
//     \      |      /                      || 
//      \     |     /                       || 对两个维度:d = fl*VS/2 得到vec2
//       \    |    /                        || => 选哪个d?取两者最大值:d = max( fl*VS.x/2, fl*VS.y/2 )
//   -1.0 +   +   + 1.0                     || 
//         \  |  /                          || 因此相机原点为 POI - d * CAM_DIR
//          \f|l/                           || 同时需要用宽高比调整VS.x!
//           \|/                            || 
//            + cam                         || 

vec2 vis = CAM_FL * VISIBLE_SIZE * vec2( uResolution.y / uResolution.y, 1. ) / 2.0;
float d = max( vis.x, vis.y );

// 计算相机位置
vec3 ro = CAM_POI - d * CAM_DIR

// 构建坐标系基向量
vec3 forward = normalize( CAM_DIR );
vec3 right = cross( CAM_UP, forward );
vec3 up = cross( forward, right );

// 计算屏幕中心交点
vec3 sc = CAM_POI + forward * ( CAM_FL - d );
// 应用UV得到当前像素的交点
vec3 ip = sc + ndc.x * right + ndc.y * up;
// 计算光线方向:相机原点到交点
rd = normalize( ip - ro );
// 忽略相机到屏幕之间的区域,将光线起点设为交点
ro = ip;

手动计算示例结果看似合理:

vis:        2.5 * (20.0) * (600./800.) / 2.0    = ( 18.75 )
                  (15.0)   (1.)                   ( 18.75 )
d:          max( 18.75, 18.75 )                 = 18.75
ro:         (0,0,0) - (0,0,1)*18,75             = ( 0, 0, -18.75 )
forward:                                        = ( 0, 0, 1 )
right:      cross( ( 0,1,0 ), ( 0,0,1 ) )       = ( 1, 0, 0 )
up:         cross( ( 0,0,1 ), ( 1,0,0 ) )       = ( 0, 1, 0 )
sc:         ( 0,0,0 ) + ( 0,0,1 )*( 2.5-18.75 ) = ( 0, 0, -16.25 )
ip: with ndc=(1,1) 
            ( 0, 0, -16.25 ) + ( 1, 1, 0 )      = ( 1, 1, -16.25 )
rd:    norm(( 1, 1, -16.25 ) - ( 0, 0, -18.75 ))= normalize( 1, 1, 2.5 ) = ( 0.34816, 0.34816, 0.87039 )
ro:                                             = ( 1, 1, -16.25 )

但实际运行后相机配置不生效,效果不符合预期,恳请帮忙排查代码中的问题!

内容的提问来源于stack exchange,提问作者St0fF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:35:38