我读了红皮书(第7版),在测试glMultiDrawElements时,屏幕上没有任何内容,调试控制台中出现“访问冲突”错误。我使用的是MVS2010,这里是我编译的主要代码部分:
// C4UB_V2F interwined format, vertex are CCW ordered
static const GLfloat vertex[] = {
// First triangle
0xff0000ff, 0.25f, 1.0f, // nevermind on that incorrect integer colors
0x00ff00ff, 0.0f, 0.0f,
0x0000ffff, 0.5f, 0.0f,
// Second one
0xff0000ff, 0.75f, 0.0f,
0x00ff00ff, 0.5f, 1.0f,
0x0000ffff, 1.0f, 1.0f
};
void init() {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glShadeModel(GL_SMOOTH);
glInterleavedArrays(GL_C4UB_V2F, 0, vertex);
}
static const GLubyte order[] = { 0, 1, 2, 3, 4, 5 };
static GLubyte oneIndices[] = {0, 1, 2};
static GLubyte twoIndices[] = {3, 4, 5};
static GLsizei count[] = {3, 3};
static GLvoid * indices[2] = {oneIndices, twoIndices};
void render() {
glClear(GL_COLOR_BUFFER_BIT);
// This one works perfectly:
//glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, order);
// And this one generates access violation error
// in the book there's no indices casting, but MVS2010 is too lazy to cast it itself
glMultiDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_BYTE, (const GLvoid **)indices, 2);
// This command never executes 'cause of acces violation error occuring
glFlush();
}
对我来说,我在投射指数时错过了一些东西,但我无法得到究竟是什么。有什么想法吗?
答案 0 :(得分:1)
我刚检查过 - printf(“%i”,glDrawElementsInstanced);打印为零。
有两种可能性。
您的OpenGL实现不支持它们。这意味着您拥有古老的驱动程序,或者您没有正确创建上下文。由于您使用的是FreeGLUT,因此不太可能出现上下文创建问题。如果您的硬件是在过去7年中制造的,那么您应该能够获得它们。
您没有初始化 GLEW。在使用FreeGLUT创建OpenGL窗口后,您必须调用glewInit
。否则,您将无法正确初始化GLEW,并且您的函数指针将为NULL。
答案 1 :(得分:0)
由于您的评论,您的硬件和/或驱动程序似乎不支持这些功能。从1.4开始支持glMultiDrawElements
,从1.2开始支持glDrawRangeElements
。确保您的硬件支持这些版本,并获得最新的驱动程序。
当然,您首先必须检索相应的函数指针才能使用它们。这可以通过wglGetProcAddress
手动完成(假设Windows由于您提到VS)或扩展加载库,如GLEW。