0

ゲームが VBO をセットアップして画面に描画する方法を正確にエミュレートしようとしています。これまでセットアップしたことがなく、チュートリアルはすべて glDrawArrays でそれを行う方法を示していますが、glDrawElements を使用したいと考えています。

私は次のことを思いつきました:

glViewport(0, 0, 765, 553);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 765, 553, 0.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

xCast(ptr_glActiveTextureARB, ptr_wglGetProcAddress("glActiveTextureARB"));
xCast(ptr_glMultiTexCoord2fARB, ptr_wglGetProcAddress("glMultiTexCoord2fARB"));
xCast(ptr_glGenBuffersARB, ptr_wglGetProcAddress("glGenBuffersARB"));
xCast(ptr_glBindBufferARB, ptr_wglGetProcAddress("glBindBufferARB"));
xCast(ptr_glBufferDataARB, ptr_wglGetProcAddress("glBufferDataARB"));

struct PointInfo
{
    float Pos[3];
    float Colour[3];
};

const int NumVerts = 3, NumInds = 3;
std::vector<PointInfo> Vertices;
Vertices.push_back({{0.0f, 1.0f, 0.0f}, {1, 1, 1}}); ///top left;
Vertices.push_back({{0.5f, 0.0f, 0.0f}, {1, 1, 1}}); ///bottom middle;
Vertices.push_back({{1.0f, 1.0f, 0.0f}, {1, 1, 1}}); ///top right;

std::vector<std::uint32_t> Indices = {0, 1, 2};

std::uint32_t VBO = 0, IBO = 0;
ptr_glGenBuffersARB(1, &VBO);
ptr_glGenBuffersARB(1, &IBO);

///Put Vertices In.
ptr_glBindBufferARB(GL_ARRAY_BUFFER, VBO);
ptr_glBufferDataARB(GL_ARRAY_BUFFER, sizeof(PointInfo) * NumVerts, &Vertices[0], GL_STATIC_DRAW);
Log(glGetError());

///Put Indices In.
ptr_glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, IBO);
ptr_glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER, sizeof(int) * NumInds, &Indices[0], GL_STATIC_DRAW);
Log(glGetError());

上記をプログラムの開始時に一度だけ実行します。次に、while ループで次のように実行します。

glPushMatrix();
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Log(glGetError());

ptr_glBindBufferARB(GL_ARRAY_BUFFER, VBO);
Log(glGetError());
glVertexPointer(3, GL_FLOAT, sizeof(PointInfo), (void*) offsetof(PointInfo, Pos));
Log(glGetError());
glColorPointer(3, GL_FLOAT, sizeof(PointInfo), (void*) offsetof(PointInfo, Colour));
Log(glGetError());
ptr_glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, IBO);
Log(glGetError());
glDrawElements(GL_TRIANGLES, NumInds, GL_UNSIGNED_INT, 0);
Log(glGetError());

glPopMatrix();
SwapBuffers(DC);
Sleep(1);

しかし、起こるのは私の画面のクリアだけです。三角形がまったく表示されません。glOrtho を介したビュー設定である可能性がありますが、よくわかりません。私がしたことに何か問題がありますか?glGetError は 0 を出力するだけです..エラーはありません:S

4

2 に答える 2

2

指定した三角形の座標は非常に小さいです。三角形は、画面の左上隅にあるピクセルの半分しか占めていません。100倍にしてみてください。

glEnableClientStateまた、 withGL_VERTEX_ARRAYとへの呼び出しが欠落していると思いますGL_COLOR_ARRAY

一般的なアプローチとして、一度に一歩ずつ進めることをお勧めします。即時モードglVertexから開始して、座標とカメラのセットアップが正しいことを確認します。次にシェーダーを追加します。次に、DrawArrays を使用して位置のみの VBO に変換します。次に頂点カラーを追加します。次に、DrawElements に変換します。そうすれば、問題がどこにあるのかをよりよく理解できます。

これらの ptr_ プレフィックスを取り除くために、ここの glload ライブラリにも興味があるかもしれません。

于 2013-07-21T06:22:31.667 に答える
1

を使用する必要があります glVertexAttribPointer。使用している関数は非推奨です。おそらく、このコードを機能させることができますが、そのような古い OpenGL を使用することを余儀なくされていなければ、多くの問題を回避できる可能性があります。

また、関数ポインタを手動でロードするのも非常に面倒です。GLload などのライブラリを参照することをお勧めします。

CodeXL や gDebugger などの特殊なデバッガーは、このような問題を解決するのに非常に役立ちます。


このコードの問題に関しては、三角形が小さすぎます。

于 2013-07-21T08:12:53.243 に答える