Народный учебник по OpenGL



Урок 8. Смешивание - часть 2


Комментарий Rui Martins: более правильный путь состоит в том, чтобы вывести все прозрачные (с альфой < 1.0) полигоны после того, как Вы вывели полную сцену, и выводить их в обратном порядке глубины (сначала – дальние).

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

Вы должны СОРТИРОВАТЬ ПРОЗРАЧНЫЕ ПОЛИГОНЫ ПО ГЛУБИНЕ и выводить их ПОСЛЕ ТОГО, КАК БЫЛА ОТРИСОВАНА ПОЛНАЯ СЦЕНА с ВЫКЛЮЧЕННЫМ БУФЕРОМ ГЛУБИНЫ, или получится неправильно. Я знаю, что это иногда трудно, но это - правильный способ делать это.

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

#include <windows.h>    // Заголовочный файл для Windows

#include <stdio.h>      // Заголовочный файл для стандартного ввода/вывода

#include <gl\gl.h>      // Заголовочный файл для библиотеки OpenGL32

#include <gl\glu.h>     // Заголовочный файл для для библиотеки GLu32

#include <gl\glaux.h>   // Заголовочный файл для библиотеки GLaux

HDC          hDC=NULL;  // приватный контекст устройства GDI

HGLRC        hRC=NULL;  // постоянный контекст рендеринга

HWND         hWnd=NULL; // содержит дискриптор нашего окна

HINSTANCE    hInstance; // содержит экземпляр нашего приложения

bool        keys[256];       // массив для процедуры обработки клавиатуры

bool        active=TRUE;     // флаг активности окна, по умолчанию TRUE

bool        fullscreen=TRUE; // флаг полноэкранного режима, по умолчанию полный экран

bool  blend; // Смешивание НЕТ/ДА? (НОВОЕ)

bool  light; // Освещение Вкл./Выкл.

bool  lp;    // L Нажата?




Содержание  Назад  Вперед