簡體   English   中英

我的VBO出了點問題

[英]Something wrong with my VBO

我正在嘗試准確模擬游戲如何設置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);

但是唯一發生的是我的屏幕清除。 我根本看不到我的三角形:SI認為可能是通過glOrtho建立的視圖,但是我不確定。 我做的事有什么問題嗎? glGetError僅顯示0。沒有錯誤:S

您指定的三角形坐標非常小。 三角形僅占據屏幕左上角的一半像素。 嘗試將其縮放100。

我也認為您缺少使用GL_VERTEX_ARRAYGL_COLOR_ARRAY調用glEnableClientState電話。

作為一種通用方法,我建議一次采取一個步驟。 從立即模式glVertex開始,以確保正確設置坐標和相機。 然后添加着色器。 然后使用DrawArrays轉換為僅位置的VBO。 然后添加頂點顏色。 然后轉換為DrawElements。 這樣,您對可能存在的問題有了更好的了解。

您可能還對這里的glload庫感興趣,以擺脫這些ptr_前綴。

您應該使用glVertexAttribPointer 您正在使用的功能已棄用。 也許您可以使此代碼正常工作,但是如果您不被迫使用如此古老的OpenGL,則有可能為您省去很多麻煩。

哦,手動加載函數指針也非常麻煩。 我建議您查看諸如GLload之類的庫。

諸如CodeXL或gDebugger之類的專用調試器對於解決此類問題非常有幫助。


至於此代碼中的問題,三角形太小了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM