ゲームでは、マテリアルはオブジェクトの視覚的な外観にのみ影響を与えることがよくあります。視覚的な外観はシェーダーによって影響を受けます。では、用語に関して、マテリアルとシェーダーには違いがありますか?1つのマテリアルに対して1つのシェーダーを作成する必要がありますか?
ゲームでは、マテリアルはオブジェクトの視覚的な外観にのみ影響を与えることがよくあります。視覚的な外観はシェーダーによって影響を受けます。では、用語に関して、マテリアルとシェーダーには違いがありますか?1つのマテリアルに対して1つのシェーダーを作成する必要がありますか?
回答:
マテリアルは、指定されたマテリアルの表面がどのように見えるかを記述する属性の組み合わせです。
一部のエンジンは、マテリアルごとに異なるシェーダーを使用します。その場合、マテリアル定義は次のようになります。
[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
材料物体が光にどのように応答するかを指定します。
一般的なパラメーターがいくつかあります。
今、あなたがレンダリング三角形持っていると言うと材料をM
。 M
Kd =(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 ;
マテリアルは、ジオメトリに色とパターンを与えるために適用するものです。テクスチャはマテリアルのコンポーネントです。
シェーダーは、このマテリアルを実行時にレンダリングできる小さなプログラムです。シェーダーの良いところは、マテリアルの単純なレンダリングから、鏡面ハイライトや反射などのダイナミックエフェクトの追加、弾丸が当たった壁に偽の穴をレンダリングするなどの非常に巧妙なものまで、あらゆることができることです。
あなたの質問への答え-はい、違いがあります、少しオーバーラップもあります-赤いマテリアルを作成するか、シェーダーを書いて物事を赤くすることができますが、どちらも多くのことを可能にします他とはできませんでした。
いいえ、マテリアルごとに1つのシェーダーは必要ありません。マテリアルのレンダリングにはシェーダーが必要ですが、必要に応じて、すべてのマテリアルにシェーダーを使用できます。それらは特定のことを行うので、たとえばすべてを輝かせたい場合は、1つだけ書くことができます。
シェーダーの良い例は、戦争のギアです。シーンには1セットのマテリアルがありますが、ボタンを押して戦術的なビューに切り替えると、これらのマテリアルをレンダリングしているシェーダーが変化するため、アウトラインが表示され、一般的に異なって見えます。バットマンでも同じことが起こります:アーカムの「探偵モード」。
遅くなりますが、理解を深めるのに役立つ「チート」があります。
マテリアルとは、その描画呼び出しのために特定のシェーダーにアタッチされるすべてのものです。
たとえば、上記の回答では、次のマテリアルがあります。[Material] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png
これは、法線マップと鏡面反射計算を行うシェーダーでレンダリングすることを変換し、そのシェーダー内の3つのテクスチャを使用します。
後で、同じシェーダーを別の3つのテクスチャ(car、carNormal、carSpecularなど)で再利用できます。シェーダーパラメーターを変更しただけで、異なるマテリアルで異なる描画呼び出しを行います。
全体として、マテリアルとは、同じパラメーター(テクスチャ、ユニフォーム、属性)を持つ同じシェーダーを使用して描画呼び出しを一意に作成するすべてのものです。
これが視覚化に役立つことを願っています