マテリアルとシェーダーの違い


27

ゲームでは、マテリアルはオブジェクトの視覚的な外観にのみ影響を与えることがよくあります。視覚的な外観はシェーダーによって影響を受けます。では、用語に関して、マテリアルとシェーダーには違いがありますか?1つのマテリアルに対して1つのシェーダーを作成する必要がありますか?


1
マテリアルがシェーダー+拡散テクスチャ+バンプマップであるいくつかのエンジンを見てきましたが、1つの簡潔な定義があるとは思いません。
ロイT.

3
@RoyT。これらのエンジンは用語を誤用しているでしょう。材料は、と等価ではないシェーダシェーダは、 - プログラム材料は、データ値の束です。2つの異なるシェーダープログラムが同じマテリアルをレンダリングし、異なる結果を得ることができます。
ボボボボ

@boboboboまたはより一般的には、単一のシェーダーを使用して、さまざまなテクスチャ、パラメーター値などをプラグインすることにより、多くのマテリアルをレンダリングします。
ネイサンリード

回答:


29

マテリアルは、指定されたマテリアルの表面がどのように見えるかを記述する属性の組み合わせです。

一部のエンジンは、マテリアルごとに異なるシェーダーを使用します。その場合、マテリアル定義は次のようになります。

[Material]
Shader=NormalMappedSpecular.glsl
Texture1=Rock.png
Texture2=RockNormal.png
Texture3=RockSpecular.png

他のエンジンは、すべてのオブジェクトに対して1つのシェーダーを使用します(または、パラメーター、GPUの機能、距離などの他の要因に応じて、使用するシェーダーをエンジンが決定します)。この場合、マテリアルは次のようになります。

[Material]
Ambient=0.5
Specularity=0.7
DiffuseMap=Rock.png
NormalMap=RockNormal.png
SpecularMap=RockSpecular.png

2
素材の定義をゲームエンジンがサポートするすべての感覚に拡張することはできませんか?たとえば、ヒットしたとき、踏んだときなどに素材が生成する音、またはその摩擦パラメーターは?
ディディエック

10

材料物体が光にどのように応答するかを指定します。

一般的なパラメーターがいくつかあります。

  • Kd:光に対する拡散応答
  • Ks:光に対する鏡面反射
  • NS:「シャイニー」
  • map_Kd:テクスチャ

今、あなたがレンダリング三角形持っていると言う材料をMMKd =(1,0,0)(赤い拡散応答)、Ks =(1,1,1)(白い鏡面反射応答)、Ns = 25(鏡面ハイライトは非常にシャープでファジーアウトされません)とmap_Kd(テクスチャなし)。

シェーダーの仕事は、数学を使用して、三角形の頂点位置、ライトの位置、マテリアルカラー値を取得し、三角形が表示される色を把握することです。頂点シェーダーは、この「シェーディング計算」を各頂点で1回実行し、三角形全体に色を補間します。

頂点で拡散応答を計算するシェーダーの一般的な操作は次のとおりです。

// hlsl
float3 vertexToLight = normalize( lightPos.xyz - vertexPos.xyz ) ;

float3 diffuseColor = max( dot( vertexToLight, vertexNormal ), 0.0 ) * kd * lightColor ;

3

マテリアルは、ジオメトリに色とパターンを与えるために適用するものです。テクスチャはマテリアルのコンポーネントです。

シェーダーは、このマテリアルを実行時にレンダリングできる小さなプログラムです。シェーダーの良いところは、マテリアルの単純なレンダリングから、鏡面ハイライトや反射などのダイナミックエフェクトの追加、弾丸が当たった壁に偽の穴をレンダリングするなどの非常に巧妙なものまで、あらゆることができることです。

あなたの質問への答え-はい、違いがあります、少しオーバーラップもあります-赤いマテリアルを作成するか、シェーダーを書いて物事を赤くすることができますが、どちらも多くのことを可能にします他とはできませんでした。

いいえ、マテリアルごとに1つのシェーダーは必要ありません。マテリアルのレンダリングにはシェーダーが必要ですが、必要に応じて、すべてのマテリアルにシェーダーを使用できます。それらは特定のことを行うので、たとえばすべてを輝かせたい場合は、1つだけ書くことができます。

シェーダーの良い例は、戦争のギアです。シーンには1セットのマテリアルがありますが、ボタンを押して戦術的なビューに切り替えると、これらのマテリアルをレンダリングしているシェーダーが変化するため、アウトラインが表示され、一般的に異なって見えます。バットマンでも同じことが起こります:アーカムの「探偵モード」。


1
技術的には、テクスチャは実際にはそれ自体がマテリアルではなく、通常はマテリアルの一部です。
ボボボボ

1

遅くなりますが、理解を深めるのに役立つ「チート」があります。

マテリアルとは、その描画呼び出しのために特定のシェーダーにアタッチされるすべてのものです。

たとえば、上記の回答では、次のマテリアルがあります。[Material] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png

これは、法線マップと鏡面反射計算を行うシェーダーでレンダリングすることを変換し、そのシェーダー内の3つのテクスチャを使用します。

後で、同じシェーダーを別の3つのテクスチャ(car、carNormal、carSpecularなど)で再利用できます。シェーダーパラメーターを変更しただけで、異なるマテリアルで異なる描画呼び出しを行います。

全体として、マテリアルとは、同じパラメーター(テクスチャ、ユニフォーム、属性)を持つ同じシェーダーを使用して描画呼び出しを一意に作成するすべてのものです。

これが視覚化に役立つことを願っています


シェーダーはクラスですが、マテリアルはインスタンスですか?
ベンガラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.