Выполнение цикла рендеринга

<Уголок DirectX> <Предыдущая часть> <Следующая часть>


После того, как вы создали окно приложения, объекты 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 говорят системе о начале и конце рендеринга. Вы можете помещать команды рендеринга только между этими методами.

<Вверх>