سؤال

حسنا، في شذاف جزء GLSL الخاص بي، أريد أن أكون قادرا على حساب مسافة الجزء من خط معين في الفضاء.

نتيجة هذا هو أنني أحاول أولا استخدام مجموعة VEC2 متفاوتة في Shader My Vertex لتعبير ما ينتهي gl_FragCoord:

varying vec2 fake_frag_coord;
//in vertex shader:
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
fake_frag_coord=(gl_ModelViewProjectionMatrix * gl_Vertex).xy;

الآن في شظي جزء أتوقع:

gl_FragCoord.xy==fake_frag_coord

لكنها لا. ما العملية التي يقوم بها خط الأنابيب gl_Position لتحويلها إلى gl_FragCoord أنني أنا إهمال القيام به fake_frag_coord?

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

المحلول

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

نصائح أخرى

المشكلة التي لديك هي أن gl_modelviewprojectmatrix * gl_vertex المحسوبة في ظل ليست دائما ما غلة خط أنابيب الوظيفة الثابتة. للحصول على نتائج متطابقة، قم بعمل Fake_Frag_Coord = FTRANSFORM ().

يحرر:

ثم قم بتقياسه بأبعاد الشاشة الخاصة بك.

أتمنى لو كان لدي المزيد من مندوب حتى أتمكن من nitpick أيضا. إليك ما أعرفه. ينفذ OpenGL Divide-by-W تلقائيا لك، لذلك في الوقت المناسب يصل الموضع في شظي شظية، إنه بالفعل في إحداثيات NDC، وبعد ذلك سيكون W ثم 1.0، والوقت الوحيد الذي تحتاجه للتقسيم بواسطة W هو إذا كنت تريد أن تفعل نفس الرياضيات على جانب وحدة المعالجة المركزية، والحصول على نفس النتائج، أو، إذا كنت من أجل بعض السبب الغريب، أراد الحصول على إحداثيات NDC ضمن Shadex Shader.

varying vec2 fake_frag_coord;
//in vertex shader:

fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top