質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Q&A

1回答

502閲覧

openGL テッセレーション使用時のglVertexAttribPointer,glDrawArraysの指定方法

cure_fontaine

総合スコア137

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

0グッド

1クリップ

投稿2022/01/25 07:35

編集2022/01/25 07:42

説明を簡単にするために、ベジエ曲線のテッセレーションで説明します。
ベジエ曲線 1本当たりの座標は始点、制御点、終点で3点が必要になります。
また、1本毎にvec4形式で線色を指定するものとします。

1本当たりのCPUからGPUへの転送データーは
vec3形式の座標が3点で3×3×4(Float型のため)=36バイト
vec4形式の線色情報で4×4=16バイト
ストライドは36+16=52バイトです。

'openGLの制御部 openTK使用 vaoは省略
’po As Single() に上記の転送データーが2本分、52×2=104バイト入っています。

Dim vbo As Integer
GL.GenBuffers(1, vbo)
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo)
GL.BufferData(BufferTarget.ArrayBuffer, po.Length * 4, po, BufferUsageHint.StaticDraw) '4はsingle型のバイト数

GL.VertexAttribPointer(AttribLocation_頂点, 3, VertexAttribPointerType.Float, False, 52, 0)
GL.EnableVertexAttribArray(AttribLocation_頂点)

'36は線色情報のオフセット
GL.VertexAttribPointer(AttribLocation_color, 4, VertexAttribPointerType.Float, False, 52, 36) 
GL.EnableVertexAttribArray(AttribLocation_color)

'↓これで、poに格納された頂点情報から2本をバッチ描画する
GL.DrawArrays(PrimitiveType.Patches, 0, 3*2) '3は頂点の数 始点、制御点、終点 この2本分

ここで分からないのが、
データーが1本分(52バイト)ならば正常に動作しますが、104バイトの様に複数入れると2本目以降を描画しないのです。
仕方無く、
GL.DrawArrays(PrimitiveType.Patches, 0, 32) ’3*2と記述していますが32と誤表示されます
GL.DrawArrays(PrimitiveType.Patches, 1, 3
2) ’3*2と記述していますが32と誤表示されます
と記述していますが、2本目からは線色は正常ですが、始点、制御点、終点がズレます。

知りたいこと
GL.VertexAttribPointer(AttribLocation_頂点, 3, VertexAttribPointerType.Float, False, 52, 0)
GL.VertexAttribPointer(AttribLocation_color, 4, VertexAttribPointerType.Float, False, 52, 36)
この様に記述しましたが、数値パラメーターはこれでどこが誤りですか?

GL.DrawArrays(PrimitiveType.Patches, 0, 3*2)
これも誤りですか?

自分では、どこに誤りがあるか全く分からなくなってきました。上の質問について御教授をお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cure_fontaine

2022/01/25 07:39

GL.DrawArrays(PrimitiveType.Patches, 0, 32) とありますが、32は3*2です。「3*2」と投稿していますが表示が変わっています。
guest

回答1

0

自己解決 (まだ改善の余地があるかも知れないが)
頂点シェーダーでは、頂点とそれに関連するアトリビュートは常にまとめて記述しなければならないことが確認できました。(頂点が3点あったとして、最初の1点にだけアトリビュートをつけることはできない)

頂点シェーダー
s1 = "#version 400 core" & vbCrLf
s1 &= "in vec3 position;" & vbCrLf ’これは必須だが
s1 &= "in vec4 color;" & vbCrLf ’省略できない。不要であってもダミーで読み込む必要がある
s1 &= "out vec4 vertex_color1;" & vbCrLf

s1 &= "void main(void) {" & vbCrLf
s1 &= "gl_Position = vec4(position, 1.0);" & vbCrLf
s1 &= "vertex_color1 = color;" & vbCrLf

s1 &= "}" & vbCrLf

プログラム vaoは省略 
po1()に以下の転送用データーを格納する これが曲線パッチ1本当たりの描画用データー
始点  3×4=12バイト ’4はsingle型のバイト数
線色  4×4=16バイト ’vec4のため4 4はsingle型のバイト数 ここの設定のみ有効となる
制御点 3×4=12バイト ’4はsingle型のバイト数
線色  4×4=16バイト ’vec4のため4 4はsingle型のバイト数 ダミーである
終点  3×4=12バイト ’4はsingle型のバイト数
線色  4×4=16バイト ’vec4のため4 4はsingle型のバイト数 ダミーである

計 84バイト
po1.Length:曲線パッチ1本当たり (3+4)*3=21要素

'頂点バッファーオブジェクト
Dim vbo1 As Integer
GL.GenBuffers(1, vbo1)
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo1)
GL.BufferData(BufferTarget.ArrayBuffer, po1.Length * 4, po1, BufferUsageHint.StaticDraw) '4はsingle型のバイト数

’28とは、頂点当たりのストライド (3+4)×4 バイトという意味である
GL.VertexAttribPointer(AttribLocation_頂点, 3, VertexAttribPointerType.Float, False, 28, 0) '3はvec3(x,y,z) のため
GL.EnableVertexAttribArray(AttribLocation_頂点)

'color rgba
’12とは、vec3分のオフセット 3×4 バイトという意味である
GL.VertexAttribPointer(AttribLocation_color, 4, VertexAttribPointerType.Float, False, 28, 12) '4はrgba のため
GL.EnableVertexAttribArray(AttribLocation_color)

' GL.PatchParameter(PatchParameterInt.PatchVertices, 3) 'これを入れても変わらない
GL.LineWidth(wd)
'↓これで、poに格納された頂点情報からバッチ描画する
’テッセレーションの頂点数が3のため3倍している
GL.DrawArrays(PrimitiveType.Patches, 0, (po1.Length / 21) * 3)

* これによって、GL.DrawArrays(PrimitiveType.Patches, 0, (po1.Length / 21) * 3) の記述で複数分の曲線パッチをバッチ描画できる。
転送データーで線色が8バイト分ダミーとなる欠点があるが、曲線パッチを1本ずつ異なる線色で描画する場合、uniform変数によって線色を指定するよりも遥かに高速化される!

投稿2022/01/26 08:20

cure_fontaine

総合スコア137

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問