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