الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Backface culling

مغلق
بدأه Whale في 28 مايو 2006 · 6 رد · 1,704 مشاهدة · في DirectX
مشاركة: واتساب X فيسبوك تيليجرام
#2

culling.gif

3D Backface Culling

تم تعديل هذه المشاركة بواسطة DeltaAziz في 28 مايو 2006 في 13:57

d4baa0.gif
#3

شكرا لك و لدي سؤال:

ماذا سيحدث اذا اردت استخدام D3D لرسم 2D لنقل شكل مثلث فهل ستئثر طريقة رسم النقاط على ظهور او اختفاء المثلث

#4

لا يا اخي ; لانك ستسخدم منظور اخر يُسمي بالاسقاط العمودي Orthogonal Projection علي عكس استخدام الاسقاط المنظوري Perspective و الذي فيه تحدث عمليه الحذف الجزء الخلفي الغير منظور لعينك و هي عملية جيدة لتسريع المحرك - لماذا نرسم مضلعات لن نراها ؟

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#5

عملت برنامج بال 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 فكيف يمكن عمل ذلك.

تحياتي

:)

#6

الدايركت اكس افتراضياً بيحذف الاسطح الخلفيه ، و يقوم برسم النقط في اتجاه عقارب الساعة .

إن كنت تريد التغيير يجب استدعاء هذه الدالة ::

d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);

في عكس اتجاه عقرب الساعة استخدم الثابت D3DCULL_CCW

او رقم 3 .

بالنسبة للاسقاط ، انا اقصد انك تريد ان تعمل في بعدين فقط يجب استخدام اسقاط عمودي و ليس منظوري .

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#7

شكرا جزيلا لك أحمد

الامور اصبحت واضحة الان :D

المهم وضعت الكود التالي لألغاء backface culling و بهذا استطيع ان ارسم 2D عن طريق Direct3D و بدون الاكتراث اذا كان الرسم مع او عكس عقارب الساعة و بالفعل ظهر المثلث

device.RenderState.CullMode = Cull.None;

تحياتي

:)

هذا الموضوع مغلق.