Мобильная версия сайта | |||||||||
[Главная] | [Новости] | [Статьи] |
[Проекты] |
[Ссылки] |
[Автор] |
||||
[Архив новостей] | |||||||||
[Форум] | на форуме можно задать вопрос, посмотреть ответы на часто задаваемые вопросы | ||||||||
Здравствуйте! Вы попали на информационно-образовательный сайт посвященный информатике, информационным технологиям и компьютерным играм. Подробнее о целях и задачах сайта в разделе Главная. [English version of this page here...] | |||||||||
[Базовые уроки по DirectX] [Основы DirectMusic на Delphi] [Основы DirectInput8 на Delphi] [Основы DirectSound8 на Delphi] | |||||||||
[Разработка компьютерной игры] [Пример игры Donuts3D] [Delphi DirectX] | |||||||||
Основы 3D-программирования DirectX8.1 в Delphi 6-7: теоретические и практические основы создания игр. | |||||||||
Вывод моделей с использованием шейдеров | |||||||||
10.01.2008 Эти заметки написаны с целью лучшего уяснения работы с шейдерами, а также для внедрения использования анимации в имеющийся код. |
|||||||||
[Все уроки] | |||||||||
За основу взят пример mdoscene. | |||||||||
Что необходимо для отрисовки модели с использованием шейдера? | |||||||||
Для начала нужно объявить необходимые типы и константы | |||||||||
const {...} VertexFormat = D3DFVF_XYZ or D3DFVF_NORMAL or D3DFVF_TEX1; type PVertex
= ^TVertex; |
|||||||||
В описании класса приложения для модели описываются следующие необходимые поля: m_matSeaFloor:
TD3DXMatrix; //
матрица трансформации модели |
|||||||||
В методе создания приложения обнуляем все указанные поля | |||||||||
constructor
CMyD3DApplication.Create; {...} m_pSeaFloor
:= nil; {...} end; |
|||||||||
В методе OneTimeSceneInit приложения производим создание необходимых объектов: {...} m_pSeaFloor := CD3DMesh.Create; {...} |
|||||||||
В методе инициализации приложения производим всю необходимую подготовку моделей (загрузку, генерацию и т.п.), а также создание и заполнение необходимых вершинных и индексных буферов. | |||||||||
function CSubmarineD3DApp.InitDeviceObjects: HResult; begin {...} if Failed(m_pSeaFloor.Create_(m_pd3dDevice, PChar(SeaFloorModel))) then Exit; {...} m_pSeaFloor.SetFVF(m_pd3dDevice,
VertexFormat); m_pd3dDevice.CreateVertexBuffer(m_dwNumSeaFloorVertices
* sizeof(TVertex),
// Copy vertices for the seafloor mesh
pDst[i].vPos.x := pDst[i].vPos.x * 0.2;
m_pd3dDevice.CreateIndexBuffer(m_dwNumSeaFloorFaces * 3 * sizeof(WORD),
// Copy indices for the seafloor mesh {...} end; |
|||||||||
В методе RestoreDeviceObjects приложения - создаем все зависимые от Direct3D-устройства объекты | |||||||||
TileMeshTexAndRestore(m_pSeaFloor, bSeaFloorTiled, SeaFloorTileCount); //в данном случае вызывается специальная процедура для заполнения модели нужным количеством тайлов. В простейшем случае просто происходит вызов m_pSeaFloor.RestoreDeviceObjects {...} RestoreRenderCausticsStates; //для краткости здесь записана данная процедура, внутри нее происходит установка нужных состояний отрисовки, создание и загрузка шейдеров {...} |
|||||||||
внутри процедуры RestoreRenderCausticsStates; происходит следующее: // удаляем старый вершинный шейдер (если предварительно вызывается метод InvalidateDeviceObjects, то это // будет избыточным)
if (m_dwShader <> 0) then
// создаем определение для вершинного шейдера нашей
модели strTestVertexShader := 'Media\Shaders\add.vsh';
// загрузка и ассемблирование вершинного шейдера
из файла |
|||||||||
В методе нарушения (Invalidate) приложения удаляем вершинный шейдер | |||||||||
function CSubmarineD3DApp.InvalidateDeviceObjects; begin {...}
{...} end; |
|||||||||
В методе отрисовки (Render) приложения производим отрисовку с помощью шейдера - | |||||||||
function CSubmarineD3DApp.Render; begin {...}
{...} end; |
|||||||||
внутри процедуры RenderCaustic: begin {...}
{...}
{...} end; |
|||||||||
внутри процедуры RenderScene: происходят только необходимые трансформации, т.е. фактическая отрисовка производится внутри RenderCaustic begin {...} D3DXMatrixScaling(m_matSeaFloor,
1.0, 1.0, 1.0); {...} end; |
|||||||||
В методе анимации сцены (FrameMove) приложения производим анимацию с помощью шейдера (если таковая имеет место) | |||||||||
function CSubmarineD3DApp.FrameMove begin {...}
{...} end; |
|||||||||
И наконец самое интересное происходит внутри метода procedure
CSubmarineD3DApp.AnimateCausticTex;
// Animate the caustic textures
// Some basic constants
fCaustics[2] := Sin(m_fTime)/8;
D3DXMatrixInverse(matSubmarineInv, nil, m_matWorldOfMesh{m_matSubmarine});
// Vertex shader operations use transposed matrices
m_pd3dDevice.SetVertexShaderConstant( 0, vZero, 1); |
|||||||||
далее нужно рассмотреть как осуществляется анимация в примере SkinnedMesh | |||||||||
[Назад] [Все уроки] | |||||||||
Обновления
и новости о развитии Delphi DirectX проекта http://www.megainformaticsite.pochta.ru http://www.megainformatic.boom.ru http://www.megainformatic.narod.ru
|
|||||||||
по всем вопросам пишите на megainformatic@mail.ru или оставьте сообщение на форуме |
|||||||||
Обмен ссылками | |||||||||
|
|||||||||
(с) МЕГА ИНФОРМАТИК 2006-2009 | |||||||||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |