OpenGL ES中vertex shader阶段实现图元裁剪的最优方案咨询
方案优先级排序(适配你的需求,尤其满足tiled renderer分箱前丢弃的要求)
你的前提非常关键:同一图元所有顶点的裁剪判断结果完全一致,不存在部分顶点需要裁剪、部分不需要的情况,所以可以直接参考下面的方案选择逻辑:
1. 首选方案:操作标准裁剪距离内置变量
直接用图形API规范定义的裁剪距离变量即可,这是兼容性最好、最符合硬件设计逻辑的方案:
- OpenGL/Vulkan 环境下给所有待裁剪顶点的
gl_ClipDistance[0]赋值为-1,Direct3D 环境下赋值SV_ClipDistance[0]为-1,不需要修改gl_Position/SV_POSITION本身。 - 所有符合API规范的GPU(包括所有采用tiled renderer架构的移动端/主机端GPU)都会在顶点处理完成后、图元进入分箱阶段前,直接识别到裁剪距离为负的图元,直接整体丢弃,完全不会进入后续的分箱、光栅化流程,完美满足你不占用分箱资源的要求。
- 没有边界判定问题,不会出现漏裁、误裁的情况。
2. 次选方案:将clip position赋值为vec4(0.0, 0.0, 0.0, 0.0)
如果因为API版本限制、渲染管线配置限制不能启用裁剪距离功能,选这个方案,不要用(1.0, 1.0, 1.0, 1.0):
(1.0, 1.0, 1.0, 1.0)是clip空间的合法边界坐标,部分GPU的裁剪逻辑会把边界坐标判定为可见,导致漏裁,而且该坐标会正常参与后续的裁剪计算、分箱计算,浪费tiled架构的缓存和带宽。(0.0, 0.0, 0.0, 0.0)的w分量为0,属于无效齐次坐标,GPU在图元组装阶段就会直接判定整个图元无效并丢弃,不会进入后续的裁剪、分箱流程,主流tiled GPU都会在分箱前直接过滤掉这类图元。- 仅有的小缺点是极少数老旧移动GPU对w=0的顶点处理存在异常,主流设备无问题。
注意:不要采用“将顶点移动到远/近平面外”之类的方案,这类合法的clip坐标还是会被GPU纳入分箱计算逻辑,占用tiled renderer的分箱资源,不符合你的需求。
内容的提问来源于stack exchange,提问作者matthias_buehlmann
相关产品推荐
相关产品推荐

