Opengl 着色器程序是否属于特定材质,反之亦然?

Opengl 着色器程序是否属于特定材质,反之亦然?,opengl,3d,Opengl,3d,我正在编写一个3D引擎,我想知道着色器程序是否总是属于特定的材质。换句话说,我可以从特定材质加载特定着色器程序实例(具有特定行为)吗 例如,假设场景中有3个对象(立方体、球体和圆柱体),每个对象都使用不同的着色进行渲染: 具有简单“颜色”着色的立方体 具有“纹理颜色”着色的球体 使用“ADS纹理颜色”(环境光、漫反射光、镜面反射光)着色(灯光)渲染的圆柱体 因此,在这里,我们可以将三种不同的材料与这些案例联系起来: 对于多维数据集: color : rgb glm::vec3(0.0f, 1

我正在编写一个3D引擎,我想知道着色器程序是否总是属于特定的材质。换句话说,我可以从特定材质加载特定着色器程序实例(具有特定行为)吗

例如,假设场景中有3个对象(立方体、球体和圆柱体),每个对象都使用不同的着色进行渲染:

  • 具有简单“颜色”着色的立方体
  • 具有“纹理颜色”着色的球体
  • 使用“ADS纹理颜色”(环境光、漫反射光、镜面反射光)着色(灯光)渲染的圆柱体
因此,在这里,我们可以将三种不同的材料与这些案例联系起来:

对于多维数据集:

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着色器,这是一种大型参数化程序,可以处理多种类型的材质。

为什么在这里列出unity3d标记?此外,这个问题还很不清楚。你在说什么材料。关于固定功能材料?那么它与着色器无关。如果你在谈论发动机的材料。。。嗯,哥们,你在这里问这样一个问题真奇怪。材质表示所有数据(颜色、纹理、灯光组件),这些数据定义了对象(网格)的环绕以及它对灯光的响应方式(环境光、漫反射光、镜面反射光和反光组件)。这些信息必须发送到着色器程序。因此着色器程序需要材质。因此,它们之间存在交互作用。可以对同一着色器使用多个纹理/参数。如果将统一名称、顶点属性和纹理单位标准化,还可以对同一材质使用多个着色器(尽管我不确定这会有什么用途)。你想在引擎里做什么取决于你自己。