OpenGL массив точек - PullRequest
       22

OpenGL массив точек

2 голосов
/ 01 ноября 2011

У меня есть следующий код для рисования массива точек, но он рисует только одну точку в центре. Как я могу нарисовать массив 2D точек, используя OpenGL?

GLint NumberOfPoints = 10;
GLfloat x[2],y[2];

glBegin( GL_POINTS );

for ( int i = 0; i < NumberOfPoints; ++i )
{
    glVertex2f( x[i], y[i] );

}
glEnd();

Ответы [ 4 ]

8 голосов
/ 01 ноября 2011

Требуется GLUT для управления окном и контекстом:

#include <GL/glut.h>
#include <vector>
#include <cstdlib>

struct Point
{
    float x, y;
    unsigned char r, g, b, a;
};
std::vector< Point > points;

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-50, 50, -50, 50, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // draw
    glColor3ub( 255, 255, 255 );
    glEnableClientState( GL_VERTEX_ARRAY );
    glEnableClientState( GL_COLOR_ARRAY );
    glVertexPointer( 2, GL_FLOAT, sizeof(Point), &points[0].x );
    glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof(Point), &points[0].r );
    glPointSize( 3.0 );
    glDrawArrays( GL_POINTS, 0, points.size() );
    glDisableClientState( GL_VERTEX_ARRAY );
    glDisableClientState( GL_COLOR_ARRAY );

    glFlush();
    glutSwapBuffers();
}

void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);

    glutInitWindowSize(640,480);
    glutCreateWindow("Random Points");

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);

     // populate points
    for( size_t i = 0; i < 1000; ++i )
    {
        Point pt;
        pt.x = -50 + (rand() % 100);
        pt.y = -50 + (rand() % 100);
        pt.r = rand() % 255;
        pt.g = rand() % 255;
        pt.b = rand() % 255;
        pt.a = 255;
        points.push_back(pt);
    }    

    glutMainLoop();
    return 0;
}

Screenshot

3 голосов
/ 01 ноября 2011

Где вы устанавливаете значения для x [0], x [1], y [0] и y [1]?

Если он рисует только одну точку в центре, это звучит какзначения установлены в 0 для всех четырех из этих переменных.Обязательно инициализируйте их значения, прежде чем ссылаться на них при вызове gVertex2f ().

1 голос
/ 01 ноября 2011

Вы определяете, что такое x [i] и y [i]?В противном случае они будут установлены на 0 автоматически (отсюда центрирование).Кроме того, создание массивов с двумя элементами, но с доступом к 10 элементам, очень плохо, так как вы обращаетесь к областям памяти, которые не можете контролировать.

Вы должны сделать что-то вроде:

GLint NumberOfPoints = 10;
GLfloat x[10],y[10];

for(int i = 0; i < NumberOfPoints; i++){
    x[i] = y[i] = (GLfloat) i;
}

glBegin( GL_POINTS );

for ( int i = 0; i < NumberOfPoints; ++i )
{
    glVertex2f( x[i], y[i] );

}
glEnd();
0 голосов
/ 01 ноября 2011

Ваш код просто работает. Заполните массив x и y рандомизированными значениями, и это будет рисовать случайные точки.

Проблема может заключаться в том, что вы не можете «видеть» нарисованные точки. Это очевидно, поскольку:

  1. По умолчанию цвет точек - черный (0, 0, 0, в rgb), и вы можете установить для него другое значение, используя glColor3f или такие функции.

  2. Вы нарисовали слишком мало точек, и каждая точка слишком мала (на самом деле на экране всего 1 пиксель). Вместо этого вы можете нарисовать круги или нарисовать тысячи или более пикселей и проверить еще раз.

Кстати, пожалуйста, отформатируйте свой вопрос и позвольте коду нормально отображаться.


Отредактировано:

Смотрите мой комментарий выше. Если вы не установили действительный контекст OpenGL или просто не знали, как это сделать, отметьте http://openglbook.com/the-book/chapter-1-getting-started/ и начните работу с первой рабочей программой OpenGL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...