5

OpenGL SuperBible を読んでいるときに、最も基本的な (フラットな) シェーダーの例の 1 行を理解するのに問題があります。

第 6 章のリスト 6.4 と 6.5 では、次の 2 つの非常に基本的なシェーダーが紹介されています。

6.4頂点シェーダー:

// Flat Shader
// Vertex Shader
// Richard S. Wright Jr.
// OpenGL SuperBible
#version 130

// Transformation Matrix
uniform mat4    mvpMatrix;

// Incoming per vertex
in vec4 vVertex;

void main(void) 
    { 
    // This is pretty much it, transform the geometry
    gl_Position = mvpMatrix * vVertex;
    }

6.5フラグメント シェーダー:

// Flat Shader
// Fragment Shader
// Richard S. Wright Jr.
// OpenGL SuperBible
#version 130

// Make geometry solid
uniform vec4 vColorValue;

// Output fragment color
out vec4 vFragColor;


void main(void)
   { 
   gl_FragColor = vColorValue;
   }

私の混乱は、main() でvFragColor言いながら out 宣言で言うことです。gl_FragColor

一方、ウェブサイトのコードでは、「vFragColor = vColorValue;」に修正されています。メインループで。

私の質問は、本のタイプミス以外に、outシェーダーの値に名前を付けるためのルールは何ですか? 特定の名前に従う必要がありますか?

OpenGL.org で、頂点シェーダーの外側には gl_Position が必要であることがわかりました。フラグメントシェーダーにそのようなものはありますか? それとも、出力が1つしかない場合、それはバッファ内の色になりますか?

フラグメント シェーダーに複数のシェーダーがある場合はどうなりますか? GLSL コンパイラは、バッファで使用するものをどのように認識しますか?

4

2 に答える 2

0

gl_FragColor は、GLSL の初期バージョンの元の出力変数でした。描かれる欠片の色です。

outその変数を宣言してから glFragColor に書き込む理由がないため、最初の混乱は正当化されます。

それ以降のバージョンでは、出力変数に任意の名前を付けることができるように、カスタマイズ可能になりました。コマンドを使用して、これらの任意の出力を特定のバッファーにマップできますglBindFragDataLocation

私は 100% 肯定的ではありませんが、リンクする前にこの関数を呼び出さないと、出力変数がランダムにバッファーに割り当てられると思います。出力が 1 つしかない場合は、常にバッファー 0 に割り当てる必要があります。

于 2012-08-04T17:43:55.243 に答える