DirectX: характеристика версий, особенности использования

курсовая работа

Исходный код программы

.586

. MMX

. XMM

. MODEL FLAT, STDCALL

OPTION CASEMAP: none

INCLUDE masm32Includewindows. inc; Структуры, константы.

INCLUDE masm32Includekernel32. inc; Системные функции приложения.

INCLUDE masm32Includeuser32. inc; Интерфейс.

INCLUDE masm32Includegdi32. inc; Графический вывод.

INCLUDE masm32includewinmm. inc; Функция timeGetTime

INCLUDELIBmasm32Libkernel32. lib

INCLUDELIBmasm32Libuser32. lib

INCLUDELIBmasm32Libgdi32. lib

INCLUDELIB masm32libwinmm. lib

INCLUDE masm32Dxsdk90Include2005_jund3d9_all. inc

INCLUDELIB masm32Dxsdk90Lib2005_jund3d9. lib

INCLUDELIB masm32Dxsdk90Lib2005_jund3dx9. lib; Подключение D3DX функций (динамическая библиотека)

; ПРОТОТИПЫ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Init_Direct3D PROTO; Текст этих функций можно найти ниже

Destroy_Direct3D PROTO

Release_Object PROTO: DWORD

Set_Render_Parameters PROTO

Init_Scene PROTO

Render_Scene PROTO

; ====================================================

; Основная часть

; ====================================================

. DATA;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

szClassName db "MyClass", 0

szAppName db "DX9_Ku"," ",169,"Nikita", 0

; WNDCLASSEX - -------------------------------------------

cbSize dd 12*4

style dd CS_HREDRAW+CS_VREDRAW+20h

lpfnWndProc dd OFFSET WndProc

cbClsExtra dd 0

cbWndExtra dd 0

hInstance dd 400000h

hIcon dd 0

hCursor dd 0

hbrBackground dd BLACK_PEN

lpszMenuName dd 0

lpszClassName dd OFFSET szClassName

hIconSm dd 0

; Сообщения об ошибках - ---------------------------------

szDirect3D9 db "Не удалось создать обьект Direct3D9",9,9,0

szD3DDevice9 db "Не удалось создать устройство Direct3D9",9,0

. DATA?;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

msg MSG <>

hwnd HWND?

clientwindow RECT <>

. CONST;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

WIN_X EQU 640; Размер окна по горизонтали

WIN_Y EQU 480; Размер окна по вертикали

. CODE;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Start:

invoke GetModuleHandle, NULL

mov hInstance, eax

invoke LoadCursor, NULL, IDC_ARROW

mov hCursor, eax

invoke RegisterClassEx, ADDR cbSize

invoke GetSystemMetrics, SM_CXSCREEN

push eax

invoke GetSystemMetrics, SM_CYSCREEN

sub eax, WIN_Y

shr eax, 1

pop ebx

sub ebx, WIN_X

shr ebx, 1

invoke CreateWindowEx, NULL, ADDR szClassName, ADDR szAppName,

WS_SYSMENU or WS_VISIBLE,

ebx, eax, WIN_X, WIN_Y, NULL, NULL, hInstance, NULL

mov hwnd, eax

invoke GetClientRect, eax, ADDR clientwindow

invoke Init_Direct3D; Создаем устройство

msg_loop:

invoke PeekMessageA, ADDR msg, 0, 0, 0, PM_REMOVE;

test eax, eax;

jne message; Если у окна нет сообщений.

;

invoke Render_Scene;. то отрисовывается сцена

jmp msg_loop;

;

message:;

mov eax, DWORD PTR msg. message;

cmp eax, WM_QUIT;

je end_loop;

;

invoke TranslateMessage, ADDR msg;

invoke DispatchMessage, ADDR msg;

jmp msg_loop

end_loop:

mov eax, msg. wParam; Если цикл обработки сообщений прерван,

; то код выхода из программы передается в поле wParam

Exit:; сообщения MSG.

invoke ExitProcess, eax

ret

; =====================================================

WndProc proc hWnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM

; =====================================================

cmp uMsg, WM_CREATE; Это сообщение посылается окну, когда оно создается

je wmCreate

cmp uMsg, WM_DESTROY; Это сообщение посылается окну, когда оно должно быть уничтожено.

je wmDestroy

cmp uMsg, WM_KEYDOWN; Это сообщение посылается окну, когда нажали клавишу на клавиатуре.

je wmKeydown

invoke DefWindowProc, hWnd, uMsg, wParam, lParam; Если Мы НЕ ХОТИМ обрабатывать полученное сообщение, то

