[英]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_ARRAY
和GL_COLOR_ARRAY
调用glEnableClientState
电话。
作为一种通用方法,我建议一次采取一个步骤。 从立即模式glVertex
开始,以确保正确设置坐标和相机。 然后添加着色器。 然后使用DrawArrays转换为仅位置的VBO。 然后添加顶点颜色。 然后转换为DrawElements。 这样,您对可能存在的问题有了更好的了解。
您可能还对这里的glload库感兴趣,以摆脱这些ptr_前缀。
您应该使用glVertexAttribPointer
。 您正在使用的功能已弃用。 也许您可以使此代码正常工作,但是如果您不被迫使用如此古老的OpenGL,则有可能为您省去很多麻烦。
哦,手动加载函数指针也非常麻烦。 我建议您查看诸如GLload之类的库。
诸如CodeXL或gDebugger之类的专用调试器对于解决此类问题非常有帮助。
至于此代码中的问题,三角形太小了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.