我正在编码3D引擎,我想知道着色器程序是否始终属于特定材质。换句话说,我可以从特定材质加载特定的着色器程序实例(具有特定的行为)吗?
例如,假设我们在场景中有3个对象(一个立方体,一个球体和一个圆柱体),每个对象都有不同的阴影渲染:
因此,在这里我们可以将3种不同的材料与这些情况相关联:
对于多维数据集:
color : rgb glm::vec3(0.0f, 1.0f, 0.0f) or rgba glm::vec4(0.0f, 1.0f, 0.0f, 1.0f)
对于球体:
color : rgb glm::vec3(0.0f, 1.0f, 0.0f) or rgba glm::vec4(0.0f, 1.0f, 0.0f, 1.0f),
texture : color_map (map_Kd for example) sphere_texture.bmp
对于气缸:
color : rgb glm::vec3(0.0f, 1.0f, 0.0f) or rgba glm::vec4(0.0f, 1.0f, 0.0f, 1.0f),
texture : color_map (map_Kd for example) sphere_texture.bmp
light :
- Ka glm::vec3(0.2f, 0.2f, 0.2f) (ambient)
- Kd glm::vec3 (0.3f, 0.3f, 0.3f) (diffuse)
- Ks glm::vec3(0.6f, 0.6f, 0.6f) (specular)
因此,在这些情况下,如果我加载具有特定材质的网格,则将加载相应的着色器程序?在所有情况下都是这样吗?
您对此有何看法?
否,着色器程序不“属于”材质,而是材质是传递给着色器程序的参数,它们描述多边形的表面特性以及如何对其进行照明。
使用相同的着色器程序来渲染共享相同或相似材质的多个对象是非常普遍的。开发人员的一种流行方法是使用uber shaders,这是可以处理多种类型材料的大型参数化程序。