Skip to content

Instantly share code, notes, and snippets.

@Imperat
Created October 23, 2016 17:19
Show Gist options
  • Save Imperat/69510427e6bbfe339afac0c6eef7c6b0 to your computer and use it in GitHub Desktop.
Save Imperat/69510427e6bbfe339afac0c6eef7c6b0 to your computer and use it in GitHub Desktop.
\documentclass[bachelor, och, coursework, times]{SCWorks}
% параметр - тип обучения - одно из значений:
% spec - специальность
% bachelor - бакалавриат (по умолчанию)
% master - магистратура
% параметр - форма обучения - одно из значений:
% och - очное (по умолчанию)
% zaoch - заочное
% параметр - тип работы - одно из значений:
% referat - реферат
% coursework - курсовая работа (по умолчанию)
% diploma - дипломная работа
% pract - отчет по практике
% nir - отчет о научно-исследовательской работе
% autoref - автореферат выпускной работы
% assignment - задание на выпускную квалификационную работу
% review - отзыв руководителя
% critique - рецензия на выпускную работу
% параметр - включение шрифта
% times - включение шрифта Times New Roman (если установлен)
% по умолчанию выключен
\usepackage[T2A]{fontenc}
\usepackage[cp1251]{inputenc}
\usepackage{graphicx}
\usepackage[sort,compress]{cite}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{fancyvrb}
\usepackage{longtable}
\usepackage{array}
\usepackage[english,russian]{babel}
\usepackage[colorlinks=true]{hyperref}
\newcommand{\eqdef}{\stackrel {\rm def}{=}}
\newtheorem{lem}{Лемма}
\begin{document}
% Кафедра (в родительном падеже)
\chair{математической кибернетики и компьютерных наук}
% Тема работы
\title{Процедурная генерация поверхности океана в среде DirectX11}
% Курс
\course{3}
% Группа
\group{351}
% Факультет (в родительном падеже) (по умолчанию "факультета КНиИТ")
%\department{факультета КНиИТ}
% Специальность/направление код - наименование
%\napravlenie{02.03.02 "--- Фундаментальная информатика и информационные технологии}
%\napravlenie{02.03.01 "--- Математическое обеспечение и администрирование информационных систем}
%\napravlenie{09.03.01 "--- Информатика и вычислительная техника}
\napravlenie{09.03.04 "--- Программная инженерия}
%\napravlenie{10.05.01 "--- Компьютерная безопасность}
% Для студентки. Для работы студента следующая команда не нужна.
%\studenttitle{Студентки}
% Фамилия, имя, отчество в родительном падеже
\author{Лелякина Михаила Александровича}
% Заведующий кафедрой
\chtitle{к.\,ф.-м.\,н.} % степень, звание
\chname{С.\,В.\,Миронов}
%Научный руководитель (для реферата преподаватель проверяющий работу)
\satitle{к.\,ф.-м.\,н.} %должность, степень, звание
\saname{С.\,В.\,Миронов}
% Руководитель практики от организации (только для практики,
% для остальных типов работ не используется)
\patitle{к.\,ф.-м.\,н., доцент}
\paname{Д.\,Ю.\,Петров}
% Семестр (только для практики, для остальных
% типов работ не используется)
\term{2}
% Наименование практики (только для практики, для остальных
% типов работ не используется)
\practtype{учебная}
% Продолжительность практики (количество недель) (только для практики,
% для остальных типов работ не используется)
\duration{2}
% Даты начала и окончания практики (только для практики, для остальных
% типов работ не используется)
\practStart{01.07.2016}
\practFinish{14.07.2016}
% Год выполнения отчета
\date{2016}
\maketitle
% Включение нумерации рисунков, формул и таблиц по разделам
% (по умолчанию - нумерация сквозная)
% (допускается оба вида нумерации)
%\secNumbering
\tableofcontents
% Раздел "Обозначения и сокращения". Может отсутствовать в работе
%\abbreviations
% Раздел "Определения". Может отсутствовать в работе
%\definitions
% Раздел "Определения, обозначения и сокращения". Может отсутствовать в работе.
% Если присутствует, то заменяет собой разделы "Обозначения и сокращения" и "Определения"
%\defabbr
% Раздел "Введение"
\intro
Данная курсовая работа посвящена процедурной генерации (моделированию) поверхностей в режиме реального времени
в среде DirectX11. В работе будут рассмотрены алгоритмы построения карт высот для моделирования поверхности океана.
Рендеринг фотореалистичной поверхности на текущий момент является актуальной задачей в компьютерной графике. При моделировании мультипликационных фильмов, систем виртуальной реальности а также реализации спецэффектов в фильмах
часто возникает необходимость моделирования водной поверхности.
Активные исследования в этой области начались в 1995 году с выходом фильмов <<Водный мир>> и <<Титаник>>.
\begin{figure}[!ht]
\centering
\includegraphics[scale=0.4]{water_world.jpg}
\caption{Высококачественный рендеринг поверхности воды в фильме <<Водный мир>>, 1995г.}\label{fig:fact-01}
\end{figure}
\begin{figure}[!ht]
\centering
\includegraphics[scale=0.2]{titanic.jpg}
\caption{Кадр из фильма <<Титаник>>, 1997г.}\label{fig:fact-01}
\end{figure}
В настоящее время ведущими студиями мира достигнут хорошей уровень рендеринга водной поверхности. Согласно источнику [1]
студии Pixar даже пришлось снижать уровень качества воды, чтобы зрители не подумали, что в мультфильме <<В поисках Немо>> используются реальным снимки поверхности океана.
\begin{figure}[!ht]
\centering
\includegraphics[scale=0.2]{pixar_water.jpg}
\caption{Кадр из мультипликационного фильма <<В поисках Немо>>, 2003 год.}\label{fig:fact-01}
\end{figure}
Также активному развитию данной области компьютерной графики способствует индустрия компьютерных игр. Если в кинематографе время рендеринга не является ключевым фактором, то в компьютерных играх воду нужно рисовать в режиме реального времени. Несмотря на то, что мощность современных GPU постоянно увеличивается, её часто бывает недостаточно для
полноценного рендеринга большого объёма воды. В связи с этим прибегают к системе параллельных вычислений, а также разрабатывают новые алгоритмы, минимизирующие количество вычислений. Из-за этого ограничения в данной работе вода рисуется на дискретной сетке размером 64 на 128 точек.
\section{Подходы к решению задачи}
Задачу рендеринга воды можно упростить, если принять, что высота водной поверхности в данной точке равна некоторой функции от координат.
$ h = f(x,y)$
Тогда отпадает необходимость рассматривать скорость течений под поверхностью и остальные физические характеристики жидкости. Задача симуляции жидкости практически переходит в задачу симуляции множества волн. Численному расчёту функции для каждой точки дискретной сетки и посвящены большинство современных алгоритмов.
\subsection {Волны Герстерна}
\subsection {Статистический алгоритм}
\subsection {Простой алгоритм сложения синусоид}
\section{Практическая часть}
\subsection {Используемые инструменты}
Разработка приложения будет проходить в среде разработки Visual Studio 2013 на языке Visual C++. Написанная программа будет использовать библиотеки Windows API и DirectX11. Для работы с библиотеками DirectX 11 используется пакет разработчика DirectX SDK. Шейдеры для приложения написаны на шейдерном высокоуровневом языке компании Microsoft - HLSL (Height Level Shader Language). Для удобства разработки все изменения будут фиксироваться в системе контроля версий git. Репозиторий с исходным кодом является распространяется по лицензии Apache Software Lisence 2.0 и доступен для скачивания и предложения изменений по ссылке https://github.com/Imperat/DirectX-CourseWork-2016
\subsection{Настройка окружения}
Настройка окружения для разработки приложений под систему DirectX11 подробна описана в моей предыдущей курсовой работе. Также как и в прошлый раз в зависимости стандартного проекта нужно добавить ссылки на местоположение заголовочных файлов DirectX.
\subsection{Привет, мир!}
\subsection{Вычисление простой волны}
\subsection{Вычисления суммы волн}
\subsection{Добавление интерактивности}
Добавим возможность перемещения камеры по сцене. Интерактивность сделаем наивно просто. Будем изменять значения координат вектора $ \vec{eye} $ при нажатии на клавиши стрелок на клавиатуре и нажатии клавиш 2 и 8 на Num секции. В самом начале программы введём глобальные переменные
\begin{verbatim}
float x_pos = 0.0f;
float y_pos = 0.0f;
float z_pos = 1.0f;
\end{verbatim}
сделаем зависимость вектора eye от описанных глобальных переменных:
\begin{verbatim}
XMVECTOR Eye = XMVectorSet( x_pos, z_pos, y_pos, 1.0f );
\end{verbatim}
с помощью обработки сообщений Windows API будем реагировать на нажатия клавиш и изменять значения глобальных переменных следующим образом:
\begin{verbatim}
switch( message )
{
case WM_PAINT:
hdc = BeginPaint( hWnd, &ps );
EndPaint( hWnd, &ps );
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
case WM_KEYDOWN:
switch (wParam){
case VK_NUMPAD8:
z_pos += 0.1;
break;
case VK_NUMPAD2:
z_pos -= 0.1;
break;
case VK_LEFT:
x_pos += 0.1;
break;
case VK_RIGHT:
x_pos -= 0.1;
break;
case VK_DOWN:
y_pos += 0.1;
break;
case VK_UP:
y_pos -= 0.1;
break;
}
break;
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
\end{verbatim}
\subsection{Использование текстур}
\subsection{Результат}
% Раздел "Заключение"
\conclusion
Моделирование водной поверхности является очень сложной областью компьютерной графики, использующей нетривиальный математический аппарат. Область исследований актуальна, так как на сегодняшний день не существует большого объёма открытой литературы, посвящённой данной теме. В мире open source так же очень мало программ с открытым кодом, моделирующих водную поверхность. По запросу <<DirectX Water>> на ресурсе github находится всего семь проектов (включая данную курсовую работу), шесть из которых написаны на языке C++ и один на C\#. Реализаций сложного алгоритма найдено не было.
Реализация сложного алгоритма, моделирование качественной модели освещения, распараллеливание работы видеокарты могут стать хорошей областью исследований для дипломной работы бакалавра и внести хороший вклад в компьютерную графику и мир open source.
% Список литературы
\bibliographystyle{gost780uv}
\bibliography{thesis}
% Окончание основного документа и начало приложений
% Каждая последующая секция документа будет являться приложением
\appendix
\section{Программный код для приложения <<Факториал>>}\label{pril:fact}
Листинг \verb"factorial.cpp"
\VerbatimInput[fontsize=\footnotesize, numbers=left, numbersep=2pt]{factorial.cpp}
Листинг \verb"fact.h"
\VerbatimInput[fontsize=\footnotesize, numbers=left, numbersep=2pt]{fact.h}
Листинг \verb"fact.cpp"
\VerbatimInput[fontsize=\footnotesize, numbers=left, numbersep=2pt]{fact.cpp}
Листинг \verb"Form1.h"
\VerbatimInput[fontsize=\footnotesize, numbers=left, numbersep=2pt]{Form1.h}
\end{document}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment