像素着色器射线过顶点判定异常、线宽不一致问题求助
问题背景与核心疑问
我被该问题困扰已超过一个月,亟需相关帮助。
核心校验需求:判断从名为start的顶点出发、沿direction方向的射线是否经过target点,校验需同时满足方向与距离要求。经充分调试我判断点积方案无法满足需求,现有三个具体疑问:
- 逻辑直接计算结果正常,为何在着色器中运行时结果存在差异?
- 线条理论上应保持统一粗细,为何距离越远绘制出的线条越细?
- 除我当前使用的旋转矩阵方案外,是否有其他可行的实现思路?
实现前提
- 绘制载体为全屏四边形(fSQ)
- 所有计算逻辑运行在像素着色器中
- 坐标单位规则:单位值1对应1个像素
- 运行环境屏幕分辨率为1920*1080
现有代码与异常表现
当前相交判断函数实现如下:
bool intersect(float2 target, float2 direction, float2 start) { bool intersecting = false; static const float thresholdX = 0.5 / SCREENWIDTH; static const float thresholdY = 0.5 / SCREENHEIGHT; if (direction.x == 0 && direction.y == 0); else { float2 startToTarget = target - start; float changedTargetPositionX = startToTarget.x * direction.x + startToTarget.y * direction.y; float changedTargetPositionY = startToTarget.x * (-direction.y) + startToTarget.y * direction.x; float rangeOfX = (direction.x * direction.x) + (direction.y * direction.y); if (changedTargetPositionX <= rangeOfX + thresholdX && changedTargetPositionX >= -thresholdX && changedTargetPositionY <= thresholdY && changedTargetPositionY >= -thresholdY) { intersecting = true; } } return intersecting; }
该方案通过旋转矩阵旋转向量后校验两向量差值,多数场景下运行正常,但像素差值极小时会出现判定失效:例如传入参数start = (15,0) direction= (10,0) target = (10,0)时,函数本应返回false却错误返回true,仅当像素差值较大时判定结果正常。
调试所用代码如下:
#define MAX = 5; float2 points[MAX*MAX]; for (float fi = 1; fi < MAX; fi++) for (float fj = 1; fj < MAX; fj++) points[(int)(fi * MAX + fj)] = float2(fi / MAX , fj / MAX); for(uint ni=0; ni < MAX*MAX;ni++) for(uint nj=3; nj < MAX*MAX; nj++) if (intersect(uv, points[nj]- points[ni], points[ni])) { color = float4(1, 0, 0, 1); return color; } return float4(0, 0, 0, 1);
运行上述调试代码时,线条粗细随距离增加逐渐变细,不符合所有线条保持统一粗细的预期,调试运行结果截图如下:
期待各位的解答,感谢。
内容的提问来源于stack exchange,提问作者donghyunlee
相关产品推荐
相关产品推荐

