2012-02-09 60 views
2

为什么在这个程序中glVertex3f绘制的四个点呈现在指向的位置,而不是四个数组点只在窗口的中心呈现一个点?使用OpenGL绘制点的阵列

#include <GL/glew.h> 
#include <GL/glut.h> 

#include <iostream> 
#include <vector> 

using namespace std; 

struct point3 { 
    GLfloat x, y, z; 
}; 

vector<point3> Vertices(4); 

void display(void) 
{ 
    glClear (GL_COLOR_BUFFER_BIT); 
    GLuint abuffer; 
    glGenVertexArrays(1, &abuffer); 
    glBindVertexArray(abuffer); 
    GLuint buffer; 
    glGenBuffers(1, &buffer); 
    glBindBuffer(GL_ARRAY_BUFFER, buffer); 
    Vertices = {{0.3f, 0.3f, 0.5f}, {0.6f, 0.6f, 0.5f}, {0.6f, 0.3f, 0.5f}, {0.3f, 0.6f, 0.5f}}; 
    glBufferData(GL_ARRAY_BUFFER, Vertices.size() * sizeof(Vertices[0]), &Vertices[0], GL_STATIC_DRAW); 
    glVertexPointer(3, GL_FLOAT, 0, &Vertices[0]); 
    glDrawArrays(GL_POINTS, 0, Vertices.size()); 
    glFlush(); 
    glBegin(GL_POINTS); 
    glVertex3f(0.25f, 0.25f, 0.5f); 
    glVertex3f(0.25f, 0.75f, 0.5f); 
    glVertex3f(0.75f, 0.75f, 0.5f); 
    glVertex3f(0.75f, 0.25f, 0.5f); 
    glEnd();  
    glFlush(); 
} 

void init (void) 
{ 
    glClearColor (0.0, 0.0, 0.0, 0.0); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 

} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(500, 500); 
    glutInitWindowPosition(0, 0); 
    glutCreateWindow("simple OpenGL example"); 
    glutDisplayFunc(display); 
    GLenum err = glewInit(); 
    if (GLEW_OK != err) { 
     cerr << "Error: " << glewGetErrorString(err) << endl; 
    } 
    cout << "Status: Using GLEW" << glewGetString(GLEW_VERSION) << endl;  
    init(); 
    glutMainLoop(); 
} 
+1

你为什么要生成一个顶点数组和缓冲区对象*你渲染的每一帧?这是一次性安装工作,而不是每一个框架工作。 – 2012-02-09 15:25:31

+0

@尼科尔布拉斯,我试图让它工作,做了很多事情,确定它必须在单独的功能。 – Yola 2012-02-09 15:28:45

+0

@NicolBolas好点,但这可能只是SO的一个缩小的例子。 – Kos 2012-02-09 15:29:16

回答

2

您尚未启用属性以实际使用数组。你做到这一点:

  • (的OpenGL 2)glEnableClientState(GL_VERTEX_ARRAY)(或GL_COLOR_ARRAY等)
  • (的OpenGL 3)glEnableVertexArray(attributeId)

不这样做,你指向与glVertexPointer(GL2)或glVertexAttribPointer什么(GL3)将不会实际使用。

+0

如果我把glEnableClientState放在glVertexPointer和glDisableClientState之后,它就不会在glDrawArrays之后工作。你可以显示代码片段吗? – Yola 2012-02-09 16:21:41