ret; нам надо вызвать DefWindowProc с параметрами, которые Мы получили.

; Эта функция API обрабатывает не интересующие Нас события.

wmDestroy:; - -----------------------------------------

invoke Destroy_Direct3D

invoke PostQuitMessage, NULL

xor eax,eax

ret

wmCreate:; - -----------------------------------------

xor eax, eax

ret

wmKeydown:; - -----------------------------------------

mov eax, wParam

cmp eax, VK_ESCAPE

jne noExit

invoke SendMessage, hwnd, WM_CLOSE, NULL, NULL

noExit:

xor eax, eax

ret

WndProc endp

; =====================================================

; Начинается работа с Direct3D

; =====================================================

Init_Direct3D proc; Создавать Direct3DDevice в сообщении WM_Create нельзя!

. DATA

; D3DPRESENT_PARAMETERS - -----------------------------------------

BackBufferWidth dd 640; Ширина BackBuffer

BackBufferHeight dd 480; Высота BackBuffer

BackBufferFormat dd D3DFMT_X8R8G8B8; Формат используемой поверхности

BackBufferCount dd 3; число Back буферов.

MultiSampleType dd 0; уровни мультисэмплинга картинки. (обычно от 2-ух и выше)

MultiSampleQuality dd 0;

SwapEffect dd D3DSWAPEFFECT_FLIP; Эффект обмена поверхностей (BackBuffer)

hDeviceWindow dd 0; ID нашего окошка

Windowed dd 1; 0 - полноэкранный, 1 - в окошке

EnableAutoDepthStencil dd TRUE; 1 - Direct3D создает Z + Stencil буфер. Если 0 - ничего не будет создано

AutoDepthStencilFormat dd D3DFMT_D24S8; Формат используемой поверхности

Flags dd 1; 0 или D3DPRESENTFLAG_LOCKABLE_BACKBUFFER=1

FullScreen_RefreshRateInHz dd 0; Частота обновления экрана в Hz

FullScreen_PresentationInterval dd 1; Интервал показа на экране backbufferа.1 = Ждать обратного хода луча

. DATA?

pd3d dd?; или LPDIRECT3D9 (указатель на Direct3D9)

pd3dDevice dd?; или LPDIRECT3DDEVICE9 (указатель на Direct3DDevice)

. CODE

invoke Direct3DCreate9,D3D_SDK_VERSION

mov pd3d, eax

test eax, eax

jnz @F

push OFFSET szDirect3D9

jmp Error_Message

@@:

push clientwindow. right

pop BackBufferWidth

push clientwindow. bottom

pop BackBufferHeight

d3d9 CreateDevice, pd3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,

D3DCREATE_SOFTWARE_VERTEXPROCESSING,

ADDR BackBufferWidth, ADDR pd3dDevice

test eax, eax; Если возникла ошибка при создании устройства

jz @F

push OFFSET szD3DDevice9

jmp Error_Message

@@:

invoke Init_Scene

invoke Set_Render_Parameters

ret

Init_Direct3D endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Init_Scene proc

. DATA

EyeVector D3DVECTOR <-500.0f, 160.0f, 730.0f>; Координаты камеры в пространстве

LookAtVector D3DVECTOR <0.0f,230.0f, 0.0f>; Указывает куда смотрит камера

UpVector D3DVECTOR <0.0f, 1.0f, 0.0f>; Верх камеры. Обычно берется 0.0,1.0,0.0

PosLight D3DCOLORVALUE <-58335.0f,53913.0f,0.0f,0.0f >

FieldOfView dd 0.7853981635f

AspectRatio dd NULL; AspectRatio

NearViewPlanZ dd 50.0f; Передняя отсекающая плоскость

FarViewPlanZ dd 180000.0f; Задняя отсекающая плоскость

. DATA?

m_VS1 D3DXMATRIX <? >

WorldMatrix D3DMATRIX <? >; Мировая матрица

ViewMatrix D3DMATRIX <? >; Матрица вида

ProjectionMatrix D3DMATRIX <? >; Матрица проекции

BackBufferP LPDIRECT3DSURFACE9?

ZStenBackBufferP LPDIRECT3DSURFACE9?

DepthTargP LPDIRECT3DSURFACE9?

. CODE

fild BackBufferWidth; Вычисление Aspect (можно просто сразу поместить 1.33 (3) f)

fild BackBufferHeight

fdiv

fstp AspectRatio

invoke D3DXMatrixRotationY, ADDR WorldMatrix, NULL; World Matrix (мировая матрица)

