【Unity Shader编程】之图元装配与光栅化

[复制链接]
发表于 2025-10-29 08:40:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
实验方式:主动完成
图元装配主动化流程
顶点坐标存入装配区 → 按绘制模式毗连顶点 → 天生完备多少图元
示例:gl.drawArrays(gl.TRIANGLES,  0, 3)主动天生三角形
会主动主动裁剪超出屏幕范围(NDC空间外)的三角形,仅生存可见部分


光栅化
将多少图元转换为屏幕上的片断(Fragment),即潜伏的像素候选
在此阶段举行插值盘算(如纹理坐标、颜色插值)
光栅化阶段焦点步调详解
一、空间转换阶段

  • 齐次裁剪空间 → NDC空间
    通过透视除法将顶点坐标归一化至[-1,1]范围(OpenGL/Unity)或[0,1]范围(Direct3D)
    x_ndc = x_clip / w_clip,y_ndc = y_clip / w_clip
  • 视口变动
    将NDC坐标映射到屏幕坐标系:
    1. x_{screen} = (x_{ndc} + 1) * 0.5 * screenWidth
    2. y_{screen} = (1 - y_{ndc}) * 0.5 * screenHeight
    复制代码
    生存z值用于深度测试

二、图元处理处罚阶段
3. 三角形设置

  • 输入:屏幕坐标下的三个顶点
  • 盘算三角形边方程、法线方向
  • 构建三角形困绕盒(Bounding Box)确定潜伏覆盖像素范围

  • 三角形遍历

    • 遍历困绕盒内全部像素
    • 通过重心坐标判断像素是否在三角形内:
      1. α + β + γ = 1 \quad (α,β,γ ≥ 0)
      复制代码
    • 天生片元(Fragment)数据


三、数据插值阶段
5. 属性插值盘算

  • 使用透视校正插值(Perspective-Correct Interpolation):
    1. f = \frac{αf_0/w_0 + βf_1/w_1 + γf_2/w_2}{α/w_0 + β/w_1 + γ/w_2}
    复制代码
  • 对UV坐标、法线、深度等顶点属性举行插值

四、优化处理处罚阶段
6. 裁剪与反面消隐

  • 视锥文体剪:剔除屏幕外图元
  • 反面剔除:通过三角形法线与视线的夹角判断可见性
    if(dot(normal, viewDir) < 0) cull;

  • 深度测试(Z-Test)

    • 比力片元深度值与深度缓冲区
    • 采取LESS/EQUAL等比力规则决定是否更新像素


五、像素天生阶段
8. 片断着色处理处罚

  • 输入插值后的片元属性
  • 实验光照盘算(Phong/BRDF等模子)
  • 纹理采样与颜色混淆

  • 输出归并

    • Alpha混淆:finalColor = srcColor * alpha + dstColor * (1-alpha)
    • 写入帧缓冲(思量颜色缓冲、深度缓冲、模板缓冲)


关键技能与留意事项

  • 抗锯齿处理处罚:MSAA通过子采样提升边沿质量
  • Early-Z优化:在片元着色前实验深度测试,镌汰无效盘算
  • 透视失真:必须使用透视校正插值制止纹理扭曲
  • 困绕盒优化:通过min/max盘算镌汰遍历范围
根据Unity官方数据,公道优化的光栅化流程可使移动端渲染服从提升40%+。发起联合工具举行分阶段性能分析。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表