4

私は Opengl ES 2.0 初心者 (および GLSL 初心者) ですので、これが明らかな質問である場合はご容赦ください。

プログラムの開始時に CPU で一度初期化する VBO がある場合、CPU で計算を行わずに頂点シェーダーを使用して各フレームを更新し、GPU に再アップロードすることは可能ですか? ユニフォームを送ってそれに基づいてデータを操作することについては言及していません。代わりに、GPU 自体の VBO で永続的な変更を引き起こすことを意味します。

したがって、私が考えることができる最も単純な例は、フレームがレンダリングされるたびに、頂点シェーダーの gl_Position の x、y、および z コンポーネントに 1 を追加することです。これは、頂点が 1 つしかなく、その初期位置が CPU で (0,0,0,1) に設定されている場合、30 フレーム後には (30,30,30,1) になることを意味します。

これが可能である場合、コードでどのように見えるでしょうか?

4

1 に答える 1

1

最新のデスクトップ ハードウェア (GL3/DX10) では、トランスフォーム フィードバックを使用して頂点シェーダーまたはジオメトリ シェーダーの出力をバッファーに書き戻すことができますが、transform_feedback 拡張機能が iPhone (または一般的な ES) でサポートされているかどうかは疑問です。

PBO がサポートされている場合 (私も疑っています)、少なくとも GPU-GPU コピーでそれを行うことができます。頂点バッファーを (PBO としてバインドすることによって) テクスチャーにコピーし、テクスチャー付きのフルスクリーン クワッドをレンダリングして、フラグメント シェーダーで更新を実行するだけです。その後、フレームバッファ (更新された頂点データを含むようになりました) を頂点バッファにコピーします (再び PBO としてバインドします)。ただし、この方法では 2 つのコピーを実行する必要があり (両方とも完全に GPU 上で実行する必要があります)、頂点データが浮動小数点の場合は、浮動小数点のレンダー ターゲットとフレーム バッファー オブジェクトもサポートする必要があります。

ES での最善の解決策は、実際には CPU で計算を行うことだと思います。CPU コピーを保持するだけで (少なくとも不必要な GPU-CPU リードバックがなくなります)、フレームごとにバッファー データを更新します (バッファー使用を使用してGL_DYNAMIC_DRAW、またはGL_STREAM_DRAWバッファー使用として)。

おそらく、変更を別の単純なデータに依存させることで、永続的な更新を完全に防ぐこともできます。あなたの例では、フレーム番号にユニフォームを使用し、これをフレームごとに頂点シェーダーの座標として設定できますが、更新機能が実際にどれほど複雑かはわかりません。

于 2011-08-26T23:49:16.573 に答える