一个glMultiDrawElements

时间:2011-08-13 18:18:27

标签: opengl

我读了红皮书(第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();

}

对我来说,我在投射指数时错过了一些东西,但我无法得到究竟是什么。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

  

我刚检查过 - printf(“%i”,glDrawElementsInstanced);打印为零。

有两种可能性。

  1. 您的OpenGL实现不支持它们。这意味着您拥有古老的驱动程序,或者您没有正确创建上下文。由于您使用的是FreeGLUT,因此不太可能出现上下文创建问题。如果您的硬件是在过去7年中制造的,那么您应该能够获得它们。

  2. 您没有初始化 GLEW。在使用FreeGLUT创建OpenGL窗口后,您必须调用glewInit。否则,您将无法正确初始化GLEW,并且您的函数指针将为NULL。

答案 1 :(得分:0)

由于您的评论,您的硬件和/或驱动程序似乎不支持这些功能。从1.4开始支持glMultiDrawElements,从1.2开始支持glDrawRangeElements。确保您的硬件支持这些版本,并获得最新的驱动程序。

当然,您首先必须检索相应的函数指针才能使用它们。这可以通过wglGetProcAddress手动完成(假设Windows由于您提到VS)或扩展加载库,如GLEW