invoke D3DXMatrixLookAtLH, ADDR ViewMatrix, ADDR EyeVector, ; View Matrix (матрица вида)

ADDR LookAtVector, ADDR UpVector

invoke D3DXMatrixPerspectiveFovLH, ADDR ProjectionMatrix, FieldOfView,; Matrix Projection (матрица проекции)

AspectRatio, NearViewPlanZ, FarViewPlanZ

; ScreenSpace

. DATA

; Таргет размеры

SSP_XY_640_480 D3DCOLORVALUE <0.0015625f,0.002083f,0.0f,0.0f >; Константы

SSEyeV D3DVECTOR <0.0f, 0.0f, - 1.0f>; Координаты камеры в пространстве

SSLookAtV D3DVECTOR <0.0f,0.0f, 0.0f>; Указывает куда смотрит камера

SSUpV D3DVECTOR <0.0f, 1.0f, 0.0f>; Верх камеры. Обычно берется 0.0,1.0,0.0

SSFieldOfView dd 0.3926990817f; D3DX_PI4; 0.7853981635f

SSAspectRatio dd 1.0f; AspectRatio

SSNearViewPlanZ dd 0.0f; Передняя отсекающая плоскость

SSFarViewPlanZ dd 1.0f

. DATA?

SSViewMatrix D3DMATRIX <? >

SSProjectionMatrix D3DMATRIX <? >

SSViewProjection D3DMATRIX <? >

m_SS D3DMATRIX <? >

. CODE

invoke D3DXMatrixLookAtLH, ADDR SSViewMatrix, ADDR SSEyeV, ; View Matrix (матрица вида)

ADDR SSLookAtV, ADDR SSUpV

invoke D3DXMatrixPerspectiveFovLH, ADDR SSProjectionMatrix, SSFieldOfView,; Matrix Projection (матрица проекции)

SSAspectRatio, SSNearViewPlanZ, SSFarViewPlanZ

invoke D3DXMatrixMultiply, ADDR m_SS, ADDR SSViewMatrix, ADDR SSProjectionMatrix

invoke D3DXMatrixTranspose, ADDR SSViewProjection, ADDR m_SS

; начальная загрузка

; Таргеты

d3dev9 GetRenderTarget, pd3dDevice, 0, addr BackBufferP

d3dev9 GetDepthStencilSurface,pd3dDevice,addr ZStenBackBufferP

d3dev9 CreateDepthStencilSurface,pd3dDevice, 1024,1024,AutoDepthStencilFormat,D3DMULTISAMPLE_NONE,0,TRUE,ADDR DepthTargP,0

. DATA?

CartoonRen dd?

CartoonRenP dd?

. CODE

d3dev9 CreateTexture, pd3dDevice,1024,1024,1,D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT, addr CartoonRen,0

. DATA

CartoonRenEER db "Create error CartoonRen",0

. CODE

test eax, eax

jz @F

push OFFSET CartoonRenEER

jmp Error_Message

@@:

d3dtex9 GetSurfaceLevel, CartoonRen,0,addr CartoonRenP

. DATA

CartoonRenPEER db "Create error CartoonRenP",0

. CODE

test eax, eax

jz @F

push OFFSET CartoonRenPEER

jmp Error_Message

@@:

. DATA?

NormalRen dd?

NormalRenP dd?

. CODE

d3dev9 CreateTexture, pd3dDevice,1024,1024,1,D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT, addr NormalRen,0

. DATA

NormalRenEER db "Create error NormalRen",0

. CODE

test eax, eax

jz @F

push OFFSET NormalRenEER

jmp Error_Message

@@:

d3dtex9 GetSurfaceLevel, NormalRen,0,addr NormalRenP

. DATA

NormalRenPEER db "Create error NormalRenP",0

. CODE

test eax, eax

jz @F

push OFFSET NormalRenPEER

jmp Error_Message

@@:

. DATA

tefect db "texture efect. bmp", 0

. DATA?

tefectP dd?

. CODE

invoke D3DXCreateTextureFromFileA, pd3dDevice, addr tefect, addr tefectP

. DATA

tefectEER db "Create error tefect",0

. CODE

test eax, eax

jz @F

push OFFSET tefectEER

jmp Error_Message

@@:

. DATA

Ekran db "modelEkran. x", 0

. DATA?

EkranP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr Ekran, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr EkranP

. DATA

EkranEER db "Create error Ekran",0

. CODE

test eax, eax

jz @F

push OFFSET EkranEER

jmp Error_Message

@@:

. DATA?

EkranPT dd?

EkranPB dd?

EkranP_VB dd?

EkranP_IB dd?

EkranP_NV dd?

