わかりましたので、これを機能させるのにまだ苦労しています。私のコードの重要な部分は次のとおりです。
def __init__(self, vertices, normals, triangles):
self.bufferVertices = glGenBuffersARB(1)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(vertices), ADT.voidDataPointer(vertices), GL_STATIC_DRAW_ARB)
self.vertices = vertices
self.bufferNormals = glGenBuffersARB(1)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(normals), ADT.voidDataPointer(normals), GL_STATIC_DRAW_ARB)
self.normals = normals
self.bufferTriangles = glGenBuffersARB(1)
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ADT.arrayByteCount(triangles), ADT.voidDataPointer(triangles), GL_STATIC_DRAW_ARB)
self.triangles = triangles
glDisableClientState(GL_VERTEX_ARRAY) **(Not sure if any of the following influence in any way)**
glDisableClientState(GL_NORMAL_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0)
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)
VBOについてこれまで読んだことから、ここに何か問題があるとは思いません。これで、頂点、法線 (まだ使用されていません)、三角形のインデックス バッファーができました。実際の抽選は次のとおりです。
def draw(self, type):
glDisableClientState(GL_VERTEX_ARRAY)
glDisableClientState(GL_NORMAL_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0)
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)
**Again above line not sure if they have any use.**
glEnableClientState(GL_VERTEX_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
glVertexPointer(3, GL_FLOAT, 0, None)
glEnableClientState(GL_NORMAL_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
glNormalPointer(GL_FLOAT, 0, None)
if type == GL_POINTS:
#glDrawArrays( GL_POINTS, 0, len(self.vertices) );
glDrawElements(type, len(self.vertices), GL_UNSIGNED_SHORT, 0)
else:
#glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)**(If I uncomment this doesnt seem to make any difference?!)**
#glDrawArrays( GL_TRIANGLES, 0, len(self.triangles) );
glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, 0)**(What does it draw now since GL_ELEMENT_ARRAY_BUFFER_ARB is binded to 0 ?!)**
glDrawArrays が機能するようになりました。しかし、三角形を描画する必要がある場合、bufferTriangles で定義した三角形は描画されません (drawArrays はインデックスを使用しないため、これは私が読んだものからは正常です? または、ここで間違っていますか? )。問題は、glDrawElements を使用しようとすると、すべてが次のようにクラッシュすることです。
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x000000003150ebbc
Crashed Thread: 0
Thread 0 Crashed:
0 com.apple.GeForce8xxxGLDriver 0x1a3e7050 gldGetTextureLevel + 743600
1 com.apple.GeForce8xxxGLDriver 0x1a3e7563 gldGetTextureLevel + 744899
2 GLEngine 0x1a206eee gleDrawArraysOrElements_VBO_Exec + 1950
今、私はここで何が欠けていますか? 私が理解できることから、おそらくどこかで悪いポインターを渡していますか? glDrawElements(type, 24, GL_UNSIGNED_INT, 0) を使用しようとしても、定義された三角形の数がはるかに多くてもクラッシュするので、サイズとは関係ないと思います。
よろしく、 ボグダン
編集: わかりましたので、追加のチェックを行ったので、現在の状況を以下に示します: len(triangles) を ADT.byteCount に変更しましたが、まだ解決策はありません。取得していたすべてのデータを確認したところ、次のようになりました。頂点配列には、法線配列と同様に、GL_Float タイプの ~60000 * 3 = 180000 頂点エントリが含まれています。< 62535 個の頂点しかないため、三角形には unsigned short を使用しています。したがって、len(三角形) は ~135000 です。glDrawElements(GL_TRIANGLES, len(self.triangles), GL_UNSIGNED_SHORTも変更しました, 0) .私もチェックしましたが、三角形配列からのすべてのデータは 0 から 62534 の間にあります。ここで他に何が間違っている可能性がありますか? ああ、glDrawElements(GL_POINTS, ...) はどのように機能しますか? ある種のインデックスも必要ですか?
EDIT2上記のコードを更新しました。そこで述べたように、描画要素がGL_POINTSを描画するようになりましたが、彼がどこでインデックスを取得するのかわかりませんか? それとも GL_POINTS の場合は必要ありませんか? GL_TRIANGLES の場合、glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles) がコメント化された状態で、このように機能しますが、エレメント バッファーが 0 にバインドされた今、ここでどのような種類のインデックスが必要になるのでしょうか?! もう 1 つのことは、glDrawElements は glDrawArrays が行うすべてのポイントを描画しないということです。よりよく説明するには:
glDrawArrays( GL_POINTS, 0, len(self.vertices) );
これは私のすべてのポイントを正しく描画します:
glDrawElements(type, len(self.vertices), GL_UNSIGNED_SHORT, 0)
これは、glDrawArrays よりもはるかに少ないポイントを目に見えて描画するようです。ここで面白いことに、要素を描画するために 10 * len(self.vertices) のようなサイズを渡すと、すべてのポイントが描画されます (おそらく 2 回以上; これを確認できますか?)。
よろしく
EDIT3
配列に関するより正確な情報:
vertices - float の配列、
len(頂点) = 180000 byteCount(頂点) = 720000
三角形 - numpy.uint16 の配列
len(triangles) = 353439 byteCount(triangles) = 706878 min(triangles) = 0 max(triangles) = 59999 であるため、有効な頂点を指している必要があります
描画は次のように行われます。
glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, 0)
アップデート
これがどのように機能するかを理解したとき、要素の VBO をスキップしようとしましたが、次のようになりました。
glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, ADT.voidDataPointer(self.triangles))
これが機能し、すべての三角形を完全に描画するだけでなく、FPS も改善されました。VBO は高速であるべきではありませんか? そして、上記のアプローチが機能するのに、次のものがクラッシュする原因は何ですか。
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ADT.arrayByteCount(triangles), ADT.voidDataPointer(triangles), GL_STATIC_DRAW_ARB)
glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, 0)