OpenGL, много данных

pilot

Есть много точек на 3D сцене, хочется ее рисовать, поворачивать и т.д., не перерисовывая ее при этом, меняя только координаты "смотрящего".
Как такое сделать в OpenGL?
Вот здесь не то: буферы меняются, перерисовывание каждый раз происходит.
http://www.essi.fr/~buffa/cours/synthese_image/DOCS/trant.sg...
/*
* Copyright (c) 1993-1997, Silicon Graphics, Inc.
* ALL RIGHTS RESERVED
* Permission to use, copy, modify, and distribute this software for
* any purpose and without fee is hereby granted, provided that the above
* copyright notice appear in all copies and that both the copyright notice
* and this permission notice appear in supporting documentation, and that
* the name of Silicon Graphics, Inc. not be used in advertising
* or publicity pertaining to distribution of the software without specific,
* written prior permission.
*
* THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
* AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
* FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
* GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
* SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
* KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
* LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
* THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
* POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
*
* US Government Users Restricted Rights
* Use, duplication, or disclosure by the Government is subject to
* restrictions set forth in FAR 52.227.19(c2) or subparagraph
* (c1ii) of the Rights in Technical Data and Computer Software
* clause at DFARS 252.227-7013 and/or in similar or successor
* clauses in the FAR or the DOD or NASA FAR Supplement.
* Unpublished-- rights reserved under the copyright laws of the
* United States. Contractor/manufacturer is Silicon Graphics,
* Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
*
* OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
*/

/*
* double.c
* This is a simple double buffered program.
* Pressing the left mouse button rotates the rectangle.
* Pressing the middle mouse button stops the rotation.
*/
#include <GL/glut.h>
#include <stdlib.h>

static GLfloat spin = 0.0;

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix;
glRotatef(spin, 0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
glRectf(-25.0, -25.0, 25.0, 25.0);
glPopMatrix;

glutSwapBuffers;
}

void spinDisplay(void)
{
spin = spin + 2.0;
if (spin > 360.0)
spin = spin - 360.0;
glutPostRedisplay;
}

void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}

void reshape(int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
}

void mouse(int button, int state, int x, int y)
{
switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(spinDisplay);
break;
case GLUT_MIDDLE_BUTTON:
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}

/*
* Request double buffer display mode.
* Register mouse input callback functions
*/
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ;
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop;
return 0; /* ANSI C requires main to return int. */
}

kokoc88

хочется ее рисовать, поворачивать и т.д., не перерисовывая ее при этом, меняя только координаты "смотрящего".
Как можно рисовать сцену, не перерисовывая при этом? Ты имеешь ввиду, как просто поворачивать камеру при рисовании сцены? Посмотри описание от gluLookAt и gluPerspective.

banderon

Я так понял, что данные фиксированные, то есть положение точек не меняется во времени. И надо лишь уметь быстро их отображать.
Интересно, а много, это сколько?

pilot

Ну пусть 10000 точек.

pilot

Да я теорию-то читал. Но в примерах использования рядом с заданием этих матриц перерисовывают всегда сцену. Примера не нахожу где нет этого...

kokoc88

Я так понял, что данные фиксированные, то есть положение точек не меняется во времени. И надо лишь уметь быстро их отображать.
Я понял, что надо быстро отображать, но при этом изменять положение камеры. Как менять камеру уже написал. Чтобы быстро отображать точки можно выводить их в список: glNewList, glBegin, ..., glEnd, glEndList.

kokoc88

Но в примерах использования рядом с заданием этих матриц перерисовывают всегда сцену.
Думаю, что сцену приётся перерисовать в любом случае. Ты же изменяешь матрицу проекции. Если не требуется всё время изменять сцену, то лучше сделать из неё список и потом его вызывать.
gluLookAt(camera[0], camera[1], camera[2], /* look from camera XYZ */ 0, 0, 0, /* look at the origin */ 0, 1, 0); /* positive Y up vector */
glRotatef(orbitDegrees, 0.f, 1.f, 0.f);/* orbit the Y axis */
glCallList(SCENE); /* draw the scene */

pilot

Понял, спасибо.
Пробую.

bleyman

Перерисовывание будет происходить каждый раз, естественно. Картинка-то меняется.
Можешь крайне существенно ускорить процесс за счёт использования glNewList/glEndList/glCallList. Это типа ты один раз рассказываешь ему, что хочешь видеть на сцене, а потом просто говоришь "повторить".

pilot

Спасибо, так и получилось — советовал то же.
Все работает, все OK.
всем спасибо

0000

Dislpay list (glNewList, glBegin, ..., glEnd, glEndList) являются устаревшей технологией и от нее все рекомендуют отказываться в пользу DrawArrays или VBO (расширение ARB_vertex_buffer_object).
P.S. Могу ошибаться, но там появилось еще что то вроде.

pilot

About glLists. I would only use them for static meshs. Rebuilding a glList mesh like that whenever you change it's data, ie: vertex deformation, I would think causes a performance hit( even though I hadn't first handly tested what kind a performance hit it would cause ).

http://www.blitzmax.com/Community/posts.php?topic=28086
Но про "что новее" не нашел. Говорят только что DrawArrays иногда быстрее (для каких-то случаев)

0000

> Говорят только что DrawArrays иногда быстрее (для каких-то случаев)
По тестам на gamedev.ru
DisplayList и DrawArray примерно одинаковы (второй лучше). На новых картах всех рвет VBO.
Оставить комментарий
Имя или ник:
Комментарий: