2015-03-03 48 views
3

我是OpenGL的新手,我无法弄清楚为什么窗口中没有显示任何内容。我使用的是小牛(OS X 10.9.5),并应该有若有所失我猜为什么glDrawArrays不能在mac上使用OpenGL绘图

#include <SFML/Window.hpp> 
#include <SFML/OpenGL.hpp> 
#include "FirstTriangleExample.h" 

static const GLfloat g_vertex_buffer_data[] = { 
     -1.0f, -1.0f, 0.0f, 
     1.0f, -1.0f, 0.0f, 
     0.0f, 1.0f, 0.0f, 
}; 

GLuint vertexbuffer; 
GLuint VertexArrayID; 

void FirstTriangleExample::init() { 
    glClearColor(0.0f, 0.0f, 0.4f, 0.0f); 

    glGenVertexArraysAPPLE(1, &VertexArrayID); 
    glBindVertexArrayAPPLE(VertexArrayID); 

    glGenBuffers(1, &vertexbuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); 
} 

// called in loop 
void FirstTriangleExample::update() { 
    glClear(GL_COLOR_BUFFER_BIT); 

    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableVertexAttribArray(0); 

    glFlush(); 
} 

void FirstTriangleExample::dispose() { 
    glDeleteBuffers(1, &vertexbuffer); 
    glDeleteVertexArraysAPPLE(1, &VertexArrayID); 
    glDeleteProgram(programID); 
} 

与下面的例子中,一切工作正常(我看到红色方块)

#include "RedSquareExample.h" 
#include <SFML/OpenGL.hpp> 

void RedSquareExample::init() {} 

void RedSquareExample::update() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glBegin(GL_QUADS); 
    glColor3f(0.0f, 1.0f, 0.0f); 
    glVertex2f(-0.5f, -0.5f); 
    glVertex2f(0.5f, -0.5f); 
    glVertex2f(0.5f, 0.5f); 
    glVertex2f(-0.5f, 0.5f); 
    glEnd(); 

    glFlush(); 
} 

void RedSquareExample::dispose() {} 

也许问题在于使用APPLE扩展名(glGenVertexArraysAPPLE()glBindVertexArrayAPPLE())?

回答

3

据我看到你的代码,你正在使用固定功能管道。但是这个代码:

glEnableVertexAttribArray(0); 
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

只应该在使用着色器时工作。在固定功能的情况下,您可能想要使用类似于

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 0, (void*)0); 

此外,您没有正确使用VAO。 VAO的目的是将缓冲区的绑定存储到属性,但是无论如何你都要在你的更新方法中重新设置绑定。

+0

你说得比我好,覆盖范围更广。有一个+1 :-) – Angew 2015-03-03 10:46:15

+0

嘿,它的工作。非常感谢 – Peregrin 2015-03-03 17:13:35

+0

@Peregrin:您的欢迎。随时接受答案。 – BDL 2015-03-03 17:42:41

相关问题