EkranP_NF dd?

. CODE

d3dxmesh GetFVF,EkranP

mov EkranPT,eax

d3dxmesh GetNumBytesPerVertex,EkranP

mov EkranPB,eax

d3dxmesh GetVertexBuffer,EkranP, addr EkranP_VB

d3dxmesh GetIndexBuffer,EkranP, addr EkranP_IB

d3dxmesh GetNumVertices,EkranP

mov EkranP_NV,eax

d3dxmesh GetNumFaces,EkranP

mov EkranP_NF,eax

. DATA

kamen db "modelkamen. x", 0

. DATA?

kamenP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr kamen, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr kamenP

. DATA

kamenEER db "Create error kamen",0

. CODE

test eax, eax

jz @F

push OFFSET kamenEER

jmp Error_Message

@@:

. DATA?

kamenPT dd?

kamenPB dd?

kamenP_VB dd?

kamenP_IB dd?

kamenP_NV dd?

kamenP_NF dd?

. CODE

d3dxmesh GetFVF,kamenP

mov kamenPT,eax

d3dxmesh GetNumBytesPerVertex,kamenP

mov kamenPB,eax

d3dxmesh GetVertexBuffer,kamenP, addr kamenP_VB

d3dxmesh GetIndexBuffer,kamenP, addr kamenP_IB

d3dxmesh GetNumVertices,kamenP

mov kamenP_NV,eax

d3dxmesh GetNumFaces,kamenP

mov kamenP_NF,eax

. DATA

nebo db "model ebo. x", 0

. DATA?

neboP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr nebo, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr neboP

. DATA

neboEER db "Create error nebo",0

. CODE

test eax, eax

jz @F

push OFFSET neboEER

jmp Error_Message

@@:

. DATA?

neboPT dd?

neboPB dd?

neboP_VB dd?

neboP_IB dd?

neboP_NV dd?

neboP_NF dd?

. CODE

d3dxmesh GetFVF,neboP

mov neboPT,eax

d3dxmesh GetNumBytesPerVertex,neboP

mov neboPB,eax

d3dxmesh GetVertexBuffer,neboP, addr neboP_VB

d3dxmesh GetIndexBuffer,neboP, addr neboP_IB

d3dxmesh GetNumVertices,neboP

mov neboP_NV,eax

d3dxmesh GetNumFaces,neboP

mov neboP_NF,eax

. DATA

palmi db "modelpalmi. x", 0

. DATA?

palmiP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr palmi, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr palmiP

. DATA

palmiEER db "Create error palmi",0

. CODE

test eax, eax

jz @F

push OFFSET palmiEER

jmp Error_Message

@@:

. DATA?

palmiPT dd?

palmiPB dd?

palmiP_VB dd?

palmiP_IB dd?

palmiP_NV dd?

palmiP_NF dd?

. CODE

d3dxmesh GetFVF,palmiP

mov palmiPT,eax

d3dxmesh GetNumBytesPerVertex,palmiP

mov palmiPB,eax

d3dxmesh GetVertexBuffer,palmiP, addr palmiP_VB

d3dxmesh GetIndexBuffer,palmiP, addr palmiP_IB

d3dxmesh GetNumVertices,palmiP

mov palmiP_NV,eax

d3dxmesh GetNumFaces,palmiP

mov palmiP_NF,eax

. DATA

woda db "modelwoda. x", 0

. DATA?

wodaP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr woda, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr wodaP

. DATA

wodaEER db "Create error woda",0

. CODE

test eax, eax

jz @F

push OFFSET wodaEER

jmp Error_Message

@@:

. DATA?

wodaPT dd?

wodaPB dd?

wodaP_VB dd?

wodaP_IB dd?

wodaP_NV dd?

wodaP_NF dd?

. CODE

d3dxmesh GetFVF,wodaP

mov wodaPT,eax

d3dxmesh GetNumBytesPerVertex,wodaP

mov wodaPB,eax

d3dxmesh GetVertexBuffer,wodaP, addr wodaP_VB

d3dxmesh GetIndexBuffer,wodaP, addr wodaP_IB

d3dxmesh GetNumVertices,wodaP

mov wodaP_NV,eax

d3dxmesh GetNumFaces,wodaP

mov wodaP_NF,eax

. DATA

zemla db "modelzemla. x", 0

. DATA?

zemlaP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr zemla, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr zemlaP

. DATA

zemlaEER db "Create error zemla",0

. CODE

test eax, eax

jz @F

push OFFSET zemlaEER

jmp Error_Message

@@:

. DATA?

zemlaPT dd?

