2

OpenGl 呼び出しにフックすることで、古い opengl 固定パイプライン ゲームのいくつかのレンダリング機能をハッキングして変更しようとしています。現在の使命は、シェーダー ライティングを実装することです。ほとんどのオブジェクトを正しく照らす適切なシェーダー プログラムを既に作成しましたが、このゲームの地形は通常のデータが提供されていない状態で描画されます。

ゲームは以下を呼び出します:

void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);

void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);`

地形を定義して描画するため、これらの関数を両方ともフックし、ポインターで指定された頂点配列をループして、すべての DrawElements 呼び出しまたは VertexPointer 呼び出しで各サーフェスの法線を計算したいと考えていますが、私は持っていますそのためのアプローチを考え出すのに苦労しました-具体的には、ポインターでデータを読み取り、反復し、理解する方法。この場合、glVertexPointer呼び出しの通常のパラメーターはsize = 3, type = GL_float, stride = 16, pointer = some pointer. glVertexPointer をフックすると、ポインターを反復処理してメッシュのすべての頂点を取得する方法がわかりません。すべての頂点の合計数がわからず、ポインターでデータがどのように構造化されているかもわかりません。ストライドが与えられた場合 - 同様に、通常の配列をどのように構築する必要があるか

インデックス配列で指定されたインデックスごとに、drawelements で法線を計算することをお勧めしますか?

4

2 に答える 2

0

私はjpの答えが好きで投票しましたが、面ごとに1つの法線を計算し、3つの頂点すべてに使用するだけで済むことを指摘したいと思います。それはより速く、より簡単で、時にはさらに正確になるでしょう。

于 2014-11-01T19:10:28.933 に答える