是一个wgl上下文,用于FSAA多重采样和glVertexPointer / glColorpointer兼容

时间:2014-05-16 13:40:20

标签: opengl antialiasing

我希望这是描述我所做的正确的语言!我创建了一个支持FSAA的WGL OpenGL上下文。我已设法通过使用

使用着色器和VBO进行渲染
glBindBuffer(GL_ARRAY_BUFFER, my_gl_vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data[0][0])*9, g_vertex_buffer_data, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, my_gl_vertexbuffer);

glVertexAttribPointer(
        0,                  
        3,
        GL_FLOAT,
        GL_FALSE,
        0,   
        (void*)0 
    );

glBindBuffer(GL_ARRAY_BUFFER, my_gl_colorbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data[0][0])*9, g_color_buffer_data, GL_STATIC_DRAW);    
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, my_gl_colorbuffer);

glVertexAttribPointer(
        1,                                // attribute. No particular reason for 1, but must match the layout in the shader.
        3,                                // size
        GL_FLOAT,                         // type
        GL_FALSE,                         // normalized?
        0,                                // stride
        (void*)0                          // array buffer offset
    );

glDrawArrays(GL_TRIANGLES, 0, 3); // 3 indices starting at 0 -> 1 triangle

我得到一个输出,没有光照,因为我的着色器中没有光照计算,因为我有3个灯点亮了场景。

所以有人建议我可以使用

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, g_vertex_buffer_data);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_FLOAT, 0,g_color_buffer_data);
glDrawArrays(GL_TRIANGLES, 0, 3); // 3 indices starting at 0 -> 1 triangle

哪种工作在简单的OpenGL上下文[不支持FSAA]。在FSAA WGL上下文[没有任何着色器加载所以我可以使用固定管道]我得到的是我清除屏幕的背景颜色 - 它似乎没有渲染任何东西。在FSAA WGL上下文中是否不支持glVertexPointer等命令?或者是否使用WGL上下文我必须使用着色器?

1 个答案:

答案 0 :(得分:2)

您无法在向前兼容的上下文中使用glVertexPointer (...)glColorPointer (...)等。

您的问题与MSAA无关(虽然使用64x会引起人们的注意),而是告诉GL消除 所有 。在限制性方面,向前兼容的上下文是 core 之外的一步。有些东西已被弃用但未在核心中删除,例如宽行... forward-compatible删除在核心中仍然有效的任何弃用。

尽管如此,glColorPointer (...) ,已弃用并从核心移除。您必须从上下文标志中删除前向兼容位才能使用它。