آموزشDirectX-Graphic (قسمت 8،9،10)
موضوع : نورپردازي و اختصاص بافت به اشيا سه بعدي
در اين درس مي خواهيم به مکعب درس قبل بافت اختصاص داده و نيز آنرا با يک منبع نور ، نورپردازي کنيم .
ابتدا تايپ vertex ها را بصورت زير تعريف مي کنيم :
Private Type UnlitVertex
X As
Single
Y As Single
Z As Single
nx As Single
ny As Single
nz As
Single
tu As Single
tv As Single
End Type
توصيفگر اين فرمت بصورت زير خواهد
بود :
Const Unlit_FVF = (D3DFVF_XYZ Or
D3DFVF_NORMAL Or D3DFVF_TEX1)
همچنين مکعب ما توسط ارايه زير مشخص
مي شود :
Dim Cube2(35) As
UnlitVertex
دو ثابت pi و rad را نيز بصورت زير
تعريف مي کنيم :
Const pi As Single =
3.141592
Const Rad = pi / 180
براي اختصاص بافت به مکعب ، از شي
Direct3DTexture8 استفاده مي شود :
Dim CubeTexture As
Direct3DTexture8
براي نورپردازي ، از شي D3DLIGHT8
استفاده مي شود :
Dim Lights As D3DLIGHT8
تغييرات مورد نياز در تابع
Initialize
بعد از ساخت شي D3DDevice در اين تابع ، پارامترهاي آنرا بصورت زير
تنظيم مي کنيم :
D3DDevice.SetVertexShader
Unlit_FVF
D3DDevice.SetRenderState D3DRS_LIGHTING,
1
D3DDevice.SetRenderState D3DRS_ZENABLE, 1
D3DDevice.SetRenderState
D3DRS_AMBIENT, &H202020
مقدار ambient يک کد هگزا RRGGBB
است .
بعد از دستورات فوق ماتريسهاي matworld ، matview و matproj مطابق مطابل
درس قبل تعريف مي شوند . پس از آن بايستي بافت مکعب را از درون فايل تصويري مورد
نظرتان load کنيد :
Set CubeTexture =
D3DX.CreateTextureFromFileEx(D3DDevice, yourfilename, 128, 128, D3DX_DEFAULT, 0,
DispMode.Format, D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0,
ByVal 0, ByVal 0)x
حال بايستي تابع InitializeGeometry
صدا زده شود و سپس تابع SetupLights فراخواني شوند . ابتدا به توضيح تابع
InitializeGeometry مي پردازيم :
Private Function
InitialiseGeometry() As Boolean
ابتدا يک بردار نرمال تعريف مي کنيم
:
Dim vN As D3DVECTOR
سپس آرايه cube2 را با مقادير عددي
پر مي کنيم . نرمالهاي تمام vertex ها را ابتدا با بردار
[0,0,0 ] تعريف مي
کنيم . اين مقدا بعداً تغيير خواهد کرد :
Cube2(0) = CreateVertex(-1, -1, 1,
0, 0, 0, 0, 0)
Cube2(1) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
Cube2(2) =
CreateVertex(-1, 1, 1, 0, 0, 0, 0, 1)
vN = GenerateTriangleNormals(Cube2(0),
Cube2(1), Cube2(2))
Cube2(0).nx = vN.X: Cube2(0).ny = vN.Y: Cube2(0).nz =
vN.Z
Cube2(1).nx = vN.X: Cube2(1).ny = vN.Y: Cube2(1).nz =
vN.Z
Cube2(2).nx = vN.X: Cube2(2).ny = vN.Y: Cube2(2).nz =
vN.Z
Cube2(3) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
Cube2(4) =
CreateVertex(-1, -1, 1, 0, 0, 0, 0, 0)
Cube2(5) = CreateVertex(1, -1, 1, 0,
0, 0, 1, 0)
vN = GenerateTriangleNormals(Cube2(3), Cube2(4),
Cube2(5))
Cube2(3).nx = vN.X: Cube2(3).ny = vN.Y: Cube2(3).nz =
vN.Z
Cube2(4).nx = vN.X: Cube2(4).ny = vN.Y: Cube2(4).nz =
vN.Z
Cube2(5).nx = vN.X: Cube2(5).ny = vN.Y: Cube2(5).nz =
vN.Z
'Back
Cube2(6) = CreateVertex(-1, 1, -1, 0, 0, 0, 0,
1)
Cube2(7) = CreateVertex(1, 1, -1, 0, 0, 0, 1, 1)
Cube2(8) =
CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
vN =
GenerateTriangleNormals(Cube2(6), Cube2(7), Cube2(8))
Cube2(6).nx = vN.X:
Cube2(6).ny = vN.Y: Cube2(6).nz = vN.Z
Cube2(7).nx = vN.X: Cube2(7).ny =
vN.Y: Cube2(7).nz = vN.Z
Cube2(8).nx = vN.X: Cube2(8).ny = vN.Y: Cube2(8).nz
= vN.Z
Cube2(9) = CreateVertex(1, -1, -1, 0, 0, 0, 1, 0)
Cube2(10) =
CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
Cube2(11) = CreateVertex(1, 1, -1, 0,
0, 0, 1, 1)
vN = GenerateTriangleNormals(Cube2(9), Cube2(10),
Cube2(11))
Cube2(9).nx = vN.X: Cube2(9).ny = vN.Y: Cube2(9).nz =
vN.Z
Cube2(10).nx = vN.X: Cube2(10).ny = vN.Y: Cube2(10).nz =
vN.Z
Cube2(11).nx = vN.X: Cube2(11).ny = vN.Y: Cube2(11).nz =
vN.Z
'Right
Cube2(12) = CreateVertex(-1, -1, -1, 0, 0, 0, 0,
0)
Cube2(13) = CreateVertex(-1, 1, 1, 0, 0, 0, 1, 1)
Cube2(14) =
CreateVertex(-1, 1, -1, 0, 0, 0, 1, 0)
vN =
GenerateTriangleNormals(Cube2(12), Cube2(13), Cube2(14))
Cube2(12).nx = vN.X:
Cube2(12).ny = vN.Y: Cube2(12).nz = vN.Z
Cube2(13).nx = vN.X: Cube2(13).ny =
vN.Y: Cube2(13).nz = vN.Z
Cube2(14).nx = vN.X: Cube2(14).ny = vN.Y:
Cube2(14).nz = vN.Z
Cube2(15) = CreateVertex(-1, 1, 1, 0, 0, 0, 1,
1)
Cube2(16) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
Cube2(17) =
CreateVertex(-1, -1, 1, 0, 0, 0, 0, 1)
vN =
GenerateTriangleNormals(Cube2(15), Cube2(16), Cube2(17))
Cube2(15).nx = vN.X:
Cube2(15).ny = vN.Y: Cube2(15).nz = vN.Z
Cube2(16).nx = vN.X: Cube2(16).ny =
vN.Y: Cube2(16).nz = vN.Z
Cube2(17).nx = vN.X: Cube2(17).ny = vN.Y:
Cube2(17).nz = vN.Z
'Left
Cube2(18) = CreateVertex(1, 1, -1, 0, 0, 0,
1, 0)
Cube2(19) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
Cube2(20) =
CreateVertex(1, -1, -1, 0, 0, 0, 0, 0)
vN =
GenerateTriangleNormals(Cube2(18), Cube2(19), Cube2(20))
Cube2(18).nx = vN.X:
Cube2(18).ny = vN.Y: Cube2(18).nz = vN.Z
Cube2(19).nx = vN.X: Cube2(19).ny =
vN.Y: Cube2(19).nz = vN.Z
Cube2(20).nx = vN.X: Cube2(20).ny = vN.Y:
Cube2(20).nz = vN.Z
Cube2(21) = CreateVertex(1, -1, 1, 0, 0, 0, 0,
1)
Cube2(22) = CreateVertex(1, -1, -1, 0, 0, 0, 0, 0)
Cube2(23) =
CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
vN = GenerateTriangleNormals(Cube2(21),
Cube2(22), Cube2(23))
Cube2(21).nx = vN.X: Cube2(21).ny = vN.Y: Cube2(21).nz
= vN.Z
Cube2(22).nx = vN.X: Cube2(22).ny = vN.Y: Cube2(22).nz =
vN.Z
Cube2(23).nx = vN.X: Cube2(23).ny = vN.Y: Cube2(23).nz =
vN.Z
'Top
Cube2(24) = CreateVertex(-1, 1, 1, 0, 0, 0, 0,
1)
Cube2(25) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
Cube2(26) =
CreateVertex(-1, 1, -1, 0, 0, 0, 0, 0)
vN =
GenerateTriangleNormals(Cube2(24), Cube2(25), Cube2(26))
Cube2(24).nx = vN.X:
Cube2(24).ny = vN.Y: Cube2(24).nz = vN.Z
Cube2(25).nx = vN.X: Cube2(25).ny =
vN.Y: Cube2(25).nz = vN.Z
Cube2(26).nx = vN.X: Cube2(26).ny = vN.Y:
Cube2(26).nz = vN.Z
Cube2(27) = CreateVertex(1, 1, -1, 0, 0, 0, 1,
0)
Cube2(28) = CreateVertex(-1, 1, -1, 0, 0, 0, 0, 0)
Cube2(29) =
CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
vN = GenerateTriangleNormals(Cube2(27),
Cube2(28), Cube2(29))
Cube2(27).nx = vN.X: Cube2(27).ny = vN.Y: Cube2(27).nz
= vN.Z
Cube2(28).nx = vN.X: Cube2(28).ny = vN.Y: Cube2(28).nz =
vN.Z
Cube2(29).nx = vN.X: Cube2(29).ny = vN.Y: Cube2(29).nz =
vN.Z
'Top
Cube2(30) = CreateVertex(-1, -1, -1, 0, 0, 0, 0,
0)
Cube2(31) = CreateVertex(1, -1, 1, 0, 0, 0, 1, 1)
Cube2(32) =
CreateVertex(-1, -1, 1, 0, 0, 0, 0, 1)
vN =
GenerateTriangleNormals(Cube2(30), Cube2(31), Cube2(32))
Cube2(30).nx = vN.X:
Cube2(30).ny = vN.Y: Cube2(30).nz = vN.Z
Cube2(31).nx = vN.X: Cube2(31).ny =
vN.Y: Cube2(31).nz = vN.Z
Cube2(32).nx = vN.X: Cube2(32).ny = vN.Y:
Cube2(32).nz = vN.Z
Cube2(33) = CreateVertex(1, -1, 1, 0, 0, 0, 1,
1)
Cube2(34) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
Cube2(35) =
CreateVertex(1, -1, -1, 0, 0, 0, 1, 0)
vN =
GenerateTriangleNormals(Cube2(33), Cube2(34), Cube2(35))
Cube2(33).nx = vN.X:
Cube2(33).ny = vN.Y: Cube2(33).nz = vN.Z
Cube2(34).nx = vN.X: Cube2(34).ny =
vN.Y: Cube2(34).nz = vN.Z
Cube2(35).nx = vN.X: Cube2(35).ny = vN.Y:
Cube2(35).nz = vN.Z
سپس يک بافر vertex خالي با ساير
موردنظر مي سازيم :
Set VBuffer =
D3DDevice.CreateVertexBuffer(Len(Cube2(0)) * 36, 0, Unlit_FVF,
D3DPOOL_DEFAULT)x
سپس اين بافر vertex ساخته شده را
با داده هاي cube2 پر مي کنيم :
D3DVertexBuffer8SetData VBuffer, 0,
Len(Cube2(0)) * 36, 0, Cube2(0)x
در دستورات فوق تابعي با نام
GenerateTraingleNormals استفاده شده است . اين تابع دو بردار را از روي سه vertex
داده شده با آن مي سازد و سپس ضرب برداري ايندو را حساب مي کند و سپس بردار حاصله
را نرمال مي نمايد :
Private Function
GenerateTriangleNormals(p0 As UnlitVertex, p1 As UnlitVertex, p2 As UnlitVertex)
As D3DVECTOR
Dim v01 As D3DVECTOR 'Vector from points 0 to 1
Dim v02 As
D3DVECTOR 'Vector from points 0 to 2
Dim vNorm As D3DVECTOR 'The final
vector
'Create the vectors from points 0 to 1 and 0 to
2
D3DXVec3Subtract v01, MakeVector(p1.X, p1.Y, p1.Z), MakeVector(p0.X, p0.Y,
p0.Z)
D3DXVec3Subtract v02, MakeVector(p2.X, p2.Y, p2.Z), MakeVector(p0.X,
p0.Y, p0.Z)
'Get the cross product
D3DXVec3Cross vNorm, v01,
v02
'Normalize this vector
D3DXVec3Normalize vNorm,
vNorm
'Return the value
GenerateTriangleNormals.X =
vNorm.X
GenerateTriangleNormals.Y = vNorm.Y
GenerateTriangleNormals.Z =
vNorm.Z
End Function
حال به توضيح تابع SetupLights
مي پردازيم . در اين تابع دو شي D3DMATERIAL8 و D3DCOLORVALUE استفاده شده است
:
Private Function SetupLights() As
Boolean
Dim Mtrl As D3DMATERIAL8, Col As D3DCOLORVALUE
Col.a = 1: Col.r =
1: Col.g = 1: Col.b = 1
Mtrl.Ambient = Col
Mtrl.diffuse =
Col
D3DDevice.SetMaterial Mtrl
Lights.Type =
D3DLIGHT_DIRECTIONAL
Lights.diffuse.r = 1
Lights.diffuse.g =
1
Lights.diffuse.b = 1
Lights.Direction = MakeVector(1, -1,
0)
D3DDevice.SetLight 0, Lights
SetupLights = True
End
Function
تابع Render بصورت زير است
:
Public Sub
Render()
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0,
1#, 0 '//Clear the screen black
D3DDevice.BeginScene
'Draw the
cube
D3DDevice.SetTexture 0, CubeTexture
D3DDevice.SetStreamSource 0,
VBuffer, Len(Cube2(0))
D3DDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0,
12
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal
0
End Sub
ساختار اصلي برنامه بصورت زير
است :
Call Initialise
Do While
bRunning
RotateAngle = RotateAngle + 0.1
If RotateAngle >= 360 Then
RotateAngle = RotateAngle - 360
D3DXMatrixIdentity
matWorld
D3DXMatrixIdentity matTemp
D3DXMatrixRotationX matTemp,
RotateAngle * (pi / 180)
D3DXMatrixMultiply matWorld, matWorld,
matTemp
D3DXMatrixIdentity matTemp
D3DXMatrixRotationY matTemp,
RotateAngle * (pi / 180)
D3DXMatrixMultiply matWorld, matWorld,
matTemp
D3DXMatrixIdentity matTemp
D3DXMatrixRotationZ matTemp,
RotateAngle * (pi / 180)
D3DXMatrixMultiply matWorld, matWorld,
matTemp
D3DDevice.SetTransform D3DTS_WORLD,
matWorld
D3DDevice.LightEnable 0, 0 خاموش کردن
light
D3DDevice.LightEnable 0, 1 روشن کردن
light
Render
DoEvents
Loop
در متد D3DDevice.LightEnable
پارامتر اول شماره منبع نور و پارمتر دوم enable بودن آنرا نشان مي دهد
.
___________________
قسمت نهم:
در اين درس روش ترسيم متن با دو نوع فونت را نشان خواهم داد :
براي رسم يک متن با فونت تعريف شده در سيستم از شي 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 / 8) * CharY
vertChar(2) = CreateTLVertex(startX + (Width * I),
StartY + Height, 0, 1, &HFFFFF
((F, 0, (1 / 16) * CharX, ((1 / 8) *
CharY) + (1 / 8
vertChar(3) = CreateTLVertex(startX + (Width * I) + Width,
StartY + Height, 0, 1, HFFFFFF, 0, ((1 / 16) * CharX) + (1 / 16), ((1 / 8) *
CharY) + (1 / 8))x
۳ - رندر vertex ها :
D3DDevice.SetTexture 0,
fntTex
D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, vertChar(0),
Len(vertChar(0))x
Next I
End Sub
____________________________
قسمت دهم(آخر):
شي 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 و بردار جهت (1-,1-,1-) است .
نکته :
رنگ 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
اینم از این
امیدوارم من و با نظرهاتون راهنمایی کنید.
در این وبلاگ سعی شده مطالب مفیدی در زمینه ی عنوان وبلاگ گردآوری بشه،تمامی این مطالب در یادگیری بنده تاثیر بسزایی داشته.