Как нарисовать вращающуюся призму в OpenGL? - PullRequest
2 голосов
/ 26 сентября 2011

Я пытаюсь нарисовать простой кристалл, который вращается вокруг своей оси.Я могу достаточно легко получить правильную форму, нарисовав пирамиду, а затем снова нарисовав ее вверх ногами, но у меня есть две проблемы.

Во-первых, хотя я рисую все в одном цвете, два изграни имеют другой цвет, как и у двух других.

Во-вторых, он помещает «дно» на каждую пирамиду, которая видна сквозь полупрозрачные стены кристалла, что разрушает эффект.Есть ли способ избавиться от этого?

Вот код, который я использую для настройки и отрисовки сцены GL.Конечно, кода OpenGL намного больше, чем этот, но это важная часть.

procedure Initialize;
begin
  glShadeModel(GL_SMOOTH);
  glClearColor(0.0, 0.0, 0.0, 0.5);
  glClearDepth(1.0);
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
end;

procedure Draw; //gets called in a loop
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  glTranslatef(-1.5,-0.5,-6.0);
  glRotatef(rotation,0.0,1.0,0.0);
  glBegin(GL_TRIANGLE_FAN);
    glColor4f(0, 0, 1, 0.2);
    glVertex3f(0, 3.4, 0);
    glVertex3f(-1, 0, -1);
    glVertex3f(-1, 0, 1);
    glVertex3f(1, 0, 1);
    glVertex3f(1, 0, -1);
    glVertex3f(-1, 0, -1);
  glEnd;
  glBegin(GL_TRIANGLE_FAN);
    glVertex3f(0, -3.4, 0);
    glVertex3f(-1, 0, -1);
    glVertex3f(-1, 0, 1);
    glVertex3f(1, 0, 1);
    glVertex3f(1, 0, -1);
    glVertex3f(-1, 0, -1);
  glEnd;
  rotation := rotation + 0.02;
end;

Кто-нибудь знает, что я делаю неправильно и как это исправить?

1 Ответ

6 голосов
/ 26 сентября 2011

Я пытаюсь нарисовать простой кристалл

Стоп. Кристаллы являются полупрозрачными, и в тот момент, когда вы начинаете рисовать полупрозрачные объекты, вы можете отказаться от любого представления о том, что эффект является «простым». Рендеринг истинной призмы (которая по-разному преломляет волны различной длины) - это то, что для правильной трассировки требует трассировки лучей в некоторой форме. И есть много трассировщиков лучей, которые не могут даже сделать это правильно, так как они отслеживают только длины волн R, G и B, в то время как вам нужно проследить много длин волн, чтобы приблизить рефракцию и расщепление света призмы .

Лучшее, что вы получите - это растеризатор, такой как OpenGL, какой-то уровень подделки.

Я не могу объяснить, что происходит с гранями, но проблема с просмотром других полигонов проста: вы не используете отбраковка задней стороны . Если вы не хотите видеть задние грани прозрачных объектов, вам нужно убедиться, что выборка задних поверхностей активна.

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