5

一連の連続する unsigned int を属性として GLSL シェーダーに渡そうとしています。

これまでのところ、私は思いついた

s_number = glGetAttribLocation(shader, "number");

numberData = new GLuint[dotAmount];
for (GLuint i = 0; i < dotAmount; i++) {
    numberData[i] = i;
}

glGenBuffers(1, &vertBuf);
glBindBuffer(GL_ARRAY_BUFFER, vertBuf);

glBufferData(
        GL_ARRAY_BUFFER,
        sizeof(dotAmount),
        numberData,
        GL_STATIC_DRAW
);

レンダリング機能は

glUseProgram(shader);

[..]

glEnableVertexAttribArray(s_number);
glBindBuffer(GL_ARRAY_BUFFER, vertBuf);

glVertexAttribPointer(
        s_number,
        1,
        GL_UNSIGNED_INT,
        GL_FALSE,
        0,
        BUFFER_OFFSET(0)
);

glDrawArrays(GL_POINTS, 0, dotAmount);

次のように、頂点シェーダーで数値を使用しようとしています。

attribute uint number;

('vertBuf' という名前は、渡したい頂点データではないため、実際には少し誤解を招きます) OpenGL 3 とシェーダー バージョン 1.3 を使用しています。

私が達成しようとしているのは、シェーダーをdotAmount何度も実行したいということです。配置は、シェーダー内で数学的に行われます。しかし、私が得るのは空白の画面だけです...

問題がシェーダーにあるのではないことは確かです。点を描きたいのですgl_Position = vec4(0.0, 0.0, 0.0, 0.0);が、頂点シェーダーを入れると、何かを描画するはずだと思います。

4

2 に答える 2

33

頂点属性ポインターを指定するために間違った API 呼び出しを使用しています。

glVertexAttribPointer (...)浮動小数点頂点属性用です。喜んで整数データ型の値を取りますが、最終的にこの値は浮動小数点に変換されます。これが、浮動小数点の正規化を制御するパラメーターがある理由です。正規化が有効になっている場合、渡す整数値は型の範囲を使用して調整され、正規化された浮動小数点の範囲(符号付き[-1.0, 1.0]) または[0.0, 1.0](符号なし) 内に収まるようになります。無効にすると、整数は にキャストされたかのように効果的に扱われGLfloatます。

あなたの場合、上記のどちらの動作も必要ありません。頂点シェーダーでは、頂点属性はそもそも浮動小数点型ではないため、OpenGL で頂点配列データを浮動小数点に変換すると、無意味な結果が生成されます。

あなたがする必要があるのは使用することglVertexAttribIPointer (...)です。この関数には正規化のためのブール値がないことに注意してください。整数の頂点データを完全に変更せずに頂点シェーダーに渡します。まさにあなたが望むものです。


要約すれば:

  1. glVertexAttribPointer (...)は、浮動小数点の頂点属性 (つまりvec<N>mat4float) にデータを提供するのに適しており、データ型の変換を行います。

  2. glVertexAttribIPointer (...)は、整数属性 (つまりivec<N>{u}int) 用に特別に設計されています。

于 2013-09-20T22:40:58.647 に答える
2

フラグメント シェーダーを に変更してみてくださいgl_FragColor = vec4(1,0,0,1);。これにより、出力カラーによってフラグメントが確実に表示されます。

また、持っている必要がありますgl_Position = vec4(0, 0, 0, 1);(理由は、gl_Position が同次座標でなければならないためです。つまり、最初の 3 つのコンポーネントは 4 番目のコンポーネントで除算されます)。

于 2013-09-20T15:35:55.780 に答える