بایگانی نویسنده

آموزش DirectX-Graphic در ویژوال بیسیک قسمت نهم

دی ۳م, ۱۳۸۷
موضوع : ترسیم اشیا سه بعدی با استفاده از شی Mesh
شی Mesh که جزو اشیا D3DX می باشد امکان ترسیم اشیا سه بعدی پایه و همچنین ترسیم مش های custom دلخواه را به شما می دهد . در این درس از شی Mesh برای ترسیم یک کره ( sphere ) استفاده می کنیم . ابتدا متغیر sphere را بصورت زیر تعریف کنید :


Dim sphere as D3DXMesh


همچنین برای نورپردازی و اختصاص material به کره به متغیرهای زیر نیاز داریم :


Dim d3dLight As D3DLIGHT8
Dim material As D3DMATERIAL8
Dim Col As D3DCOLORVALUE


در تابع Initial پس از ساخت اشیا D3D و D3DX و D3DDevice بایستی پارامترهای رنگ ، نورپردازی و اختصاص ماده ( material ) به کره را بصورت زیر تنظیم کنید :


Col.a = 1
Col.b = 1
Col.g = 1
Col.r = 1
d3dLight.Type = D3DLIGHT_DIRECTIONAL
d3dLight.diffuse = Col
d3dLight.Direction = vec(-1, -1, -1)x


نورپردازی از نوع جهت دار با رنگ col و بردار جهت (۱-,۱-,۱-) است .
نکته :
رنگ ambient رنگی است که هنگامیکه جسم در سایه باشد به خود می گیرد . بعبارت دیگر این رنگ را جسم وقتی که در معرض یک نور ambient باشد از خود منعکس می کند .
رنگ diffuse رنگی است که هنگامیکه جسم در معرض نور مستقیم قرار بگیرد از خود منعکس می کند .


material.Ambient = Col
material.diffuse = Col
d3dDevice.SetMaterial material
d3dDevice.SetLight 0, d3dLight
d3dDevice.LightEnable 0, 1


سپس بایستی پارامترهای rendering را تنظیم کنید :


d3dDevice.SetRenderState D3DRS_LIGHTING, 1
d3dDevice.SetRenderState D3DRS_ZENABLE, 1
d3dDevice.SetRenderState D3DRS_LIGHTING, 1
d3dDevice.SetRenderState D3DRS_ZENABLE, 1
d3dDevice.SetRenderState D3DRS_SHADEMODE, D3DSHADE_GOURAUD
d3dDevice.SetRenderState D3DRS_AMBIENT, &H202020
d3dDevice.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
d3dDevice.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR


حال بایستی شی sphere را بسازیم :


Set Sphere = d3dx.CreateSphere(d3dDevice, 2, 1000, 20, Nothing)x


که ۲ شعاع کره و ۱۰۰۰ تعداد slice هایی است که کره با آن ساخته می شود .
سپس بردارهای نقطه دید و مکان دوربین و رنگ زمینه را تنظیم کنید ( viewpoint و camerapoint از نوع D3DVECTOR هستند ) .


ViewPoint = vec(0, 0, 0)
CameraPoint = vec(4, 4, 4)
BackColor = &H404040


در روتین Render ابتدا ماتریسها و بردارهای صحنه را تنظیم می کنیم :


D3DXMatrixIdentity matWorld
d3dDevice.SetTransform D3DTS_WORLD, matWorld
D3DXMatrixRotationY matView, Rotation
D3DXMatrixLookAtLH matTemp, CameraPoint, ViewPoint, vec(0, 1, 0)
D3DXMatrixMultiply matView, matView, matTemp
d3dDevice.SetTransform D3DTS_VIEW, matView
D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1, 0.1, 500
d3dDevice.SetTransform D3DTS_PROJECTION, matProj


در پایان نیز شروع به رندر صحنه می کنیم :


d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, BackColor, 1, 0
d3dDevice.BeginScene
Sphere.DrawSubset 0
d3dDevice.EndScene
d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0

آموزش DirectX-Graphic در ویژوال بیسیک قسمت هشتم

دی ۳م, ۱۳۸۷
موضوع :‌ترسیم متن دو بعدی در DirectX

در این درس روش ترسیم متن با دو نوع فونت را نشان خواهم داد :
برای رسم یک متن با فونت تعریف شده در سیستم از شی D3DXFont استفاده می کنیم :


Dim MainFont as D3DXFont
Dim MainFontDesc as IFont
Dim TextRect as RECT
Dim fnt as new stdFont


در حالیکه برای ایجاد یک متن با فونت custom ابتدا یک texture تعریف می کنیم :


Dim fntTex as Direct3DTexture8


همچنین برای ترسیم هر کاراکتر یک آرایه vertex ای را از نوع TLVERTEX تعریف می نمائیم :


Dim vertchar(3) as TLVERTEX


حال به سراغ تابع Initialize می رویم . در این تابع ابتدا دستورات مربوط به ایجاد اشیا D3D و D3Dx را قرا دهید سپس دستورات مربوط به اختصاص آداپتور و نیز ایجاد شی D3DDevice را انجام می دهیم . حال دستورات تنظیم shader و rendering را می آوریم :


D3DDevice.SetVertexShader TL_FVF
D3DDevice.SetRenderState D3DRS_LIGHTING, False


سپس تنظیمات پارامترهای transparency برای rendering را انجام می دهیم :


D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, True


حال بایستی textureرا طوری فیلتر کنیم که در زمان stretch شدن یا squash شدن بهتر بنظر برسد :


