Выполнение цикла рендеринга
<Предыдущая часть>
<Следующая часть>
После того, как вы создали окно приложения, объекты DirectX и подготовили сцену,
вы готовы рендерить ее. Рендеринг - это такой процесс прорисовывания сцены,
исходя из геометрических фигур объектов на сцене с накладыванием текстур, материалов
и освещения. Мы пока текстурами заниматься не будем.
Цикл рендеринга в приложении "Triangle" использует создаваемые позже
подпрограммы RenderScene и FrameMove. Первая процедура выполняет непосредственно
рендеринг, а вторая совершает трансформацию сцены, чтобы мы не уснули со скуки,
созерцая неподвижный треугольник.
Private Sub Run()
Do While g_bRunning = True
CNT = CNT + 1
RenderScene
FrameMove (CNT / 360)
g_dx.GetWindowRect Me.hWnd, g_rcDest
j = g_ddsPrimary.Blt(g_rcDest, g_ddsBackBuffer, g_rcSrc, DDBLT_WAIT)
If j <> DD_OK
Then MsgBox "Не могу скопировать исходный прямоугольник на поверхность
назначения." & _
Chr$(13) & Hex(j)
End
End If
DoEvents
Loop
End Sub
Чтобы процесс рендеринга не вошел в бесконечный цикл, мы предусмотрели выход
из него через логическую переменную g_bRunning. Но об этом мы поговорим в следующей
части. А пока, вернемся к рендерингу.
Прежде, чем еще раз отрендерить сцену, ее надо обновить. Немедленно, после
возвращения процедуры RenderScene, вызывается подпрограмма FrameMove. Эта подпрограмма
просто обновляет матрицу Мира, от которой в Direct3D зависит геометрия модели.
Приложение отражает вращение вокруг оси Y. Угол вращения передается процедуре
через параметр stepVal.
Private Sub FrameMove(stepVal As
Single)
Dim matSpinY As D3DMATRIX
Call g_dx.RotateYMatrix(matSpinY, stepVal)
Call g_d3dDevice.SetTransform(D3DTRANSFORMSTATE_WORLD, matSpinY)
End Sub
В реальности же ваши приложения в этом месте обновления сцены будут делать
гораздо больше, чем приложение вращения к объекту. В этом месте происходят все
сложные математические расчеты и перемещения объектов, которые пользователь
потом видит на экране. В сущности, чем комактнее и быстрее будет ваш код в этом
месте, тем быстрее приложение сможет перейти к рендерингу кадра и тем лучше
будут показатели FPS (кадров в секунду).
Когда геометрия модели обновлена и отражает желаемый эффект анимации, вы можете
рендерить сцену. В нашем приложении этим будет заниматься процедура RenderScene.
Она начинает с очистки объекта Viewport.
Private Sub RenderScene()
' Очистить viewport в голубой цвет.
g_d3dDevice.Clear 1, g_d3drcViewport(), D3DCLEAR_TARGET, &HFF, 0, 0
Этот код вызывает метод Direct3DDevice7.Clear для очистки Viewport. Первые
два аргумента указывают на участок ли участки на Viewport, которые должны быть
очищены и на их количество. В большинстве случаев, как в этом приложении вы
будете очищать один участок, охватывающий целиком весь объект Viewport. Следующий
аргумент говорить что очищать. Так как наше приложение не использует глубинные
буфера, передается только флаг D3DCLEAR_TARGET. Последние три параметра устанавливают
значения очистки для цели рендеринга и буферов.
После очистки, программа информирует Direct3D о том, что начинается процедура
рендеринга, выполняет рендеринг, а затем сигналит, что рендеринг закончен. Это
показано здесь:
' Начать, рендерить
треугольник, затем завершить
g_d3dDevice.BeginScene
Call g_d3dDevice.DrawPrimitive(D3DPT_TRIANGLELIST, D3DFVF_VERTEX, _
g_TriangleVert(0), 6, D3DDP_DEFAULT)
g_d3dDevice.EndScene
End Sub
Методы Direct3DDevice7.BeginScene и Direct3DDevice7.EndScene говорят системе
о начале и конце рендеринга. Вы можете помещать команды рендеринга только между
этими методами.
<Вверх>
Posted: 23.01.2k1
Autor: Antiloop
<anti_loop@mail.ru>
|