PDA

View Full Version : DirectX با دلفی:قسمت دوم



shaniaki
یک شنبه 15 تیر 1382, 16:20 عصر
باعرض ادب:
احتمالا کسانی که علاقه مند بوده اند با مراجعی که معرفی کرده بودم تا به حال قسمت های زیادی از DirectX را با دلفی تجربه کرده اند. به هر حال طبق قرار ما Tutorial ها را معرفی می کنیم. مرتبه قبلی اولینTutorial را که فقط یک Device می ساخت معرفی نمودیم این بار Tutorial دوم که به ساخت و رندر اشیا و ساختار ذخیره سازی object ها اختصاص دارد را بررسی می نماییم.
اگر فایل project مربوطه را باز کنید و آن را اجرا نمایید یک مثلث ساده را خواهید دید.
ساختار این برنامه مانند برنامه قبل است و تمام object ها و Interface های نام برده شده از قبل در این پروژه هم موجودند.
object ی که جدید است IDirect3DVertexBuffer9 می باشد که در واقع یک Interface است و در زیر به آن می پردازیم.
ابتدا مفهوم Vertex باید مشخص شود. vertex ها از پایه ای ترین مفاهیم ساختار ذخیره سازی اجسام در برنامه های سه بعدی می باشند. یک Vertex (گره) یک نقطه است. با اتصال دو Vertex یک لبه(خط) واز اتصال چند Vertex (مثلا سه تا) یک سطح به وجود می آید. به عنوان نمونه مثلث ما سه Vertex دارد که از اتصال آن ها به هم یک سطح مثلثی تشکیل می شود.
برای Vertex ها می توان خواص مختلفی مانند نوع رنگ و ... در نظر گرفت که این دست خودمان است یعنی می توان یک Record دلخواه حاوی یک سری خواص معرفی کرد و سپس هنگام رسم به DirectX گفت که Vertex های ما دارای چه خواصی هستند.
در این مثال ما TCustomVertex را به عنوان یک رکورد تعریف کرده ایم که حاوی مختصات تبدیل یافته و رنگ متناظر هر Vertex است. بلافاصله بعد از آن ما نوع vertex را معرفی کرده ایم (D3DFVF_CUSTOMVERTEX) که گفته ایم شامل چه چیز هایی می باشد.
تابع مقدار دهی مهم ما InitVB می باشد. در قسمت const (ثابت های) این تابع همانطور که می بینیم آرایه vertices که عناصر آن از نوع vertex تعریف شده توسط خود ما هستند مقدار دهی می شود به مختصات XYZ و رنگ ARGB هر نقطه دقت کنید(اینجا درست مانند سیستم دلفی است).
دستور زیر vertex buffer را که objectی در بر گیرنده تمام vertex ها و مورد استفاده در رسم vertex ها می باشد ایجاد می کند:

g_pd3dDevice.CreateVertexBuffer(3*SizeOf(TCustomVe rtex),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, g_pVB, nil)
و آن را در g_pVB قرار می دهد. به پارامتر های اول و دوم و چهارم دقت کنید. سپس باید این بافر را پر کنیم برای این کار ابتدا آن را Lock می کنیم(اکنون اشاره گر pVertices به جایی که باید پر شود اشاره می کند)و سپس با دستور CopyMemory آن را با آرایه دست ساز خود پر می کنیم و در نهایت آن را UnLock می کنیم.
نکته اساسی آخر در تابع Render نهفته است. اگر به خاطر داشته باشید در مثال قبل بین BeginScene و EndScene چیزی ننوشتیم و بعد از آن فقط صفحه خالی را Present می کردیم. اما در اینجا می بینیم که عملیات رسم روی صفحه در این قسمت انجام می پذیرد.
ابتدا تابع SetStreamSource منبع اصلی ما که همان Vertex Buffer مان است را برای Direct3DDevice که گفتیم کار اصلی گرافیکی را انجام می دهد معرفی می کند.سپس با SetFVF نوع vertex های به کار رفته را مشخص می کنیم.در نهایت با دستور زیر:

g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );


محتویات Vertex Buffer را به صورت مثلث های جدا از هم رسم می کنیم. این دستور دستور مهمی است(حتما برای آن به SDK Documentation رجوع کنید). می توان با آن انواع مختلفی از اشکال را با یک VertexBuffer ثابت رسم نمود.
سعی کنید با دستکاری Vertex Buffer اشکال دو بعدی مختلفی را رسم کنید(با رنگ های متفاوت). مطالعه تابع DrawPrimitive از SDK فراموش نشود.