CUDA Assignment #3 Работа с текстурами, взаимодействие с OpenGL
Задание на выбор zТрассировка лучей: Отражения zТрассировка лучей: Преломления
Задание на выбор
zНеобходимо реализоватиь один из двух эффектов на выбор: yОтражние yПреломление zСцена: yСферы (минимум 2) xС отражением xС преломлением yСферы должны быть расположены на расстоянии не превышающим своего диаметра от плоскости yПлоскость z = 0 xМожно представить как 2 треугольника xЕсли выбран вариант с отражением – то плоскость обязательно отражающая xПлоскость обязательно с текстурированием zСферы должны двигаться – yможно задать простое движение по окружности вокруг zЗамер FPS yFPS можно выводить название окна zМинимальное разрешение экрана: 640х480
zВиртуальный глаз Находится в положении float3 eyePos Смотрит в направлении float3 eyeDir Имеет вектора ориентации float3 eyeUp и float3 eyeRight xeyeRight можно получить как векторное произведение eyeDir и eyeUp x В зависимости от того как взять векторное произведение получится левая или правая тройка векторов x Очевидно, что если eyeUp и eyeDir коллинеарны – то векторное произведение нулевое – это значит что вектор «вверх» выбран не верно. Генерация лучей
zЭкран Шириной int ScreenW и высотой int ScreenH Расстояние до экрана – float zNear Генерация лучей глаз Расстояние до экрана – zNear camDir
zЭкран yЧерез каждый пиксел экрана пускается луч Генерация лучей глаз
Пересечение луча и треугольника zОптимизированный вариант y Барицентрические координаты xu := u/S, v := v/S, t1 := t1/S x t1 = 1 – u - v y 3 уравнения, 3 неизвестных
Пересечение луча и треугольника zОптимизированный вариант
Пересечение луча и сферы P1P1 P2P2 P0P0 v r O Луч: Пересечени:
Пересечение луча и сферы zПри положительном дискриминанте выбирается минимальное положительное t P1P1 P2P2 P0P0 v r P1P1 P2P2 P0P0 v r
Отражение zПосчитать нормаль yДля плоскости ее задать просто yНа сфере [нормаль] = [точка пересечения] – [цент сферы] R n RrRr
Преломление R n RrRr η1η1 η2η2
Текстуры zХраните геометрию в текстурах или в разделяемой памяти. Так как геометрии мало, она туда поместится. zОбязательно текстурировать треугольник y texCoord = u*texCoordA + v*texCoordB + t1*texCoordC; y Используйте режим нормализованной адресации и wrap для заворачивания текстурных координат yИзображение шахматной доски не нужно грузить – его можно создать в отдельном кернеле
Отрисовка zРеализовать взаимодействие с OpenGL zКопировать цвет в PBO zНарисовать quad на весь экран с текстурой, содержащей результирующий цвет yКопировать цвет в оперативную память и рисовать с помощью glDrawPixels – защитано не будет
Вопросы