OpenGL

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上から該当す...
OpenGL

OpenGL 4世代での描画手順 その3

今回はテクスチャを張ってみたいと思います。また単に画面に三角形ではなく、立方体を出してみます。そのために今回は GLM というライブラリを使用することにしました。これは行列演算のために使用しています。
OpenGL

OpenGL 4世代での描画手順 その2

前回はとりあえず三角形が出せるまで、だったので今回はもう少し進めてみたいと思います。DirectX11ではシェーダー定数については定数バッファ(ConstantBuffer)というものを使って、パラメータをCPUからGPU(シェーダー)に送ります。これのOpenGL版は Uniform Buffer Object (UBO)というものに該当します。 Unif...