D3DDevice.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
D3DDevice.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR


حال فیلتر Z را فعال می کنیم :


D3DDevice.SetRenderState D3DRS_ZENABLE, 1


سپس ماتریسهای world ، view و projection را تنظیم می کنیم :


D3DXMatrixIdentity matWorld
D3DDevice.SetTransform D3DTS_WORLD, matWorld
D3DXMatrixLookAtLH matView, MakeVector(0, 9, -9), MakeVector(0, 0, 0), MakeVector(0, 1, 0)
D3DDevice.SetTransform D3DTS_VIEW, matView
D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1, 0.1, 500
D3DDevice.SetTransform D3DTS_PROJECTION, matProj


حال به بخش تنظیم پارامترهای فونت می رسیم . در مورد فونت دو بعدی عادی :


fnt.Name = “Verdana”x
fnt.Size = 18
fnt.Bold = True
Set MainFontDesc = fnt
Set MainFont = D3DX.CreateFont(D3DDevice, MainFontDesc.hFont)x


و در مورد فونت custom :


Set fntTex = D3DX.CreateTextureFromFileEx(D3DDevice, yourfilename, 256, 128, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_POINT, D3DX_FILTER_POINT, &HFF00FF00, ByVal 0, ByVal 0)x
end function


روتین Render بصورت زیر خواهد بود :


Public Sub Render()x
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0
D3DDevice.BeginScene


برای رندر متن با فونت عادی بصورت زیر عمل می کنیم :


TextRect.Top = 440
TextRect.Left = 1
TextRect.bottom = 480
TextRect.Right = 640
D3DX.DrawText MainFont, &HFFCCCCFF, “Current Frame Rate: ” & FPS_Current, TextRect, DT_TOP Or DT_CENTER


برای رندر متن با فونت custom بصورت زیر عمل می کنیم :


RenderStringFromCustomFont_2D “Hamed Sheidaian”, 1, 1, 16, 16
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub


همانطور که مشاهده می کنید از روتینی با نام RenderStringFromCustomFont_2D استفاده شده است :


Private Sub RenderStringFromCustomFont_2D(strText As String, startX As Single, StartY As Single, Height As Integer, Width As Integer)x
Dim I As Integer
Dim CharX As Integer, CharY As Integer
Dim Char As String
Dim LinearEntry As Integer
If Len(strText) = 0 Then Exit Sub
For I = 1 To Len(strText)x


1 – ابتدا بایستی مختصات texture را انتخاب کنیم . برای اینکار بایستی هر entry را در texture جدا کنیم :


Char = Mid$(strText, I, 1)x
If Asc(Char) >= 65 And Asc(Char) <= 90 Then
LinearEntry = Asc(Char) – 65
ElseIf Asc(Char) >= 97 And Asc(Char) <= 122 Then
LinearEntry = Asc(Char) – 71
ElseIf Asc(Char) >= 48 And Asc(Char) <= 57 Then
LinearEntry = Asc(Char) + 4
ElseIf Char = ” ” Then
LinearEntry = 63
ElseIf Char = “.” Then
LinearEntry = 62
ElseIf Char = “;” Then
LinearEntry = 66
ElseIf Char = “/” Then
LinearEntry = 64
ElseIf Char = “,” Then
LinearEntry = 65
End If


بعد از مقداردهی LinearEntry بایستی مختصات grid کاراکتر را پردازش کنیم :


If LinearEntry <= 15 Then
CharY = 0
CharX = LinearEntry
End If
If LinearEntry >= 16 And LinearEntry <= 31 Then
CharY = 1
CharX = LinearEntry – 16
End If
If LinearEntry >= 32 And LinearEntry <= 47 Then
CharY = 2
CharX = LinearEntry – 32
End If
If LinearEntry >= 48 And LinearEntry <= 63 Then
CharY = 3
CharX = LinearEntry – 48
End If
If LinearEntry >= 64 And LinearEntry <= 79 Then
CharY = 4
CharX = LinearEntry – 64
End If


۲ – حال بایستی vertex های مورد نیاز برای رسم کاراکتر را تولید کنیم :


vertChar(0) = CreateTLVertex(startX + (Width * I), StartY, 0, 1, &HFFFFF
(F,0,(1/16)*CharX,(1/8)*CharY
vertChar(1) = CreateTLVertex(startX + (Width * I) + Width, StartY, 0, 1, &HFFFFF
(F, 0,((1 / 16) * CharX) + (1 / 16), (1 / icon cool آموزش DirectX Graphic در ويژوال بيسيک قسمت هشتم * CharY
vertChar(2) = CreateTLVertex(startX + (Width * I), StartY + Height, 0, 1, &HFFFFF
((F, 0, (1 / 16) * CharX, ((1 / icon cool آموزش DirectX Graphic در ويژوال بيسيک قسمت هشتم * CharY) + (1 / 8
vertChar(3) = CreateTLVertex(startX + (Width * I) + Width, StartY + Height, 0, 1, HFFFFFF, 0, ((1 / 16) * CharX) + (1 / 16), ((1 / icon cool آموزش DirectX Graphic در ويژوال بيسيک قسمت هشتم * CharY) + (1 / 8))x


۳ – رندر vertex ها :


D3DDevice.SetTexture 0, fntTex
D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, vertChar(0), Len(vertChar(0))x
Next I
End Sub

آموزش DirectX-Graphic در ویژوال بیسیک قسمت هفتم

دی ۳م, ۱۳۸۷