Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тонкости смешивания, OpenGL v1.3, MS Visual C++ 2005 
V
    Опции темы
Math7244
Дата 2.3.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2008
Где: Deeptown

Репутация: нет
Всего: нет



Здравствуйте.  smile
Написано в книге следующее:
Цитата

Нарисуйте вначале непрозрачные обьекты, затем блокируйте запись в буфер глубины, а потом только рисуйте прозрачные обьекты.

Могли бы вы обьяснить почему при смешивании иногда используется функция glDepthMask?
Особенно когда на сцене есть как прозрачные, так и непрозрачные обьекты. Знаю что функцию можно использовать для отключения/включения записи в буфер глубины. Но для чего это нужно при смешивании? Спасибо.



Это сообщение отредактировал(а) Math7244 - 2.3.2008, 22:00
PM MAIL ICQ   Вверх
baldina
Дата 2.3.2008, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Буфер глубины используется для правильного отсечения дальних граней ближними. Грани обычно выводятся в произвольном порядке: дальняя грань может быть выведена после более ближней, которая её (частично) заслоняет.

Непрозрачные объекты оставляют свой след в буфере глубины. Это позволяет отсекать дальние грани, заслоняемые ближними, которые уже были выведены.
Прозрачные объекты участвуют в тестировании буфера (если часть прозрачного объекта заслонена непрозрачным, она не выводится).
Но прозрачные не должны оставлять след в буфере глубины, что бы дальние прозрачные объекты не отсекались ближними, уже выведенными, а производилось смешивание.

Добавлено @ 23:43
попробуй выводить три таких кубика в разном порядке, включая и выключая запись в буфер глубины для прозрачных объектов (дальний - непрозрачный)
Код

+-----+
|/////|
+-----+
     +------+
     |      |
     +------+
   +------+
   |      |
   +------+

     ^
     |
  camera


Это сообщение отредактировал(а) baldina - 2.3.2008, 23:45
PM MAIL   Вверх
Math7244
Дата 3.3.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2008
Где: Deeptown

Репутация: нет
Всего: нет



Спасибо за помощь.  smile
Но тогда выходит что порядок вывода непрозрачных обьектов станет критичен. А координата глубины будет важна лишь для определения находится ли прозрачный обьект за/перед ближайшим к камере непрозрачным обьектом. Верно ли я понял?
Если верно, то получается что из разных положений камеры смешивание должно пройти одинаково. 
Что и вижу на примере, когда в gluLookAt "смотрю" с обратной стороны. Ведь это не совсем реалистично.
Код

#include "stdafx.h"
#include "Exp.h"



void InitScene(void) 
{
   glClearColor(0.0, 0.0, 0.0, 0.0);
   glShadeModel(GL_SMOOTH);

   glEnable(GL_DEPTH_TEST);

   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}



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


   //Yellow solid quad
   glColor4f(1.0, 1.0, 0.0, 1.0);
   glBegin(GL_QUADS);
     glVertex3f(-1.1, 0.4, 0.1);
     glVertex3f(0.0, 0.4, 0.1);
     glVertex3f(0.0, -0.4, 0.1);
     glVertex3f(-1.1, -0.4, 0.1);
   glEnd();


   glDepthMask(GL_FALSE);

   //Red transparent quad
   glColor4f(1.0, 0.0, 0.0, 0.6);
   glBegin(GL_QUADS);
     glVertex3f(-0.5, 0.4, 0.2);
     glVertex3f(0.5, 0.4, 0.2);
     glVertex3f(0.5, -0.4, 0.2);
     glVertex3f(-0.5, -0.4, 0.2);
   glEnd();

    //Blue transparent quad
   glColor4f(0.0, 0.0, 1.0, 0.6);
   glBegin(GL_QUADS);
     glVertex3f(-0.25, 0.4, 0.3);
     glVertex3f(0.25, 0.4, 0.3);
     glVertex3f(0.25, -0.4, 0.3);
     glVertex3f(-0.25, -0.4, 0.3);
   glEnd();

   glDepthMask(GL_TRUE);


   glutSwapBuffers();
}



void OnReshape(int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity();

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(60, (GLfloat) w/(GLfloat) h, 0.1, 50.0);


   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0);
}



void OnKeyPress(unsigned char key, int x, int y)
{
   switch (key) 
   {
      case 27:
         PostQuitMessage(0);
         break;
   }
}



// Application entry point
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    glutInit(&nCmdShow, (char **) &lpCmdLine);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutCreateWindow("OpenGL/GLUT demonstration");
    glutFullScreen();
    glutDisplayFunc(OnDisplay);
    glutReshapeFunc(OnReshape);
    glutKeyboardFunc(OnKeyPress);
    InitScene();
    glutMainLoop();

    return 0;
}


Это сообщение отредактировал(а) Math7244 - 3.3.2008, 18:25
PM MAIL ICQ   Вверх
baldina
Дата 3.3.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Цитата

Но тогда выходит что порядок вывода непрозрачных обьектов станет критичен. А координата глубины будет важна лишь для определения находится ли прозрачный обьект за/перед ближайшим к камере непрозрачным обьектом. Верно ли я понял?


Ну вобщем да. В том смысле, что вначале выводятся все непрозрачные (в любом порядке), потом - прозрачные.
Для более реалистичного вывода требуется, что бы прозрачные объекты выводились от дальнего к ближнему.

Добавлено через 1 минуту и 29 секунд
Это касается именно glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); т.к. формула несимметрична.
PM MAIL   Вверх
Math7244
Дата 4.3.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2008
Где: Deeptown

Репутация: нет
Всего: нет



Цитата(baldina @  3.3.2008,  23:07 Найти цитируемый пост)
Для более реалистичного вывода требуется, что бы прозрачные объекты выводились от дальнего к ближнему.

Ну когда камера закреплена, то определить какой из многоугольников надо нарисовать раньше легко.
А если камера у меня движется, то как тогда быть?  smile 
PM MAIL ICQ   Вверх
baldina
Дата 4.3.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



на каждом кадре определять.
или можно попробовать stencil buffer приспособить, выводя в несколько проходов. сам такое не пробовал, так что детали с ходу не расскажу, тут подумать надо
PM MAIL   Вверх
Math7244
Дата 5.3.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2008
Где: Deeptown

Репутация: нет
Всего: нет



Ок. Спасибо что прояснил эти детали со смешиванием...
Поставить плюсик увы не смогу, потому что не хватает постов.  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1029 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.