OpenGL

OpenGL

新しめのTransform feedbackの使い方

OpenGL transform feedbackの使い方で最近は少し変わって便利に使えるようになったようです。前回、書き込んだプリミティブ数をCPUで取得していましたが、これが不要となるようです。いわゆるDirectX の DrawAuto っぽいものがOpenGLでも実現できるようになりました。 使い方は、以下のような感じです。ポイントは GL_TRAN...
OpenGL

Transform Feedback で GPU Particle っぽいもの

OpenGLの transform feedback を使って GPU パーティクルっぽいものにチャレンジしてみました。以前、transform feedback を試していたときは、ストリームアウトばかり気にしていて、せっかくのGPUで演算が完了できるという点を見落としていました。 今回は VBOを2つ用意してこれをピンポンすることで頂点および情報の更新を...
OpenGL

ジオメトリシェーダーでポイントスプライト(OpenGL)

OpenGLでテセレーションとかインスタンシングとか試している割に、基本的なジオメトリシェーダーでポイントスプライトを実装してみるということをやっていなかったので、改めて試してみます。 方針 とりあえず四角形の4頂点をポイントスプライトとして描画することを考える。DirectXであれ最近のOpenGLであれ、頂点そのものを描画する機能はシェーダーを使って描画...
OpenGL

最近でのワイヤフレーム描画 (OpenGL 4)

前回のテセレーションの試作において、OpenGLの関数にてワイヤフレームを描画していたのですが、動画公開時によくよく見てみると、あるタイミングでワイヤフレームとテセレーション結果が一致していないという妙な症状が出ていることがわかりました。  そこでワイヤフレームの描画について見直しをしてみようと思いました。OpenGL 4.0 Shading Languag...
OpenGL

定数バッファ(Uniform Block)について

DirectXのサンプルを見ているとC++側とHLSL側とで同じ並びの構造体を作ってデータを送っているように見えます。データのレイアウト規則は同じになるのが保証されるのか少々疑問です。一応 D3Dの関数でシェーダーリフレクションが使えるので、調査することはできますが、そこまでやってC++側の定数バッファを作成している例を見かけたことがありません。  一方、O...
OpenGL

OpenGL でテセレーションのシェーダー(TCS,TES)を使う

OpenGLの4.x世代でテセレーションのシェーダーが使えるようになり、DirectX11相当になりました。前回は簡単な三角形や四角形の再分割は作ってみたので、今回はモデル形状について適用してみたいと思います。  そして割とテセレーションのサンプルでは定番の PN Triangles の方法で OpenGLのシェーダー Tessellation Contro...
OpenGL

OpenGL 4.x でのテセレーション

描画方法についてはキューブを回すところまでできて一段落したので、しばらくは追加された機能について試していきたいと思います。今回は OpenGL 4.x で追加されたハードウェアのテセレーションについてです。DirectX 11 でいうところの、ハルシェーダーだったりドメインシェーダーだったりに相当します。OpenGL ではこれらを、テセレーションコントロール...
OpenGL

OpenGL で インスタンシング描画

OpenGL 4.x でのインスタンシング描画を試してみました。インスタンシング描画とはCPU(C++)からの描画呼び出しは1回で、同じモデルを複数回描画することを指します。このときモデル形状のデータは使い回して、別々の場所に描画するということをやってみます。これはインスタンシングの中でもハードウェアインスタンシングと呼ばれていて、古くはDirectX 9....
DirectX

Draw Indirect 系を調べてみた (OpenGL vs DirectX)

OpenGL では Draw Indirect 系が充実しているとの情報があったので、DirectXとどのように違うのかを調べてみました。 DirectX 11 では、 DrawInstancedIndirect(), DrawIndexedInstancedIndirect() の2つの関数が DrawIndirect系として使用可能です。DirectX1...
OpenGL

OpenGL DrawIndirect を試してみた

OpenGLの拡張名では GL_ARB_draw_indirect となる DrawIndirect の機能を試してみました。これはVRAM上のバッファに描画用データを格納して、その情報を元に描画を行う機能となります。通常 glDrawArrays や glDrawElements で描画の際に関数の引数として設定していたデータについて、VRAM上から該当す...