zemlaPB dd?

zemlaP_VB dd?

zemlaP_IB dd?

zemlaP_NV dd?

zemlaP_NF dd?

. CODE

d3dxmesh GetFVF,zemlaP

mov zemlaPT,eax

d3dxmesh GetNumBytesPerVertex,zemlaP

mov zemlaPB,eax

d3dxmesh GetVertexBuffer,zemlaP, addr zemlaP_VB

d3dxmesh GetIndexBuffer,zemlaP, addr zemlaP_IB

d3dxmesh GetNumVertices,zemlaP

mov zemlaP_NV,eax

d3dxmesh GetNumFaces,zemlaP

mov zemlaP_NF,eax

. DATA

f_vsEkran db "shadersvsEkran. inc", 0

. DATA?

a_vsEkran LPD3DXBUFFER?

b_vsEkran dd?

c_vsEkran LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsEkran, 0, 0, D3DXSHADER_DEBUG, addr a_vsEkran,0

. DATA

Z_vsEkranEER db "Create error Z_vsEkran",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsEkranEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsEkran

mov b_vsEkran,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsEkran,addr c_vsEkran

. DATA

C_vsEkranEER db "Create error C_vsEkran",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsEkranEER

jmp Error_Message

@@:

. DATA

f_vsKamen db "shadersvsKamen. inc", 0

. DATA?

a_vsKamen LPD3DXBUFFER?

b_vsKamen dd?

c_vsKamen LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsKamen, 0, 0, D3DXSHADER_DEBUG, addr a_vsKamen,0

. DATA

Z_vsKamenEER db "Create error Z_vsKamen",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsKamenEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsKamen

mov b_vsKamen,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsKamen,addr c_vsKamen

. DATA

C_vsKamenEER db "Create error C_vsKamen",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsKamenEER

jmp Error_Message

@@:

. DATA

f_vsNebo db "shadersvsNebo. inc", 0

. DATA?

a_vsNebo LPD3DXBUFFER?

b_vsNebo dd?

c_vsNebo LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsNebo, 0, 0, D3DXSHADER_DEBUG, addr a_vsNebo,0

. DATA

Z_vsNeboEER db "Create error Z_vsNebo",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsNeboEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsNebo

mov b_vsNebo,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsNebo,addr c_vsNebo

. DATA

C_vsNeboEER db "Create error C_vsNebo",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsNeboEER

jmp Error_Message

@@:

. DATA

f_vsSun db "shadersvsSun. inc", 0

. DATA?

a_vsSun LPD3DXBUFFER?

b_vsSun dd?

c_vsSun LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsSun, 0, 0, D3DXSHADER_DEBUG, addr a_vsSun,0

. DATA

Z_vsSunEER db "Create error Z_vsSun",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsSunEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsSun

mov b_vsSun,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsSun,addr c_vsSun

. DATA

C_vsSunEER db "Create error C_vsSun",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsSunEER

jmp Error_Message

@@:

. DATA

f_vsWater db "shadersvsWater. inc", 0

. DATA?

a_vsWater LPD3DXBUFFER?

b_vsWater dd?

c_vsWater LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsWater, 0, 0, D3DXSHADER_DEBUG, addr a_vsWater,0

. DATA

Z_vsWaterEER db "Create error Z_vsWater",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsWaterEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsWater

mov b_vsWater,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsWater,addr c_vsWater

. DATA

C_vsWaterEER db "Create error C_vsWater",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsWaterEER

jmp Error_Message

@@:

. DATA

f_vsZemla db "shadersvsZemla. inc", 0

. DATA?

a_vsZemla LPD3DXBUFFER?

b_vsZemla dd?

c_vsZemla LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsZemla, 0, 0, D3DXSHADER_DEBUG, addr a_vsZemla,0

. DATA

Z_vsZemlaEER db "Create error Z_vsZemla",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsZemlaEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsZemla

mov b_vsZemla,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsZemla,addr c_vsZemla

. DATA

C_vsZemlaEER db "Create error C_vsZemla",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsZemlaEER

jmp Error_Message

@@:

. DATA

f_psEkran db "shaderspsEkran. inc", 0

. DATA?

a_psEkran LPD3DXBUFFER?

b_psEkran dd?

c_psEkran LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psEkran, 0, 0, D3DXSHADER_DEBUG, addr a_psEkran,0

. DATA

Z_psEkranEER db "Create error Z_psEkran",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psEkranEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psEkran

mov b_psEkran,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psEkran,addr c_psEkran

. DATA

C_psEkranEER db "Create error C_psEkran",0

. CODE

