قمة تظليل العالم تحول، لماذا لا نستخدم 4 ناقلات الأبعاد؟

StackOverflow https://stackoverflow.com/questions/1605703

  •  05-07-2019
  •  | 
  •  

سؤال

ومن هذا الموقع: http://www.toymaker.info/Games/html /vertex_shaders.html

لدينا التعليمات البرمجية المتكررة التالية:

// transformations provided by the app, constant Uniform data
float4x4 matWorldViewProj: WORLDVIEWPROJECTION;

// the format of our vertex data
struct VS_OUTPUT
{
  float4 Pos  : POSITION;
};

// Simple Vertex Shader - carry out transformation
VS_OUTPUT VS(float4 Pos  : POSITION)
{
  VS_OUTPUT Out = (VS_OUTPUT)0;
  Out.Pos = mul(Pos,matWorldViewProj);
  return Out;
}

وسؤالي هو: لماذا لVS_OUTPUT البنية ديك ناقلات الأبعاد 4 كما موقفها؟ لا تضع فقط س، ص و z؟

هل كانت مفيدة؟

المحلول

ولأن كنت في حاجة إلى ث تنسيق لحساب المنظور. بعد الإخراج من تظليل قمة الرأس من دايركت ينفذ الفجوة منظور بقسمة التي كتبها w.

وأساسا إذا كان لديك 32768، -32768، 32768، 65536 كما موقف قمة الإخراج الخاص بك ثم بعد الانقسام ث تحصل 0.5، -0.5، 0.5، 1. عند هذه النقطة يمكن تجاهل ث كما لم يعد هناك حاجة إليها. ثم يتم تمرير هذه المعلومات من خلال مصفوفة العرض الذي تحول إلى صالحة للاستعمال تنسق 2D.

وتحرير: إذا نظرتم كيف يتم تنفيذ عملية الضرب مصفوفة باستخدام مصفوفة الإسقاط يمكنك أن ترى كيف القيم الحصول على وضعها في الأماكن الصحيحة

وأخذ مصفوفة الإسقاط المحددة في D3DXMatrixPerspectiveLH

2*zn/w  0       0              0
0       2*zn/h  0              0
0       0       zf/(zf-zn)     1
0       0       zn*zf/(zn-zf)  0

وتطبيقه على س عشوائي، ص، ض، 1 (ملاحظة للحصول على موقف قمة ث ستكون دائما 1) قيمة ذروة مدخلات تحصل على التالي

x' = ((2*zn/w) * x) + (0 * y) + (0 * z) + (0 * w)
y' = (0 * x) + ((2*zn/h) * y) + (0 * z) + (0 * w)
z' = (0 * x) + (0 * y) + ((zf/(zf-zn)) * z) + ((zn*zf/(zn-zf)) * w)
w' = (0 * x) + (0 * y) + (1 * z) + (0 * w)

وعلى الفور يمكنك أن ترى أن ث و z مختلفة. وCOORD ث الآن يحتوي فقط ض الإحداثي تمريرها إلى مصفوفة الإسقاط. ض يحتوي على شيء أكثر تعقيدا بكثير.

وهكذا .. نفترض لدينا موقف مدخلات (2، 1، 5، 1) لدينا الزنك (Z-الأدنى) من 1 وZF (Z-الأقصى من 10)، وفصيل عبد الواحد (العرض) من 1 وآه (الارتفاع) 1.

واجتياز هذه القيم من خلال نحصل

x' = (((2 * 1)/1) * 2
y' = (((2 * 1)/1) * 1
z' = ((10/(10-1)  * 5 + ((10 * 1/(1-10)) * 1)
w' = 5

وتوسيع أننا ثم الحصول على

x' = 4
y' = 2
z' = 4.4
w' = 5

ونحن ثم نفذ الفجوة منظور النهائي ونحصل

x'' = 0.8
y'' = 0.4
z'' = 0.88
w'' = 1

والآن لدينا تنسيق الموقف النهائي. وهذا يفترض أن x ونطاقات ص من -1 إلى 1 و z يتراوح من 0 إلى 1. كما ترون قمة الرأس هي على الشاشة.

