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
相关产品推荐
相关产品推荐