test eax, eax

jz @F

push OFFSET C_psEkranEER

jmp Error_Message

@@:

. DATA

f_psKamen db "shaderspsKamen. inc", 0

. DATA?

a_psKamen LPD3DXBUFFER?

b_psKamen dd?

c_psKamen LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psKamen, 0, 0, D3DXSHADER_DEBUG, addr a_psKamen,0

. DATA

Z_psKamenEER db "Create error Z_psKamen",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psKamenEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psKamen

mov b_psKamen,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psKamen,addr c_psKamen

. DATA

C_psKamenEER db "Create error C_psKamen",0

. CODE

test eax, eax

jz @F

push OFFSET C_psKamenEER

jmp Error_Message

@@:

. DATA

f_psNebo db "shaderspsNebo. inc", 0

. DATA?

a_psNebo LPD3DXBUFFER?

b_psNebo dd?

c_psNebo LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psNebo, 0, 0, D3DXSHADER_DEBUG, addr a_psNebo,0

. DATA

Z_psNeboEER db "Create error Z_psNebo",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psNeboEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psNebo

mov b_psNebo,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psNebo,addr c_psNebo

. DATA

C_psNeboEER db "Create error C_psNebo",0

. CODE

test eax, eax

jz @F

push OFFSET C_psNeboEER

jmp Error_Message

@@:

. DATA

f_psPalma db "shaderspsPalma. inc", 0

. DATA?

a_psPalma LPD3DXBUFFER?

b_psPalma dd?

c_psPalma LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psPalma, 0, 0, D3DXSHADER_DEBUG, addr a_psPalma,0

. DATA

Z_psPalmaEER db "Create error Z_psPalma",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psPalmaEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psPalma

mov b_psPalma,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psPalma,addr c_psPalma

. DATA

C_psPalmaEER db "Create error C_psPalma",0

. CODE

test eax, eax

jz @F

push OFFSET C_psPalmaEER

jmp Error_Message

@@:

. DATA

f_psSun db "shaderspsSun. inc", 0

. DATA?

a_psSun LPD3DXBUFFER?

b_psSun dd?

c_psSun LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psSun, 0, 0, D3DXSHADER_DEBUG, addr a_psSun,0

. DATA

Z_psSunEER db "Create error Z_psSun",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psSunEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psSun

mov b_psSun,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psSun,addr c_psSun

. DATA

C_psSunEER db "Create error C_psSun",0

. CODE

test eax, eax

jz @F

push OFFSET C_psSunEER

jmp Error_Message

@@:

. DATA

f_psWater db "shaderspsWater. inc", 0

. DATA?

a_psWater LPD3DXBUFFER?

b_psWater dd?

c_psWater LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psWater, 0, 0, D3DXSHADER_DEBUG, addr a_psWater,0

. DATA

Z_psWaterEER db "Create error Z_psWater",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psWaterEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psWater

mov b_psWater,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psWater,addr c_psWater

. DATA

C_psWaterEER db "Create error C_psWater",0

. CODE

test eax, eax

jz @F

push OFFSET C_psWaterEER

jmp Error_Message

@@:

. DATA

f_psZemla db "shaderspsZemla. inc", 0

. DATA?

a_psZemla LPD3DXBUFFER?

b_psZemla dd?

c_psZemla LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psZemla, 0, 0, D3DXSHADER_DEBUG, addr a_psZemla,0

. DATA

Z_psZemlaEER db "Create error Z_psZemla",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psZemlaEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psZemla

mov b_psZemla,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psZemla,addr c_psZemla

. DATA

C_psZemlaEER db "Create error C_psZemla",0

. CODE

test eax, eax

jz @F

push OFFSET C_psZemlaEER

jmp Error_Message

@@:

ret

Init_Scene endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Set_Render_Parameters proc

d3dev9 SetRenderState, pd3dDevice, D3DRS_CULLMODE, D3DCULL_NONE

d3dev9 SetRenderState, pd3dDevice, D3DRS_ZENABLE,D3DZB_TRUE

d3dev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPIC

d3dev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MAGFILTER, 0

d3dev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MINFILTER, 0

d3dev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPIC

d3dev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC

d3dev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC

ret

Set_Render_Parameters endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Render_Scene proc

. DATA

Zvalue dd 1.0f; Значение для очистки Z буфера

Clearcolor dd 0; Цвет для очистки BackBufferа

. DATA?

. CODE

d3dev9 TestCooperativeLevel, pd3dDevice; Проверка кооперации

cmp eax, D3DERR_DEVICELOST; Если устройство потеряно то выход

jne noreset;

