6

そのため、私はしばらくの間、頂点属性配列をジオメトリシェーダーに渡すことを試みてきました。これはfloatの配列です(頂点ごとの属性は単なるfloat値です)

これをジオメトリシェーダーに入れると、次のようになります。

attribute float nodesizes;

シェーダーコンパイラは次のように文句を言います。

OpenGL requires geometry inputs to be arrays

どうすれば正確に渡すことができますか?

また、頂点属性を配置するためのコードは次のとおりです。

glBindAttribLocation(programid, 1, "nodesizes");
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, array);
glEnableVertexAttribArray(1);

私は何か間違ったことをしていますか?

4

2 に答える 2

8

ジオメトリ シェーダーは属性を取得しません。頂点シェーダーはattributes を取得して s を出力しvaryingます (古い構文で言えば)。これらはジオメトリ シェーダーで読み取ることができますが、1 つのジオメトリ シェーダーの呼び出しが複数の頂点シェーダーの呼び出しに続くため、配列として読み取ることができます。このようなもの:

頂点シェーダー:

attribute float nodesize;
varying float vNodesize;

void main() {
    ...
    vNodesize = nodesize;
    ...
}

ジオメトリ シェーダ:

varying float vNodesize[];

void main() {
    ...vNodesize[i]...
}

名前は任意ですが、もちろん変数の名前は両方のシェーダーで一致する必要があります。頂点シェーダーとジオメトリ シェーダーという用語をごちゃまぜにしていないことを願っています。

于 2011-06-30T14:21:47.187 に答える
-1

どのオープンGLバージョンを使用していますか?

Open GL 言語仕様 (4.10.6) から

ジオメトリ プロセッサで実行可能なジオメトリ シェーダーを 1 回呼び出すと、固定数の頂点を持つ宣言された入力プリミティブが操作されます。この 1 回の呼び出しで、宣言された出力プリミティブ型のプリミティブにアセンブルされ、後続のパイプライン ステージに渡される可変数の頂点を生成できます。

これは、ジオメトリが想定するプリミティブの種類 (ポイント、ライン、トライアングル、クワッド) を指定する必要があることを意味します。

私があなたを正しく理解していれば、geom シェーダーが頂点ごとに立方体を放出することを望んでいます。したがって、ジオメトリ入力タイプをポイントに設定する必要があります。

結果として、geom シェーダー コードは次のように開始する必要があります。

varying float vNodesize[];

void main() {
    ...vNodesize[i]...
}

ポイントのi = 0 = ラインの i = 1 など。

于 2011-06-30T16:43:32.203 に答える