0

Open GL ES 2.0 の GLSL を学習しようとしています。私はチュートリアルを見回しましたが、まったく意味がないため、明らかに説明に欠けているものがあります. 以下のコードをご覧ください。これは、公式の OpenGL ES 2.0 リファレンス カードから抜粋したものです。

これは、頂点シェーダーであると想定されています。

uniform mat4 mvp_matrix; // model-view-projection matrix
uniform mat3 normal_matrix; // normal matrix
uniform vec3 ec_light_dir; // light direction in eye coords
attribute vec4 a_vertex; // vertex position
attribute vec3 a_normal; // vertex normal
attribute vec2 a_texcoord; // texture coordinates
varying float v_diffuse;
varying vec2 v_texcoord;

void main(void)
{
   // put vertex normal into eye coords
   vec3 ec_normal = normalize(normal_matrix * a_normal);
   // emit diffuse scale factor, texcoord, and position
   v_diffuse = max(dot(ec_light_dir, ec_normal), 0.0);
   v_texcoord = a_texcoord;
   gl_Position = mvp_matrix * a_vertex;
}

問題 1: 何も初期化されていません。最初に 8 つの変数/オブジェクトがリストされており、1 つも初期化されていません。したがって、8 つの null 変数/オブジェクトがあります。

問題 2: 初期化される変数/オブジェクトは、前の 8 つの null 変数/オブジェクトを使用して初期化されます。素晴らしいので、今はすべてがnullです...

問題 3: 関数から何も渡されません。これがどのように影を落とすことができるかは、私にはわかりません。何も取り込まず、何も渡しません。それが影響を与える唯一のものは gl_Position です。これは明らかにある種の特別な出力変数です。しかし、それは mvp_matrix と a_vertex だけに依存しているので、他のすべてのものは何のためにあるのでしょうか?

そして、それはこの例だけではなく、これまでに見つけたすべてのものです. 一連の変数を宣言し、それらのほとんどを使用せずに、null オブジェクトをあちこちに渡したり割り当てたりすると、何ができるかわかりません。

4

1 に答える 1

3

シェーダーは通常の C コードと同じように動作すると想定していますが、そうではありません。頂点シェーダーには、属性とユニフォームの 2 種類の入力と、変数の 1 種類の出力があります。これは、シェーダー コードの先頭で定義されているものです。属性は頂点ごとのデータであり、頂点ごとに異なります。ユニフォームはすべての頂点で同じです。属性とユニフォームの初期化は、アプリケーションのメイン レンダリング メソッドで行われます。ここでは、次のような呼び出しがたくさんあります。

// set up the position attribute
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices);

シェーダーへの出力は、変数v_diffusev_texcoordです。これらの出力の値は、レンダリングされたすべてのフラグメント シェーダーで補間され、フラグメントのライティングに使用されます。

gl_Position変数は、頂点の位置を設定する特別な出力です。

この例を理解するには、レンダリングを実行するメイン ループとフラグメント シェーダーも確認する必要があります。これらはすべて結合されています。

于 2012-03-14T21:22:44.010 に答える