به نام خدا
از اونجایی که هیچ وقت زیر وعده نمیزنم ، طبق اون وعده ای که داده بودم ، خبر نو از راه رسید . در این سریال
ما به آموزش OpenTK برای ایجاد شبیه سازی و بازی های سه بعدی و دو بعدی با سی شارپ خواهیم پرداخت.
این وبلاگ افتخار این را دارد که اولین وبلاگیست که این آموزش را به شما کاربران محترم ارائه میکند.
---
مقدمه :
کتابخانه OpenGL برای ++C کاربرد خیلی زیادی برای کارهای گرافیکی دارد.وقتی سی شارپ خلق شد ،
یک سری کتابخانه مثلا Managed DirectX برای کارهای سنگین گرافیکی با سی شارپ تعبیه شدند.
مایکروسافت بنا بر دلایل فنی تصمیم به حذف Managed DirectX گرفت.خوب از آنجایی که کاربران دستشان
تو حنا مانده بود ، فرصت خوبی برای گروه ها و شرکت های کوچک بود که یک کتابخانه گرافیکی برای سی
شارپ بنویسند. پس Slim DX برای سی شارپ بوجود آمد و کاربرانی را پذیرایی کرد.
اما بحث وقتی جالب شد که مایکروسافت رسما به دلیل ذات کامپایلر سی شارپ ، گفت از دایرکت ایکس
استفاده نکنید.
خوب یک کتابخانه مانند Tao بکار آمد که اوصول گرافیکی را برای سی شارپ محقق کرد.حال ما با OpenTK
که بر اساس Tao است کار میکنیم که OpenTk همان OpenGL است اما برای سی شارپ.
دانلود Open TK
برای دانلود OpenTK روی دکمه زیر کلیک نمایید. چنانچه لینک خراب بود ، اینجا را کلیک کنید.

وقتی فایل را دانلود کردید ، یک پروژه Console Application با سی شارپ بسازید و فایل OpenTK.dll
را از مسیر Binaries/OpenTK/Release به پروژه Add Reference کنید.
از آنجایی که این کتابخانه به System.Drawing نیاز دارد ، System.Drawing را نیز Add Reference کنید.

عکس فوق ، عکس یک برنامه ای است که من با Open TK نوشته ام. در آخر سورس کدش را برای دانلود
قرار داده ام یا می توانید آن را از اینجا دانلود کنید.
کلاس اصلی برنامه که در آن تابع Main است باید و باید از کلاس GameWindow به ارث ببرد.
public MyGame():base(200,200,GraphicsMode.Default,"SAP")
{
}کد فوق مربوط به Constructor کلاس است که یک پنجره به ابعاد 200 در 200 با نام SAP می سازد.
حال در کد زیر ، ما چارچوب مختصات سه بعدی خود را تعیین میکنیم.(این کد ها فقط یکبار در آغاز برنامه اجرا
میشوند .)
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
GL.Ortho(-2, 2, -2, 2, -2, 2);
}خوب تابع Ortho مانند OpenGL است که به ترتیب x- و x+ و y- و y+ و z- و z+ را مقدار دهی میکند.
حال ما میخواهیم مثلث را رسم کنیم . اما قبل رسم باید صفحه Clear شود و نقاشیمان را روی آن انجام دهیم.
درست مثل اینکه وقتی شما قصد نقاشی را دارید ، چه میکنید ، از یک برگه سفید استفاده میکند. پس
ما در چند خط زیر می گوییم که می خواهیم از یک برگه سیاه استفاده کنیم :
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
GL.ClearColor(System.Drawing.Color.Black);
GL.Clear(ClearBufferMask.ColorBufferBit);خوب این کار ها را ما در تابع RenderFrame انجام میدهیم ، این تابع در هر سیکل CPU چندین بار اجرا
میشود تا ما مثلث را ساکن ببینیم.
ما چند نوع کاغذ داریم ؟ (معمولی ، کانسون ، پاستیلی ، شفاف ، ...) خوب چرا تابع Clear چند نوع Clear
نداشته باشد. ما با انتخاب گزینه ColorBufferBit توانسته ایم کاغذ معمولی را برگزییم.
GL.Begin(BeginMode.Polygon);
GL.Color3(Color.Red);
GL.Vertex3(-1.0f,0.0f,0.0f);
GL.Color3(Color.Blue);
GL.Vertex3(0.0f, 1.0f, 0.0f);
GL.Color3(Color.Green);
GL.Vertex3(1.0f, 0.0f, 0.0f);
GL.End();
SwapBuffers();
}
خوب در کد های بالا ما نقاشی را شروع کردیم...
با توابع GL.Vertex3 ما مختصات نقاط را و با توابع GL.Color3 ما رنگ هر راس را تعیین کردیم.
وقتی نقاشی را تمام کردیم ، با SwapBuffers ما Back Buffer را با Primary Buffer عوض میکنیم تا نتیجه
دیده شود.
پایان آموزش اول
دانلود سورس کد + فایل اجرایی