invoke Destroy_Direct3D

jmp Exit;

noreset:;

cmp eax, D3DERR_DEVICENOTRESET; Если устройство не потеряно и не сброшено то сбрасываем

jne noreset2;

d3dev9 Reset, pd3dDevice, ADDR BackBufferWidth;

invoke Set_Render_Parameters

noreset2:

d3dev9 BeginScene, pd3dDevice

; подготовка данных

d3dev9 SetRenderTarget,pd3dDevice,0,CartoonRenP; установка рендер таргетов

d3dev9 SetRenderTarget,pd3dDevice,1,NormalRenP

d3dev9 SetDepthStencilSurface,pd3dDevice,DepthTargP

d3dev9 Clear, pd3dDevice, 0, NULL, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,Clearcolor, Zvalue, 0; Очистка BackBufferа и Z-буфера

invoke D3DXMatrixMultiply, ADDR m_VS1, ADDR WorldMatrix, ADDR ViewMatrix

invoke D3DXMatrixMultiply, ADDR m_VS1, ADDR m_VS1, ADDR ProjectionMatrix

invoke D3DXMatrixTranspose, ADDR m_VS1, ADDR m_VS1

d3dev9 SetTexture, pd3dDevice, 0, tefectP

; Отрисовка земли

d3dev9 SetVertexShader,pd3dDevice,c_vsZemla

d3dev9 SetPixelShader,pd3dDevice,c_psZemla

d3dev9 SetVertexShaderConstantF,pd3dDevice,0, addr m_VS1, 4; c0

d3dev9 SetVertexShaderConstantF,pd3dDevice,4, addr PosLight, 1; c4

d3dev9 SetFVF, pd3dDevice, zemlaPT

d3dev9 SetStreamSource, pd3dDevice, 0, zemlaP_VB, 0, zemlaPB

d3dev9 SetIndices, pd3dDevice, zemlaP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,zemlaP_NV,0,zemlaP_NF

; Отрисовка солнца

d3dev9 SetVertexShader,pd3dDevice,c_vsSun

d3dev9 SetPixelShader,pd3dDevice,c_psSun

d3dev9 SetFVF, pd3dDevice, neboPT

d3dev9 SetStreamSource, pd3dDevice, 0, neboP_VB, 0, neboPB

d3dev9 SetIndices, pd3dDevice, neboP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,neboP_NV,0,neboP_NF

; Отрисовка камня

d3dev9 SetVertexShader,pd3dDevice,c_vsKamen

d3dev9 SetPixelShader,pd3dDevice,c_psKamen

d3dev9 SetFVF, pd3dDevice, kamenPT

d3dev9 SetStreamSource, pd3dDevice, 0, kamenP_VB, 0, kamenPB

d3dev9 SetIndices, pd3dDevice, kamenP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,kamenP_NV,0,kamenP_NF

; Отрисовка пальм

d3dev9 SetPixelShader,pd3dDevice,c_psPalma

d3dev9 SetFVF, pd3dDevice, palmiPT

d3dev9 SetStreamSource, pd3dDevice, 0, palmiP_VB, 0, palmiPB

d3dev9 SetIndices, pd3dDevice, palmiP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,palmiP_NV,0,palmiP_NF

; Отрисовка неба

d3dev9 SetRenderTarget,pd3dDevice,1,0

d3dev9 SetVertexShader,pd3dDevice,c_vsNebo

d3dev9 SetPixelShader,pd3dDevice,c_psNebo

d3dev9 SetFVF, pd3dDevice, neboPT

d3dev9 SetStreamSource, pd3dDevice, 0, neboP_VB, 0, neboPB

d3dev9 SetIndices, pd3dDevice, neboP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,neboP_NV,0,neboP_NF

; Отрисовка воды

d3dev9 SetRenderTarget,pd3dDevice,1,NormalRenP

d3dev9 SetVertexShader,pd3dDevice,c_vsWater

d3dev9 SetPixelShader,pd3dDevice,c_psWater

d3dev9 SetFVF, pd3dDevice, wodaPT

d3dev9 SetStreamSource, pd3dDevice, 0, wodaP_VB, 0, wodaPB

d3dev9 SetIndices, pd3dDevice, wodaP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,wodaP_NV,0,wodaP_NF

; смешивание

d3dev9 SetRenderTarget,pd3dDevice,0, BackBufferP

d3dev9 SetRenderTarget,pd3dDevice,1, 0

d3dev9 SetDepthStencilSurface,pd3dDevice,ZStenBackBufferP

