悉野小楼

导航

材质, 纹理, shader之间的关系

可以把“材质、纹理、Shader”理解为决定物体“看起来什么样”的三层结构
材质 = 配置文件,纹理 = 贴图数据,Shader = 计算规则。三者缺一不可,又各司其职。

一、纹理(Texture):表面的“像素数据”

1. 纹理是什么

  • 纹理本质上是一张或多张图像(像素数组)
  • 它不关心“怎么用”,只负责存储颜色/数值信息,供 GPU 读取。

2. 常见纹理类型

 
纹理类型
作用
漫反射纹理(Albedo/Base Color)
表面基础颜色,如皮肤色、木头纹路
法线纹理(Normal Map)
扰动法线方向,模拟凹凸细节
粗糙度 / 光泽度纹理
控制表面粗糙还是光滑
金属度纹理(Metallic)
区分金属 / 非金属区域
AO 纹理(Ambient Occlusion)
阴影遮蔽,增强缝隙暗部
高度 / 置换纹理
实际移动顶点,产生几何起伏
可以把纹理理解为:给 Shader 准备的“原材料”

二、Shader:渲染计算的“程序算法”

1. Shader 是什么

  • Shader 是运行在 GPU 上的小程序
  • 它定义了:
    • 顶点如何变换(Vertex Shader)
    • 每个像素最终颜色怎么算(Fragment/Pixel Shader)

2. Shader 的核心职责

  • 读取纹理中的数值
  • 结合光照模型(如 Blinn-Phong、PBR)
  • 计算最终显示在屏幕上的颜色
示例简化逻辑:
 
输入:
  - 顶点位置
  - 法线
  - 纹理坐标
  - 纹理(Albedo、Normal 等)
  - 光源信息

输出:
  - 每个像素的颜色
 
 
Shader 不存“具体长什么样”,它只规定“如果有这些数据,该怎么算”

三、材质(Material):连接纹理和 Shader 的“配置表”

1. 材质是什么

  • 材质是一个资源/参数集合
  • 它的作用是:
    • 指定使用哪个 Shader
    • 为这个 Shader 提供具体的纹理和参数值

2. 材质中包含的内容

  • Shader 引用(例如:PBRShader
  • 纹理赋值:
    • Albedo Map = “Wood.png”
    • Normal Map = “Wood_Normal.png”
  • 标量参数:
    • 金属度 = 0.2
    • 粗糙度 = 0.6
    • 自发光强度 = 1.5
材质相当于:“用这个 Shader + 这些贴图 + 这些数值,去画这个物体”

四、三者关系总结(核心理解)

一句话概括:
Shader 决定“计算方法”,纹理提供“输入数据”,材质把两者绑定在一起并应用到具体物体。

工作流程示意

 
模型 Mesh
   ↓
材质 Material
   ├─ 使用 Shader(算法)
   └─ 提供 Texture(数据)
        ↓
    GPU 执行 Shader
        ↓
    屏幕像素颜色
 
 

五、一个直观类比:画画

 
图形概念
现实类比
模型
画布形状(画在纸上还是木板上)
纹理
颜料、照片素材
Shader
绘画技法(水彩、油画、素描)
材质
整幅画的“配方”:用什么技法 + 什么颜料

六、常见误区澄清

  1. “材质就是贴图?”
    错。材质可能包含贴图,但也包含 Shader 和大量参数。
  2. “Shader 里已经写了贴图,还要材质干嘛?”
    Shader 只是声明“我需要一张贴图”,真正指定“用哪一张”的是材质。
  3. “同一个 Shader,不同物体看起来不一样?”
    因为材质不同(贴图或参数不同),Shader 是复用的。
 

posted on 2026-05-11 16:54  悉野  阅读(68)  评论(0)    收藏  举报