السلام عليكم
هل يعرف احدكم فكرة Backface culling
المكتبة: DirectX (Direct3D)
ومشكورين مقدما
:)
السلام عليكم
هل يعرف احدكم فكرة Backface culling
المكتبة: DirectX (Direct3D)
ومشكورين مقدما
:)
شكرا لك و لدي سؤال:
ماذا سيحدث اذا اردت استخدام D3D لرسم 2D لنقل شكل مثلث فهل ستئثر طريقة رسم النقاط على ظهور او اختفاء المثلث
لا يا اخي ; لانك ستسخدم منظور اخر يُسمي بالاسقاط العمودي Orthogonal Projection علي عكس استخدام الاسقاط المنظوري Perspective و الذي فيه تحدث عمليه الحذف الجزء الخلفي الغير منظور لعينك و هي عملية جيدة لتسريع المحرك - لماذا نرسم مضلعات لن نراها ؟
BEng , Electronics and communications.
Embedded systems engineer.
Graphics Programmer
عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح
عملت برنامج بال C# لكي ارسم مثلث وهذا الكود:
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace Whale
{
public class WhaleForm : System.Windows.Forms.Form
{
private Device device;
public WhaleForm()
{
this.Text = "My Whale Form";
this.Size = new System.Drawing.Size(500, 500);
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
}
public void InitializeDevice()
{
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed = true;
presentParams.SwapEffect = SwapEffect.Discard;
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
CustomVertex.TransformedColored[] vertices = new CustomVertex.TransformedColored[3];
vertices[0].Position = new Vector4(150f, 100f, 0f, 1f);
vertices[0].Color = Color.Red.ToArgb();
vertices[1].Position = new Vector4(this.Width/2+100f, 100f, 0f, 1f);
vertices[1].Color = Color.Green.ToArgb();
vertices[2].Position = new Vector4(250f, 300f, 0f, 1f);
vertices[2].Color = Color.Yellow.ToArgb();
device.Clear(ClearFlags.Target, Color.DarkSlateBlue , 1.0f, 0);
device.BeginScene();
device.VertexFormat = CustomVertex.TransformedColored.Format;
device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertices);
device.EndScene();
device.Present();
this.Invalidate();
}
static void Main()
{
using (WhaleForm frmWhale = new WhaleForm())
{
frmWhale.InitializeDevice();
Application.Run(frmWhale);
}
}
}
}في الكود اعلاه يتم رسم المثلت مع عقارب الساعة و بالفعل ظهر المثلث
احداثيات المثلث:
vertices[0].Position = new Vector4(150f, 100f, 0f, 1f); vertices[0].Color = Color.Red.ToArgb(); vertices[1].Position = new Vector4(this.Width/2+100f, 100f, 0f, 1f); vertices[1].Color = Color.Green.ToArgb(); vertices[2].Position = new Vector4(250f, 300f, 0f, 1f); vertices[2].Color = Color.Yellow.ToArgb();
ولكن عندما عكست طريقة رسم المثلث لكي تكن عكس عقارب الساعة (وذلك بتحويل index من 0 الي 2 و تحويل 2 الي 0) لم يظهر المثلث
الاحداثيات الجديدة:
vertices[2].Position = new Vector4(150f, 100f, 0f, 1f); vertices[2].Color = Color.Red.ToArgb(); vertices[1].Position = new Vector4(this.Width/2+100f, 100f, 0f, 1f); vertices[1].Color = Color.Green.ToArgb(); vertices[0].Position = new Vector4(250f, 300f, 0f, 1f); vertices[0].Color = Color.Yellow.ToArgb();
فأذا كان الحل في استخدام بالاسقاط العمودي Orthogonal Projection و ليس استخدام الاسقاط المنظوري Perspective فكيف يمكن عمل ذلك.
تحياتي
:)
الدايركت اكس افتراضياً بيحذف الاسطح الخلفيه ، و يقوم برسم النقط في اتجاه عقارب الساعة .
إن كنت تريد التغيير يجب استدعاء هذه الدالة ::
d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
في عكس اتجاه عقرب الساعة استخدم الثابت D3DCULL_CCW
او رقم 3 .
بالنسبة للاسقاط ، انا اقصد انك تريد ان تعمل في بعدين فقط يجب استخدام اسقاط عمودي و ليس منظوري .
BEng , Electronics and communications.
Embedded systems engineer.
Graphics Programmer
عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح
شكرا جزيلا لك أحمد
الامور اصبحت واضحة الان :D
المهم وضعت الكود التالي لألغاء backface culling و بهذا استطيع ان ارسم 2D عن طريق Direct3D و بدون الاكتراث اذا كان الرسم مع او عكس عقارب الساعة و بالفعل ظهر المثلث
device.RenderState.CullMode = Cull.None;
تحياتي
:)
هذا الموضوع مغلق.