「フラットシェーディング」の版間の差分

編集の要約なし
4行目: 4行目:


==GLSL==
==GLSL==
[[GLSL]]では[[バーテックスシェーダー]]の出力変数に「flat修飾子」を付けるとフラットシェーディングとなる。<syntaxhighlight lang="glsl">
[[GLSL]]では[[バーテックスシェーダー]]の出力変数に「flat修飾子」を付けるとフラットシェーディングとなる。
<syntaxhighlight lang="glsl">
// 入力
// 入力
layout (location = 0) in vec3 VertexPosition;
layout (location = 0) in vec3 VertexPosition;
layout (location = 1) ih vec3 VertexNormal;
layout (location = 1) in vec3 VertexNormal;


// 出力(これ)
// 出力(これ)
15行目: 16行目:
void main()  
void main()  
{
{
    // フォンシェーディングやグローシェーディングなんかを書いておく
     // 出力変数に「flat out」と書かれていると、ここが頂点1個分しか呼ばれない
     // 出力変数に「flat out」と書かれていると、ここが頂点1個分しか呼ばれない
}
}
</syntaxhighlight>


</syntaxhighlight>この場合、[[バーテックスシェーダー]][[フォンシェーディング]]や[[グローシェーディング]]などを[[アルゴリズム]]を書いておいても、[[ポリゴン]]を構成する3つの[[頂点]]のいずれか1つだけが計算され、その結果が[[フラグメントシェーダー]]に渡ってくる。つまりGLSLでは前述の概要で「[[法線]]を面単位で持つ」と書いたが「ポリゴンを構成する[[頂点]]の[[法線]]のいずれか1つが使われる」という内容になっている。
[[バーテックスシェーダー]]の出力値を格納する変数にflat修飾子をつけると、その[[バーテックスシェーダー]]では[[ポリゴン]]を構成する3つの[[頂点]]のいずれか1つだけが計算され、その値が[[フラグメントシェーダー]]に渡ってくる。前述の概要で「[[法線]]を面単位で持つ」と書いたが、GLSLでは「ポリゴンを構成する[[頂点]]の[[法線]]のいずれか1つが使われる」という内容になっている。


== HLSL ==
== HLSL ==