От f(x,y)=sin(x+y) до 2D картинки
От f(x,y)=sin(x+y) до 2D картинки
Жизнь всегда была сложнее, чем хотелось бы программисту. Например, все было бы гораздо проще, если бы существовала некая функция ХочуЧтобыНарисовалсяГрафикФункции(). Но во-первых, по-русски функции называть нельзя, во-вторых, такой функции просто нет. Все, что умеет IDirect3DDevice8, это нарисовать некоторые примитивы, да и для этого надо проделать кучу подготовительной работы. Как минимум, вы должны разместить координаты примитивов в вертекс-буфер ("vertex buffer"). Полное обсуждение вертекс-буферов находится за пределами этой статьи и могу лишь сказать, что это некая абстракция простого блока памяти, предназначенного для хранения координат и свойств точек трехмерного пространства. Работа с буфером осуществляется через интерфейс IDirect3DVertexBuffer8. Вы может заблокировать вертекс-буфер, получив при этом указатель на область памяти. Разыменовав указатель, можно записать что-нибудь в буфер, не забыв потом его разблокировать. В демо-приложении вы можете увидеть как это делается.
Обычно перед рисованием чего-либо мы хотим очистить кадр, чтобы новый кадр не накладывался на предыдущий. Это делается вызовом метода IDirect3DDevice8::Clear(). Вы найдете это в функции C3DGraphic::ReRender():
hr = m_p3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, m_dwBackColor, f, 0);
if (FAILED(hr)) {
return hr;
}
Мы здесь очищаем весь back-буфер, заполняя его цветом m_dwBackColor. Кроме этого, очищается z-буфер – он заполняется значением 1.0. 1.0 соответствует максимально дальней от наблюдателя плоскости (горизонт, грубо говоря), 0.0 – максимально ближней. Непосредственно рисование на 3D устройстве начинается с
m_p3DDevice->BeginScene();
а заканчивается строкой
m_p3DDevice->EndScene();
Все, что находится между этими вызовами символизирует анимацию очередного кадра. Обратите внимание на то, что мы постоянно употребляем термин "back-буфер". Совершенно верно! Все, что мы сейчас нарисовали, не видно на экране, оно существует пока только в памяти компьютера (не будем уточнять, в какой именно: системной или видео – очень тонкий вопрос). Для того, чтобы эти изменения перенеслись на экран монитора необходимо скопировать изображение из back-буфера на основную поверхность. Это делается вызовом функции IDirect3DDevice8::Present().
Следующий код обеспечивает непосредственно отрисовку изображения трехмерной функции:
hr = m_p3DDevice->SetStreamSource(0, m_pDataVB, sizeof(GRAPH3DVERTEXSTRUCT));
if (FAILED(hr)) {
return hr;
}
hr = m_p3DDevice->SetVertexShader(D3DFVF_GRAPH3DVERTEX);
if (FAILED(hr)) {
return hr;
}
hr = m_p3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, m_dwElementsInVB – 2);
if (FAILED(hr)) {
return hr;
}
Переменная m_pDataVB является членом класса C3DGraphic, она содержит указатель на интерфейс IDirect3DVertexBuffer8. В нашем случае содержимое вертекс-буфера представляет из себя массив структур GRAPH3DVERTEXSTRUCT:
typedef struct {
FLOAT x, y, z;
FLOAT nx, ny, nz;
} GRAPH3DVERTEXSTRUCT;
Здесь x, y и z – координаты точки, nx, ny, nz – компоненты нормали. Вектор нормали используется подсистемой Direct3D, отвечающей за освещение сцены. Чуть позже мы рассмотрим, как можно рассчитать эти компоненты. Перед вызовом функции DrawPrimitive() мы должны указать vertex shader и используемый поток данных. Выбор и установка потока данных производится с помощью функции SetStreamSorce(). Мы передаем ей номер устанавливаемого потока (0, если оспользуется только один поток), указатель на вертекс-буфер, из которого будут браться данные, и размер каждого элемента в потоке (то есть, sizeof(GRAPH3DVERTEXSTRUCT). Vertex shaders – новая возможность Direct3D. Это эдакая абстракция, символизирующая обработку вершин (вертексов). Грубо говоря, vertex shader обеспечивает перевод точки из трехмерного пространства модели в двумерную картинную плоскость. Вы можете написать на особом языке скрипт, обеспечивающий этот перевод, а можете использовать один из поддерживаемых стандартных механизмов, что мы и сделаем. Наш vertex shader D3DFVF_GRAPH3DVERTEX определен как D3DFVF_XYZ | D3DFVF_NORMAL. Это означает, что каждая точка характеризуется 6-ю числами. Первые 3 из них трактуются как координаты вершины, остальные – как компоненты нормали.
После установки необходимых потока данных и вертекс-шейдера мы можем вызвать метод DrawPrimitive(), который отображает данные из вертекс-буфера на плоскость back-буфера. Способ рендеринга данных выбирается первым параметром этого метода – он может быть одним из значений перечисляемого типа D3DPRIMITIVETYPE: D3DPT_POINTLIST, D3DPT_LINELIST, D3DPT_LINESTRIP, D3DPT_TRIANGLELIST, D3DPT_TRIANGLESTRIP или D3DPT_TRIANGLEFAN. Я решил, что наиболее подходящим способом для построения графика функции является использование D3DPT_TRIANGLESTRIP, поскольку этот способ требует относительно немного памяти для хранения данных о поверхности. Триангуляции области построения графика осуществляется как показано на следующем рисунке.
Все это работает следующим образом: вертекс-буфер содержит точки P1, P2, P3, P4 и так далее. Когда я вызываю функцию DrawPrimitive() с параметром D3DPT_TRIANGLESTRIP, Direct3D начинает отображать треугольники 1, 2, 3 и так далее. Треугольник 1 определяется точками P1, P2, P3, треугольник 2 – P2, P3, P4. Таким образом, N точек, находящихся в вертекс-буфере, соответствуют (N-2) треугольникам. Все очень хорошо, но есть и недостатки: все треугольники получаются связаны друг с другом. Вот почему четные ряды триангулируются слева направо, а нечетные – наоборот. Думаю, нет необходимости напоминать, что всякого рода нумерации у меня начинаются с нуля.
Реализация всего этого находится в методе C3DGraphic::RecalculateData(). Эта функция использует вспомогательный класс CGraphGrid, который обеспечивает построение сетки графика функции.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Прозрачность и эффективность картинки
Прозрачность и эффективность картинки Я создал иконки полностью белыми PNG-изображениями, зная, что затем применю свойство opacity, чтобы отрегулировать прозрачность на уровне CSS. Такой подход изменил то, как я в некоторых ситуациях думаю о графических объектах
Статичные картинки
Статичные картинки Кроме динамических эффектов CSS Sprites широко используется и для объединения статических изображений. Давайте рассмотрим различные плюсы и минусы этого подхода.Основной опасностью склеивания большого количества иконок в одном месте являются артефакты
Google Картинки
Google Картинки Google Картинки – один из основных сервисов Google, ориентированный на поиск изображений, находящийся в постоянном развитии. В последнее время он заметно изменился и усовершенствовался, продолжая оставаться одним из самых популярных и мощных средств поиска
Яндекс.Картинки
Яндекс.Картинки Развитие системы поиска изображений одного из крупнейших российских интернет-поисковиков также не стоит на месте. В настоящее время система использует собственную индексную базу, а также задействует базу системы Picsearch. В системе Яндекс.Картинки
Рейд в «Картинки»
Рейд в «Картинки» Сегодня благодаря развитию Web 2.0 существует возможность размещать не только текстовую, но и визуальную информацию в Интернете на бесплатных, отлично индексируемых площадках.Речь идет о двух разных направлениях работы с изображениями.Прежде всего это
Загрузить картинки пользователя
Загрузить картинки пользователя Прежде всего, вам предстоит выбрать свою сетевую личину – «юзерпик» или «аватар». Его можно создать заранее из собственных фотографий, кадров из любимых фильмов… словом, из всего, что попадется под руку. Лишь бы выбранная картинка хоть
Вставляем картинки
Вставляем картинки Чтобы вставить на страничку картинку, нужно применить тег <IMG>. Этот тег имеет свой атрибут src, который указывает путь к картинке. Если наша картинка под названием, например, foto.jpg лежит в той же папке, что и HTML-файл, можно написать просто: <img src="foto.jpg">.
Картинки
Картинки Как подбирать визуальное сопровождение контента? Картинки должны быть по тематике вашей группы и вашего поста. Если вы пишете, например, о тайм-менеджменте, как мы, это могут быть или часы, или вариации на тему личной эффективности. Картинки должны дополнять и
Где брать картинки для статей
Где брать картинки для статей В Интернете есть много специализированных ресурсов, откуда можно открыто брать картинки для своего проекта. Такие сайты можно найти в поисковых системах по запросам «бесплатный банк изображений», или «freephotobank».Стоит отметить, что это не
Видео/Картинки
Видео/Картинки Запустите программу Nero Express. Пункт Видео/Картинки меню Что вы хотите записать? содержит три команды.• Video CD – записать на компакт-диск графические и видеофайлы, расположенные на жестком диске. Такой компакт-диск можно воспроизвести на компьютере, VCD– и
6.1. Картинки
6.1. Картинки Стоит напомнить, что изображения хранятся в графических файлах. Как правило, эти файлы имеют расширения JPG, GIF, PNG. Чтобы работать с ними профессионально, созданы специальные программные пакеты, но мы ведь не профессионалы, правда? Поэтому нам достаточно
Картинки
Картинки Современный сайт сложно представить без изображений. Не будем рассуждать об их необходимости, а сразу скажем, что для вставки картинки на веб-страницу используется тег <img src="URL">, где вместо букв URL пишется реальный адрес рисунка в Интернете. Тег вставки
Глава 8 Картинки для Интернета
Глава 8 Картинки для Интернета • Анимация• Разбиение изображения на пластиныПринято считать, что Photoshop для веб-мастера такой же незаменимый инструмент, как топор для дровосека. Ни в одной другой программе нельзя так быстро нарисовать кнопки, стрелки, баннеры и прочие
Картинки
Картинки Возможность графического оформления текста – одна из основных особенностей, отличающих простой текстовый редактор от мощной издательской системы. И в этом смысле Word выглядит весьма достойно, имея в своем распоряжении довольно мощные инструменты для работы с
Вывод картинки на экран
Вывод картинки на экран При запуске программа загружает из ресурсов картинку. Теперь надо вывести изображение на экран. Для этого нужно воспользоваться событием Paint, как показано в листинге 11.3.Листинг 11.3private void Form1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawImage(cheeseImage, 0, 0);}После
Вкладка Картинки
Вкладка Картинки В некоторых случаях в фильмах необходимо использовать фотоматериалы. Pinnacle Studio поддерживает набор функций, позволяющих не только помещать их в фильм, но и применять к ним некоторые эффекты. Вкладка Картинки (рис. 3.21) как раз и предназначена для просмотра и