2012-02-09 3 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

Почему вы генерируете массив вершин и буферный объект * каждый кадр *, который вы визуализируете? Это одноразовая работа по настройке, а не все кадры. –

+0

@ Никол Болас, я попытался заставить его работать и многое сделал, конечно, он должен быть в отдельной функции. – Yola

+0

@ НикольБолас хороший момент, но это может быть только примерный пример для SO. – Kos

ответ

2

Вы не включили этот атрибут для фактического использования массива. Вы что:

  • (OpenGL 2) glEnableClientState(GL_VERTEX_ARRAY) (или GL_COLOR_ARRAY и т.д.)
  • (OpenGL 3) glEnableVertexArray(attributeId)

Без этого, что вы указать с glVertexPointer (GL2) или glVertexAttribPointer (GL3) фактически не будет использоваться.

+0

, если я поместил glEnableClientState прямо перед glVertexPointer и glDisableClientState сразу после glDrawArrays, он все равно не работает. можете ли вы показать фрагмент кода? – Yola

Смежные вопросы