
- •Оглавление
- •DirectX
- •Ключевые особенности версий DirectX
- •Вершинные шейдеры (Vertex Shader)
- •Геометрические шейдеры (Geometry Shader)
- •Пиксельные шейдеры (Pixel Shader)
- •Шейдерные языки
- •Профессиональный рендеринг
- •RenderMan
- •Open Shading Language
- •Рендеринг в реальном времени
- •Шейдерный язык OpenGl
- •Шейдерный язык Cg
- •Шейдерные языки DirectX Низкоуровневый шейдерный язык DirectX (DirectX asm)
- •Описание использующихся функций
- •Исходный код программы
- •Пример работы программы
- •Список литературы
Исходный код программы
.586
.MMX
.XMM
.MODEL FLAT, STDCALL
OPTION CASEMAP:none
INCLUDE \masm32\Include\windows.inc ; Структуры, константы ...
INCLUDE \masm32\Include\kernel32.inc ; Системные функции приложения ...
INCLUDE \masm32\Include\user32.inc ; Интерфейс ...
INCLUDE \masm32\Include\gdi32.inc ; Графический вывод ...
INCLUDE \masm32\include\winmm.inc ; Функция timeGetTime
INCLUDELIB \masm32\Lib\kernel32.lib
INCLUDELIB \masm32\Lib\user32.lib
INCLUDELIB \masm32\Lib\gdi32.lib
INCLUDELIB \masm32\lib\winmm.lib
INCLUDE \masm32\Dxsdk90\Include\2005_jun\d3d9_all.inc
INCLUDELIB \masm32\Dxsdk90\Lib\2005_jun\d3d9.lib
INCLUDELIB \masm32\Dxsdk90\Lib\2005_jun\d3dx9.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\tefect.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 "model\Ekran.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 "model\kamen.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\nebo.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 "model\palmi.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 "model\woda.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 "model\zemla.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 "shaders\vsEkran.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 "shaders\vsKamen.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 "shaders\vsNebo.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 "shaders\vsSun.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 "shaders\vsWater.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 "shaders\vsZemla.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 "shaders\psEkran.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 "shaders\psKamen.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 "shaders\psNebo.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 "shaders\psPalma.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 "shaders\psSun.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 "shaders\psWater.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 "shaders\psZemla.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