Автор работы: Пользователь скрыл имя, 11 Декабря 2011 в 07:50, дипломная работа
Задача моделирования фотореалистичной воды в реальном времени является одной из классических задач компьютерной графики. Это связано с тем, что вода является сложным природным объектом, и ее внешний вид зависит от многих факторов таких, как окружающий мир или положение наблюдателя. Поэтому очень важно знать основные факторы, влияющие на поведение и внешний вид воды. Но в различных ситуациях поведение воды может очень сильно различаться, поэтому нужно выделять категории эффектов, характерные для каждого случая (в основном, это относится только к физическому поведению поверхности воды).
1. Введение 3
1.1 Обзор публикаций 4
1.2 Постановка задачи 6
2. Имитация поведения поверхности воды 7
2.1 Выбор типа сетки для представления поверхности воды 7
2.2 Волновое уравнение поверхности 8
3. Имитация оптических эффектов 12
3.1 Оптические свойства воды 12
3.2 Создание текстур 13
3.3 Проекционное текстурирование 15
3.4 Отсечение объектов 16
3.5 Цвет воды 17
4. Описание приложения 19
4.1 HLSL – высокоуровневый язык шейдеров 19
4.2 Рендеринг в текстуру (Render To Texture) 21
4.3 Руководство пользователя 21
5. Заключение 23
6. Список литературы 24
Возможность реализовать все версии эффекта в одном файле дает нам более полную инкапсуляцию эффекта в целом, а объединение реализации эффекта это и есть одна из целей каркаса эффектов.
Каждая техника объединяет один или несколько проходов визуализации (rendering passes). Проход визуализации объединяет режимы устройства, режимы выборки и шейдеры, используемые для визуализации на данном этапе. Причина наличия нескольких проходов в том, что для реализации некоторых эффектов необходимо визуализировать один и тот же объект несколько раз с различными режимами визуализации, шейдерами и т.д. для каждого прохода.
Файл эффектов не ограничивает нас только использованием программируемого конвейера. Например, можно использовать фиксированный конвейер для управления режимами устройств, такими как освещение, материалы и текстуры.
Мы решаем волновое уравнение численно с помощью шейдеров. Для этого мы используем текстуру. По сути, текстура - это массив цветовых точек. Текстуры бывают разного формата, есть RGB, есть с альфа-каналом (RGBA), монохромные и много других. Мы используем текстуру формата RGBA. В ней мы будем хранить вычисленное значение и значение с предыдущего шага, так как оба эти значения нужны для последующих расчетов. Так же будем вычислять нормали к поверхности воды и составлять карту нормалей. Для этого нам понадобится техника рендеринга в текстуру.
Данный метод достаточно широко распространен в компьютерной графике и является одной из продвинутых техник. С одной стороны, это не очень сложно, но с другой стороны этот способ является мощным средством создания многих визуальных эффектов (например, эффект свечения вокруг объекта – glow effect, карты окружения и карты теней, эффекты постобработки, а также многое другое).
Принцип использования метода очень прост:
Для упрощения процесса можно использовать интерфейс ID3DXRenderToSurface. В таком случае не нужно будет заботиться о сохранении backbuffer’a, а кроме того появится возможность производить рендеринг с включенным аппаратным сглаживанием.
Исходя из вышесказанного, можно утверждать, что данный метод является вполне простым, но, тем не менее, мощным средством создания некоторых эффектов.
рис.19 Внешний вид приложения
Для
успешного запуска приложения необходимо,
чтобы видеокарта поддерживала Shader
Model 2.0.
Управление производится с помощью клавиатуры и мыши:
WASD или стрелки – движение
SHIFT (при движении) – быстрое перемещение
SPACE – прыжок (в режиме хождения по ландшафту)
Правая
кнопка мыши – переключение режимов
GUI и управления камерой
Приложение
позволяет настраивать: силу искажений
и дождя, коэффициент вязкости жидкости.
Итак, в результате работы были изучены некоторые способы физического моделирования и реализован один из них (численное решение волнового уравнения)
Кроме
физических моделей были также рассмотрены
способы визуального
В итоге, мы получили реализацию физической модели, позволяющей эффективно имитировать движение водной поверхности и ее взаимодействие с объектами (а именно, точечное воздействие на поверхность воды), а так же реализовали основные оптические свойства воды.
Будущие исследования будут вестись в следующих направлениях.
Во-первых, реализация других физических моделей (например, волны Gerstner или быстрое преобразование Фурье).
Во-вторых,
увеличение реалистичности и детальности
отображения воды. Здесь открывается
широкий простор для
NXWater.h
#ifndef _NX_WATER_
#define _NX_WATER_
#include <d3dx9.h>
#include "NXCommon.h"
//----------------------------
HRESULT NXCreateRegularGrid(
UINT iXCount, UINT iZCount, float fXWidth, float fZWidth,
D3DXVECTOR3 vCenter);
D3DXMATRIX NXObliqueFrustumCulling(
//----------------------------
class NXWaterCore
{
protected:
D3DXMATRIX m_mReflect; // reflection matrix (about water plane)
D3DXMATRIX m_mTex; // remapping matrix (to transform texture coords)
D3DXMATRIX m_mProj; //
extended projection matrix (increased FOV)
D3DXPLANE m_plNormal; // real water plane
D3DXPLANE m_plLower; // clip planes for rendering reflection & refraction
D3DXPLANE m_plUpper;
float m_fLevel; // water level
float m_fShift; // clip planes shift
float
m_fFOV; //
current field-of-view for projection matrix
public:
NXWaterCore();
~NXWaterCore();
void Init(float fLevel, float fShift);
void RebuildProjectionMatrix(float fFOV);
void
InitProjectionMatrix(float fFOV, D3DXMATRIX* pMatrix);
inline void SetLevel(float fLevel) { Init(fLevel, m_fShift); }
inline void
SetPlaneShift(float fShift) { Init(m_fLevel, fShift); }
inline float
GetLevel() { return m_fLevel; }
inline D3DXPLANE& LowerPlane() { return m_plLower; }
inline D3DXPLANE& Plane() { return m_plNormal; }
inline
D3DXPLANE& UpperPlane() { return m_plUpper; }
inline D3DXMATRIX& ReflectionMatrix() { return m_mReflect; }
inline D3DXMATRIX& ScreenToTexMatrix() { return m_mTex; }
inline D3DXMATRIX& ProjExMatrix() { return m_mProj; }
};
//----------------------------
class DepthTexture
{
public:
ID3DXRenderToSurface* m_RTS;
IDirect3DSurface9* m_TopSurface;
public:
DepthTexture(int iWidth, int iHeight,D3DFORMAT TexFormat);
~DepthTexture();
void BeginScene();
void
EndScene();
void OnLostDevice();
Информация о работе Моделирование и визуализация водных поверхностей