وعلى سبيل المكافأة غريبة يمكنك أن ترى أنه إذا | س '| أو | ذ '| أو | ض '| أكبر من | ث "| أو ض 'هو أقل من 0 إلى أن قمة الرأس هي خارج الشاشة. يتم استخدام هذه المعلومات لقطة المثلث إلى الشاشة.

وعلى أي حال أنا أفكر أن يكون جوابا مفصلا جدا: D

وEdit2: حذر من أن يكون أنا باستخدام ROW المصفوفات الرئيسية. ونقلها العمود المصفوفات الرئيسية.

نصائح أخرى

ويتم تحديد دوران من مصفوفة الأبعاد 3 والترجمة عن طريق النواقل. يمكنك تنفيذ كل التحويلات في عملية "واحدة" من الجمع بينهما في واحدة 4 × 3 مصفوفة:

rx1 rx2 rx3 tx1
ry1 ry2 ry3 ty1
rz1 rz2 rz3 tz1

ولكن لأن هذا ليس مربع هناك العديد من العمليات التي لا يمكن أن يؤديها (قلب واحد). عن طريق إضافة صف إضافي (أن لا يفعل شيئا):

0   0   0   1

وجميع هذه العمليات أصبحت ممكنة (إن لم يكن من السهل).

وكما يوضح جوز في <لأ href = "https://stackoverflow.com/questions/1605703/vertex-shader-world-transform-why-do-we-use-4-dimensional-vectors/1605744#1605744" > جوابه بجعل "1" قيمة غير هوية المصفوفة يصبح التحول المنظور.

لقطة هي جزء مهم من هذه العملية، لأنها تساعد على تصور ما يحدث للهندسة. المرحلة قطة يتجاهل أساسا أي نقطة في البدائية التي هي خارج مكعب 2-وحدة تتمحور حول المنشأ (OK، لديك لإعادة بناء البدائيون أن يتم قص جزئيا ولكن هذا لا يهم هنا).

وسيكون من الممكن لبناء مصفوفة تعيينها مباشرة مساحة العالم الذي تعيشون فيه تنسق إلى مثل مكعب، ولكن الانتقال التدريجي من الطائرة البعيدة إلى الطائرة القريب سيكون الخطية. وهذا يعني أن هذه الخطوة من قدم واحدة (نحو المشاهد) عندما ميل واحد بعيدا عن المشاهد من شأنه أن يسبب نفس الزيادة في حجم باعتبارها خطوة قدم واحدة عند عدة أقدام من الكاميرا.

ولكن، إذا كان لدينا آخر تنسيق في منطقتنا ناقلات (ث)، يمكننا تقسيم ناقلات مكون من الحكمة التي كتبها w، وسوف الأوليات لدينا لا يحمل سلوك أعلاه، ولكن لا يزال بوسعنا أن جعلها في نهاية المطاف داخل 2 مكعب -unit أعلاه.

لمزيد من الإيضاحات نرى http://www.opengl.org /resources/faq/technical/depthbuffer.htm#0060 و HTTP: // EN .wikipedia.org / ويكي / Transformation_matrix # Perspective_projection .

والجواب بسيط يتمثل في القول أنه إذا لم يكن ليقول ما خط أنابيب ث هو ثم قمت لم تعطها ما يكفي من المعلومات حول العرض الخاص بك. يمكن التحقق من هذا مباشرة دون فهم ما يقوم به خط أنابيب معها ...

وكما تعلمون مصفوفة 4X4 ويمكن تقسيمها إلى أجزاء بناء على ما يفعل كل جزء. يتم تبديل مصفوفة 3X3 في الجزء العلوي الأيسر عند القيام بعمليات التناوب أو الحجم. يتم تبديل العمود الرابع عند القيام الترجمة. إذا كنت من أي وقت مضى تفقد مصفوفة المنظور، فإنه يغير الصف السفلي من المصفوفة. إذا كنت بعد ذلك ننظر في كيف يتم الضرب مصفوفة المتجهات، ترى أن الصف السفلي من مصفوفة يؤثر فقط الناتجة ث مكون من النواقل. حتى إذا كنت لا تقول خط الأنابيب حول ث أنه لن يكون لها جميع المعلومات الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top