|
آموزشDirectX-Graphic قسمت هشتم
|
|
۸-۸-۱۳۸۶, ۱۲:۵۹ صبح
ارسال: #1
|
|||
|
|||
|
آموزشDirectX-Graphic قسمت هشتم
موضوع : نورپردازي و اختصاص بافت به اشيا سه بعدي
در اين درس مي خواهيم به مکعب درس قبل بافت اختصاص داده و نيز آنرا با يک منبع نور ، نورپردازي کنيم . ابتدا تايپ 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 بودن آنرا نشان مي دهد |
|||
کاربرانِ درحال بازدید از این موضوع: 3 مهمان
Persian MyBB : MyBBIran.com
Powered by MyBB | Copyright © 2009 MyBB Group
Element Blue by MyBB Mod | RTL by MyBBIran.com
Powered by MyBB | Copyright © 2009 MyBB Group
Element Blue by MyBB Mod | RTL by MyBBIran.com