d3dev9 Clear, pd3dDevice, 0, NULL, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,Clearcolor, Zvalue, 0; Очистка BackBufferа и Z-буфера

d3dev9 SetVertexShader,pd3dDevice,c_vsEkran

d3dev9 SetPixelShader,pd3dDevice,c_psEkran

d3dev9 SetTexture, pd3dDevice, 0, CartoonRen

d3dev9 SetTexture, pd3dDevice, 1, NormalRen

d3dev9 SetVertexShaderConstantF,pd3dDevice,3, addr SSViewProjection,4

d3dev9 SetVertexShaderConstantF,pd3dDevice,7, addr SSP_XY_640_480,1

d3dev9 SetFVF, pd3dDevice, EkranPT

d3dev9 SetStreamSource, pd3dDevice, 0, EkranP_VB, 0, EkranPB

d3dev9 SetIndices, pd3dDevice, EkranP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,EkranP_NV,0,EkranP_NF

d3dev9 EndScene, pd3dDevice

; Анимируем сцену

. DATA

RotZ dd 0.0f

Prib dd 0.002f

LightRot dd 0

LightPrib dd 0.01

kMoveLight dd 100000.0f

. CODE

fld RotZ

fadd Prib

fstp RotZ

fld LightRot

fadd LightPrib

fstp LightRot

fld LightRot

fsin

fmul kMoveLight

fstp PosLight. r

fld LightRot

fcos

fmul kMoveLight

fstp PosLight. g

invoke D3DXMatrixRotationY, ADDR WorldMatrix, RotZ

d3dev9 Present, pd3dDevice, NULL, NULL, NULL, NULL; Вывод BackBufferа на экран

ret

Render_Scene endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Release_Object proc pointer: DWORD

mov eax, pointer

test eax, eax

jz @F

d3dev9 Release, eax

@@:

ret

Release_Object endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Destroy_Direct3D proc; освобождение всех созданных объектов

; Шейдеры

invoke Release_Object, a_psZemla

invoke Release_Object, c_psZemla

invoke Release_Object, a_psWater

invoke Release_Object, c_psWater

invoke Release_Object, a_psSun

invoke Release_Object, c_psSun

invoke Release_Object, a_psPalma

invoke Release_Object, c_psPalma

invoke Release_Object, a_psNebo

invoke Release_Object, c_psNebo

invoke Release_Object, a_psKamen

invoke Release_Object, c_psKamen

invoke Release_Object, a_psEkran

invoke Release_Object, c_psEkran

invoke Release_Object, a_vsZemla

invoke Release_Object, c_vsZemla

invoke Release_Object, a_vsWater

invoke Release_Object, c_vsWater

invoke Release_Object, a_vsSun

invoke Release_Object, c_vsSun

invoke Release_Object, a_vsNebo

invoke Release_Object, c_vsNebo

invoke Release_Object, a_vsKamen

invoke Release_Object, c_vsKamen

invoke Release_Object, a_vsEkran

invoke Release_Object, c_vsEkran

; Модели

invoke Release_Object,zemlaP_IB

invoke Release_Object, zemlaP_VB

invoke Release_Object, zemlaP

invoke Release_Object, wodaP_IB

invoke Release_Object, wodaP_VB

invoke Release_Object, wodaP

invoke Release_Object, palmiP_IB

invoke Release_Object, palmiP_VB

invoke Release_Object, palmiP

invoke Release_Object, neboP_IB

invoke Release_Object, neboP_VB

invoke Release_Object, neboP

invoke Release_Object, kamenP_IB

invoke Release_Object, kamenP_VB

invoke Release_Object, kamenP

invoke Release_Object, EkranP_IB

invoke Release_Object, EkranP_VB

invoke Release_Object, EkranP

; текстуры

invoke Release_Object, tefectP

; Таргеты

invoke Release_Object, NormalRenP

invoke Release_Object, CartoonRenP

invoke Release_Object, DepthTargP

invoke Release_Object, ZStenBackBufferP

invoke Release_Object,BackBufferP

mov eax,pd3dDevice

test eax, eax

jz @F

d3dev9 Release, eax

@@:; Освобождение Direct3DDevice

mov eax,pd3d

test eax, eax

jz @F

d3dev9 Release, eax

@@:; Освобождение Direct3D9

ret

Destroy_Direct3D endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Error_Message:; Вывод сообщения об ошибке и завершение работы приложения

mov eax, DWORD PTR [esp]

invoke MessageBox, hwnd, eax, ADDR szAppName, MB_ICONERROR

pop eax

invoke Destroy_Direct3D

jmp Exit

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

end Start

Делись добром ;)