
رسم خرائط المنظر
تتشابه تقنية نسيج
Parallax Mapping إلى حد ما في التأثير على
رسم الخرائط العادي ، ولكنها تستند إلى مبدأ مختلف. التشابه هو أنه ، مثل رسم الخرائط العادي ، تزيد هذه التقنية بشكل كبير من التعقيد البصري وتفاصيل السطح مع النسيج المطبق في نفس الوقت مما يخلق وهمًا معقولًا لوجود اختلافات في الارتفاع على السطح. يعمل Parallax Mapping بشكل رائع جنبًا إلى جنب مع Normal Mapping لإنشاء نتائج موثوقة جدًا: تنقل التقنية الموصوفة تأثير الإغاثة بشكل أفضل بكثير من Normal Mapping ، ويكمله Normal Mapping لمحاكاة معقولة للإضاءة الديناميكية. بالكاد يمكن اعتبار رسم خرائط المنظر تقنية تتعلق بشكل مباشر بطرق محاكاة الإضاءة ، ولكن مع ذلك اخترت هذا القسم للنظر فيها ، لأن الطريقة هي تطوير منطقي لأفكار الخرائط العادية. ألاحظ أيضًا أنه من أجل تحليل هذه المقالة ، يلزم فهم جيد لخوارزمية الخرائط العادية ، خاصةً مفهوم الفضاء
المماس أو
الفضاء المماس .
ينتمي Parallax Mapping إلى عائلة
رسم خرائط الإزاحة أو تقنيات التركيب المنقوشة التي
تعوض رؤوس الهندسة بناءً على القيم المخزنة في خرائط النسيج الخاصة. على سبيل المثال ، تخيل طائرة تتكون من ترتيب ألف قمة. يمكن نقل كل منها وفقًا للقيمة المقروءة من النسيج ، والتي تمثل ارتفاع المستوى عند نقطة معينة. يسمى هذا النسيج ، الذي يحتوي على قيم الارتفاع في كل حاوية ،
خريطة الارتفاع . مثال على هذه الخريطة ، التي تم الحصول عليها على أساس الخصائص الهندسية لسطح البناء بالطوب ، هي الصورة التالية:
من خلال أخذ العينات من هذه الخريطة وتحويل كل قمة وفقًا لقيمة الارتفاع ، من الممكن الحصول على سطح محدب من مستوى مثالي يكرر المعلمات الهندسية للسطح الأصلي. لذلك ، مع أخذ طائرة بها عدد كاف من القمم وتطبيق خريطة ارتفاع من المثال ، يمكنك الحصول على النتيجة التالية:
الطريقة الموصوفة بسيطة وسهلة التنفيذ ، ولكنها تتطلب كثافة عالية من القمم في الجسم المعالج ، وإلا ستكون نتيجة التحول خشنة للغاية. وإذا بدأنا في إطلاق ألف رأس أو أكثر على كل سطح مستوٍ ، فلن يكون لدينا وقت قريب لتقديم كل ما نحتاج إليه. ربما هناك خوارزمية تسمح لك بمحاكاة نوعية خوارزمية تخطيط الإزاحة الساذجة نوعيا ، ولكن دون الحاجة إلى مثل هذه التكاليف الهندسية؟ إذا وقفت ، اجلس ، لأنه في الصورة أعلاه لا يوجد سوى ستة رؤوس (مثلثات)! يتم تقليد الإغاثة من الطوب بشكل مثالي بفضل استخدام Parallax Mapping ، وهي تقنية تركيب الإغاثة التي لا تتطلب العديد من القمم لنقل بصدق الإغاثة السطحية ، ولكن ، مثل Normal Mapping ، الذي يستخدم نهجًا أصليًا لخداع عيون المراقب.
الفكرة الرئيسية من التطبيق هي تشويه إحداثيات الملمس للجزء الحالي بناءً على اتجاه النظرة وبيانات خريطة الارتفاع من أجل خلق الوهم بأن هذا الجزء ينتمي إلى جزء من السطح أعلى أو أقل مما هو عليه في الواقع. لفهم أفضل للمبدأ ، انظر إلى الرسم البياني لمثالنا مع الطوب:
هنا ، يمثل الخط الأحمر الخام القيم من خريطة الارتفاع ، مما يعكس الخصائص الهندسية لسطح البناء المحاكي. ناقل
colororange barV يمثل الاتجاه من السطح إلى المراقب (
viewDir ). إذا كانت الطائرة منقوشة حقًا ، فعندئذٍ سيرى المراقب نقطة على السطح
colorblueب . ومع ذلك ، في الواقع لدينا طائرة مثالية والأشعة في اتجاه الرؤية تعبر الطائرة عند نقطة
colorgreenA هذا واضح. مهمة رسم خرائط المنظر لتغيير إحداثيات النسيج عند نقطة ما
colorgreenA بحيث تصبح متطابقة مع الإحداثيات المقابلة للنقطة
colorblueب . علاوة على ذلك بالنسبة للجزء الحالي (يتوافق مع النقطة
colorgreenA ) نستخدم إحداثيات النقطة التي تم الحصول عليها
colorblueب أخذ عينات النسيج ضروري للجميع ، مما يخلق الوهم الذي يراه المراقب نقطة
colorblueب .
تكمن الصعوبة الرئيسية في كيفية حساب إحداثيات الملمس للنقطة
colorblueب يجري في هذه النقطة
colorgreenA . يوفر Parallax Mapping حلاً تقريبيًا باستخدام التحجيم البسيط لمتجه الاتجاه من السطح
colororange barV إلى المراقب من ارتفاع الجزء
colorgreenA . على سبيل المثال فقط قم بتغيير الطول
colororange barV بحيث يتطابق مع حجم العينة من خريطة الارتفاع
colorgreenH(A) المقابلة للجزء
colorgreenA . يوضح الرسم البياني أدناه نتيجة التحجيم - المتجه
colorbrown barP :
بعد ذلك ، المتجه الناتج
colorbrown barP تتحلل إلى مكونات وفقًا لنظام الإحداثيات الخاص بالمستوى نفسه ، والتي يتم استخدامها كإزاحات لإحداثيات النسيج الأصلية. علاوة على ذلك ، منذ ناقلات
colorbrown barP يتم حسابها باستخدام القيمة من خريطة الارتفاع ، كلما كانت قيمة الارتفاع تتوافق مع الجزء الحالي ، كلما كانت الإزاحة أقوى بالنسبة لها.
تعطي هذه التقنية البسيطة نتائج جيدة في بعض الحالات ، لكنها لا تزال تقديرًا تقريبيًا جدًا لموضع النقطة
colorblueب . إذا كانت خريطة الارتفاع تحتوي على مناطق ذات قيم متغيرة بشكل حاد ، فإن نتيجة الإزاحة تصبح غير صحيحة: على الأرجح المتجه
colorbrown barP حتى قريبة لن تقع في محيط النقطة
colorblueب :
بناءً على ما سبق ، يبقى سؤال آخر: كيفية تحديد كيفية عرض ناقلات بشكل صحيح
colorbrown barP إلى سطح موجه بشكل تعسفي للحصول على مكونات لتعويض إحداثيات النسيج؟ سيكون من الجيد إجراء الحسابات في نظام إحداثيات معين ، حيث يتم توسيع الناقل
colorbrown barP على المكونات
x و
y تتوافق دائمًا مع أساس نظام إحداثيات النسيج. إذا كنت قد درست بعناية درس
التخطيط العادي ، فأنت قد خمنت بالفعل أننا نتحدث عن الحسابات في الفضاء المماس.
نقل الناقل من السطح إلى الراصد
colororange barV في الفضاء المماس نحصل على ناقلات معدلة
colorbrown barP ، الذي سيتم تنفيذ تحلل مكوناته دائمًا وفقًا لناقلات المماس ثنائية الظل لسطح معين. نظرًا لأن المماس والمماس الثنائي يتم محاذاةهما دائمًا مع محاور نظام إحداثيات النسيج للسطح ، فبغض النظر عن اتجاه السطح ، يمكنك استخدام مكونات
x و
y للمتجه بأمان
colorbrown barP كإزاحات لإحداثيات النسيج.
ومع ذلك ، فإن النظرية كافية ، وبعد أن لفنا سواعدنا ، ننتقل إلى التنفيذ الفوري.
رسم خرائط المنظر
من أجل التنفيذ ، سنستخدم مستوى بسيطًا يحتوي على ظل متعرج ومائل تحيز له - يمكننا بالفعل القيام بذلك من الدرس حول رسم الخرائط العادي. نحن نعين عددًا من الطائرات لمستويات النسيج:
منتشر ،
عادي ، وتعويضات ، كل منها متاح على الرابط المناسب. في الدرس ، سنستخدم أيضًا رسم الخرائط العادي ، نظرًا لأن Parallax Mapping يخلق الوهم بتضاريس السطح ، والتي يمكن كسرها بسهولة إذا لم تتغير الإضاءة وفقًا للطوبوغرافيا. نظرًا لأن الخرائط العادية غالبًا ما يتم إنشاؤها على أساس خرائط الارتفاع ، فإن استخدامها المشترك يضمن التوصيل الصحيح للإضاءة ، مع مراعاة التضاريس.
ربما لاحظت بالفعل أن خريطة الإزاحة الموضحة في الرابط أعلاه هي ، في الواقع ، عكس الخريطة الموضحة في بداية الدرس. يتم تنفيذ رسم خرائط Parallax عادةً باستخدام مثل هذه الخرائط فقط ، والتي تكون معكوسة لخرائط الارتفاع -
خرائط العمق . يحدث هذا لأن تقليد العطلات على متن الطائرة أسهل إلى حد ما من تقليد الارتفاع. وفقًا لهذا التغيير ، يتغير مخطط عمل Parallax Map أيضًا:
مرة أخرى نرى نقاط مألوفة
colorgreenA و
colorblueب ومع ذلك ، هذه المرة المتجه
colorbrown barP تم الحصول عليها بطرح المتجه
colororange barV من إحداثيات الملمس عند نقطة ما
colorgreenA . يمكن الحصول على الأعماق بدلاً من الارتفاعات ببساطة عن طريق طرح عينة العمق من الوحدة أو عكس ألوان النسيج في أي محرر صور.
يتم تطبيق Parallax Mapping في تظليل الأجزاء ، حيث تختلف بيانات الارتفاع لكل جزء داخل المثلث. سيتطلب كود تظليل الجزء حساب المتجه من الجزء إلى المراقب
colororange barV لذا سيكون من الضروري أن ننقل إليه موضع الجزء والمراقب في الفضاء المماس. وفقًا لنتائج الدرس حول رسم الخرائط العادي ، لا يزال لدينا تظليل الرأس في أيدينا ، والذي ينقل جميع هذه المتجهات التي تم تقليلها بالفعل إلى الفضاء المماس ، سنستخدمها:
#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; layout (location = 3) in vec3 aTangent; layout (location = 4) in vec3 aBitangent; out VS_OUT { vec3 FragPos; vec2 TexCoords; vec3 TangentLightPos; vec3 TangentViewPos; vec3 TangentFragPos; } vs_out; uniform mat4 projection; uniform mat4 view; uniform mat4 model; uniform vec3 lightPos; uniform vec3 viewPos; void main() { gl_Position = projection * view * model * vec4(aPos, 1.0); vs_out.FragPos = vec3(model * vec4(aPos, 1.0)); vs_out.TexCoords = aTexCoords; vec3 T = normalize(mat3(model) * aTangent); vec3 B = normalize(mat3(model) * aBitangent); vec3 N = normalize(mat3(model) * aNormal); mat3 TBN = transpose(mat3(T, B, N)); vs_out.TangentLightPos = TBN * lightPos; vs_out.TangentViewPos = TBN * viewPos; vs_out.TangentFragPos = TBN * vs_out.FragPos; }
من بين الأشياء المهمة ، سألاحظ فقط أنه على وجه التحديد لتلبية احتياجات Parallax Mapping ، من الضروري نقل positionPoser في الفضاء المماس إلى تظليل الجزء
aPos .
داخل التظليل ، نقوم بتطبيق خوارزمية Parallax Mapping ، والتي تبدو مثل هذا:
#version 330 core out vec4 FragColor; in VS_OUT { vec3 FragPos; vec2 TexCoords; vec3 TangentLightPos; vec3 TangentViewPos; vec3 TangentFragPos; } fs_in; uniform sampler2D diffuseMap; uniform sampler2D normalMap; uniform sampler2D depthMap; uniform float height_scale; vec2 ParallaxMapping(vec2 texCoords, vec3 viewDir); void main() { vec3 viewDir = normalize(fs_in.TangentViewPos - fs_in.TangentFragPos);
أعلنا عن وظيفة ParallaxMapping ، التي تنقل إحداثيات الملمس للجزء والمتجه من الجزء إلى المراقب
colororange barV في الفضاء المماس. نتيجة الوظيفة هي إحداثيات نسيج الإزاحة ، والتي يتم استخدامها بالفعل للعينات من نسيج منتشر وخريطة عادية. ونتيجة لذلك ، فإن اللون المنتشر للبكسل وطبيعته يتوافق بشكل صحيح مع "الهندسة" المتغيرة للمستوى.
ما هو الاختباء داخل وظيفة ParallaxMapping؟
vec2 ParallaxMapping(vec2 texCoords, vec3 viewDir) { float height = texture(depthMap, texCoords).r; vec2 p = viewDir.xy / viewDir.z * (height * height_scale); return texCoords - p; }
هذه الوظيفة البسيطة نسبيًا هي التنفيذ الحرفي للطريقة ، التي ناقشنا نقاطها الرئيسية أعلاه. تؤخذ إحداثيات نسيج TexCoords الأولية ، مع تحديد الارتفاع (أو العمق)
colorgreenH(A) من
deepMap للجزء الحالي. لحساب المتجه
colorbrown barP يتم
أخذ متجه
viewDir في الفضاء المماس
ويقسم زوج مكوناته
x و
y على المكون
z ، ويتم
قياس النتيجة من خلال قيمة إزاحة القراءة لقراءة
الارتفاع . كما تم إدخال
الزي ذو الارتفاع القياسي لتوفير تحكم إضافي في شدة تأثير رسم خرائط Parallax ، حيث يكون تأثير الإزاحة قويًا جدًا في العادة. للحصول على النتيجة ، نطرح المتجه الناتج
colorbrown barP من إحداثيات الملمس الأصلي.
سنتعامل مع لحظة تقسيم
viewDir.xy إلى
viewDir.z . نظرًا لتطبيع
viewDir المتجه ، فإن
مكونه z يقع في الفاصل الزمني [0 ، 1]. عندما يكون المتجه متوازيًا تقريبًا مع سطح المكون
z يكون قريبًا من الصفر ، وتعيد عملية القسمة المتجه
colorbrown barP أطول بكثير مما إذا كان
viewDir قريبًا من العمودي على السطح. وبعبارة أخرى ، نقوم بقياس المتجه
colorbrown barP بحيث تزداد عندما تنظر إلى السطح بزاوية - وهذا يسمح لك بالحصول على نتيجة أكثر واقعية في مثل هذه الحالات.
يفضل بعض المطورين إزالة القياس عن طريق القسمة على
viewDir.z ، لأنه في حالات معينة ، يعطي هذا النهج نتائج غير صحيحة عند عرضها من زاوية. هذا التعديل في التقنية يسمى
Parallax Mapping with Offset Limitation . يبقى خيار خيار النهج ، في معظمه ، مسألة تفضيل شخصي - على سبيل المثال ، أنا أكثر ولاءً لنتائج خوارزمية رسم خرائط Parallax المعتادة.
تُستخدم إحداثيات النسيج المتغيرة الناتجة في النهاية للاختيار من الخريطة المنتشرة والخريطة العادية ، مما يمنحنا تأثير تشويه سطحًا جيدًا (يتم اختيار معلمة
height_scale هنا قريبة من 0.1):
في الصورة ، يمكنك مقارنة تأثيرات تقنيات رسم الخرائط الطبيعية ورسم خرائط المنظر. نظرًا لأن Parallax Mapping يحاكي المخالفات السطحية ، فإن المواقف ممكنة لهذه التقنية حيث تتداخل الطوب ، اعتمادًا على اتجاه العين.
التحف الغريبة مرئية أيضًا على طول حدود المستوى المحكم. تظهر بسبب حقيقة أن إحداثيات النسيج التي تم إزاحتها بواسطة خوارزمية Parallax Mapping يمكن أن تقع خارج فترة الوحدة ، وتتسبب في
وضع غير مرغوب فيه ، اعتمادًا على
وضع الالتفاف . هناك طريقة بسيطة للتخلص من هذه القطع الأثرية وهي التخلص ببساطة من جميع الأجزاء التي تكون إحداثيات النسيج لها خارج فترة الوحدة:
texCoords = ParallaxMapping(fs_in.TexCoords, viewDir); if(texCoords.x > 1.0 || texCoords.y > 1.0 || texCoords.x < 0.0 || texCoords.y < 0.0) discard;
ونتيجة لذلك ، سيتم التخلص من جميع الأجزاء ذات إحداثيات الملمس المنقولة التي تقع خارج الفاصل الزمني [0 ، 1] وستصبح نتيجة إجراء رسم خرائط Parallax مقبولة بصريًا. من الواضح أن طريقة الرفض هذه ليست عالمية وقد لا تنطبق على بعض الأسطح أو حالات التركيب. ولكن على سبيل المثال الطائرة ، فهي تعمل بشكل مثالي وتساعد على تعزيز تأثير تغيير راحة الطائرة:
مصادر العينة
هنا .
يبدو جيدًا ، وأداء الطريقة ممتازًا - كل ما تطلبه الأمر هو عينة إضافية من الملمس! لكن بساطة الطريقة لها عيوب كبيرة: يتم تدمير تأثير الإغاثة بسهولة عند النظر إلى الطائرة بزاوية (وهذا ينطبق أيضًا على رسم الخرائط العادي) أو إذا كانت هناك أقسام في خريطة الارتفاع مع تغييرات حادة في القيم:
يكمن سبب تدمير الوهم في حقيقة أن الخوارزمية هي تقريب تقريبي لخريطة التهجير الحقيقية. ومع ذلك ، يمكن أن تساعدنا عدة حيل إضافية ، مما يتيح لنا الحصول على نتائج مثالية تقريبًا حتى عند النظر إلى زاوية أو عند استخدام خرائط الارتفاع مع تغييرات حادة. على سبيل المثال ، يمكننا استخدام عدة عينات من خريطة ارتفاع للعثور على النقطة الأقرب إلى النقطة
colorblueب .
رسم خرائط المنظر الحاد
تعد تقنية Stall Parallax Mapping تطورًا منطقيًا لخريطة Parallax الكلاسيكية: يتم استخدام نفس النهج في الخوارزمية ، ولكن بدلاً من التحديد الفردي ، يتم اتخاذ العديد - لتقريب أفضل للمتجه
colorbrown barP تستخدم لحساب النقطة
colorblueب . نظرًا لهذه العينات الإضافية ، تكون نتيجة الخوارزمية أكثر وضوحًا من الناحية البصرية ، حتى عند النظر إلى الزوايا الحادة على السطح.
أساس نهج PM الحاد هو أخذ نطاق معين من الأعماق وتقسيمه إلى طبقات متساوية الحجم. بعد ذلك ، نقوم بالتكرار من خلال الطبقات بينما نقوم في نفس الوقت بتغيير إحداثيات النسيج الأصلية في اتجاه المتجه
colorbrown barP وعمل عينات من خريطة العمق ، تتوقف في اللحظة التي يكون فيها عمق العينة أقل من عمق الطبقة الحالية. تحقق من الرسم البياني:
كما ترون ، نحن نتحرك من خلال الطبقات من الأعلى إلى الأسفل ولكل طبقة نقارن عمقها بالقيمة من خريطة العمق. إذا كان عمق الطبقة أقل من القيمة من خريطة العمق ، فهذا يعني أن المتجه
colorbrown barP المقابلة لهذه الطبقة تقع فوق السطح. تتكرر هذه العملية حتى يصبح عمق الطبقة أكبر من التحديد من خريطة العمق: في هذه اللحظة ، المتجه
colorbrown barP يشير إلى نقطة تحت التضاريس السطحية المحاكاة.
يوضح المثال أن التحديد من خريطة العمق في الطبقة الثانية (
D(2)=0.73 ) لا تزال تقع "أعمق" فيما يتعلق بعمق الطبقة الثانية يساوي 0.4 ، مما يعني أن عملية البحث مستمرة. في الممر التالي ، تبين أن عمق الطبقة 0.6 أخيرًا "أعلى" من قيمة العينة من خريطة العمق (
D(3)=0.37 ) من هنا نستنتج أن الناقل
colorbrown barP تم الحصول عليها للطبقة الثالثة هي الموقع الأكثر موثوقية لهندسة السطح المشوه. يمكنك استخدام إحداثيات الملمس
T3 مستمدة من المتجه
colorbrown barP ، لتعويض إحداثيات النسيج للجزء الحالي. من الواضح أن دقة الطريقة تنمو مع عدد الطبقات.
ستؤثر التغييرات في التنفيذ على وظيفة ParallaxMapping فقط ، حيث أنها تحتوي بالفعل على جميع المتغيرات اللازمة لعمل الخوارزمية:
vec2 ParallaxMapping(vec2 texCoords, vec3 viewDir) {
أولاً ، نقوم بتهيئة: تعيين عدد الطبقات ، وحساب عمق كل منها ، وأخيرًا ، إيجاد حجم إزاحة إحداثيات النسيج على طول اتجاه المتجه
colorbrown barP ، والتي يجب إزالتها على كل طبقة.
التالي هو ممر من خلال الطبقات ، بدءًا من الأعلى ، حتى يتم العثور على تحديد من خريطة العمق التي تقع "فوق" قيمة عمق الطبقة الحالية:
في هذا الكود ، نجتاز كل طبقات العمق ونغير إحداثيات النسيج الأصلية حتى يصبح التحديد من خريطة العمق أقل من عمق الطبقة الحالية. يتم تنفيذ الإزاحة بطرح من إحداثيات النسيج الأصلية للدلتا بناءً على المتجه
colorbrown barP . نتيجة الخوارزمية عبارة عن متجه تعويض لإحداثيات النسيج ، محدد بدقة أكبر بكثير من رسم خرائط Parallax الكلاسيكي.
باستخدام حوالي 10 عينات ، يصبح مثال البناء بالطوب أكثر واقعية ، حتى عند النظر إليه من زاوية. ولكن أفضل ما في الأمر ، أن مزايا Steep PM مرئية على الأسطح مع خريطة عمق ، والتي لديها تغيرات حادة في القيم. على سبيل المثال ، كما هو الحال في هذه اللعبة الخشبية ، سبق أن تم توضيح ذلك مسبقًا:
يمكنك تحسين الخوارزمية أكثر قليلاً إذا قمت بتحليل القليل من ميزات تقنية Parallax Mapping. إذا نظرت إلى السطح بشكل طبيعي تقريبًا ، فلا داعي لتغيير إحداثيات الملمس بقوة ، بينما عند النظر إلى زاوية ما ، يميل التحول إلى الحد الأقصى (تخيل عقليًا اتجاه الرؤية في كلتا الحالتين). إذا حددت عدد العينات اعتمادًا على اتجاه نظراتك ، يمكنك توفير الكثير حيث لا تكون هناك حاجة إلى عينات إضافية:
const float minLayers = 8.0; const float maxLayers = 32.0; float numLayers = mix(maxLayers, minLayers, abs(dot(vec3(0.0, 0.0, 1.0), viewDir)));
يتم استخدام نتيجة المنتج القياسي ل
viewDir المتجه و نصف المحور الموجب Z لتحديد عدد الطبقات في الفاصل الزمني [
minSamples ،
maxSamples ] ، أي يحدد اتجاه النظر العدد المطلوب لتكرار التأثير (في الفضاء المماس ، يتم توجيه نصف المحور الموجب Z بشكل طبيعي إلى السطح). إذا نظرنا بالتوازي مع السطح ، فسيستخدم التأثير جميع الطبقات الـ 32.
كود المصدر المعدل
هنا . أقترح أيضًا تنزيل نسيج لعبة خشبية:
منتشر ،
خريطة عادية ، خريطة عمق .
لا يخلو من نهج وعيوب. نظرًا لأن عدد العينات متماثل تمامًا ، فإن ظهور تأثيرات التعرج أمر لا مفر منه ، مما يجعل التحولات بين الطبقات ملفتة للنظر:
يمكنك تقليل شدة الأداة عن طريق زيادة عدد العينات المستخدمة ، ولكنها تلتهم بسرعة جميع أداء معالج الفيديو المتاح. هناك العديد من الإضافات إلى الطريقة ، والتي تعود نتيجة ليس النقطة الأولى التي ظهرت تحت التصريف التخيلي للسطح ، ولكن القيمة المحيرة للطبقتين الأقرب ، مما يسمح لنا بمزيد من التوضيح موقف النقطة
colorblueب .
من بين هذه الطرق ، يتم استخدام طريقتين في الغالب:
رسم خرائط Parallax Relief و
Parallax Occlusion Mapping ، حيث يقدم Relief PM النتائج الأكثر موثوقية ، ولكنه أيضًا أكثر تطلبًا قليلاً على الأداء مقارنة بخريطة Parallax Occlusion. نظرًا لأن رسم خرائط Parallax Occlusion لا يزال قريبًا جدًا من حيث الجودة إلى Relief PM ويعمل في الوقت نفسه بشكل أسرع ، فإنهم يفضلون استخدامه في أغلب الأحيان. بعد ذلك ، سيتم النظر في تنفيذ رسم خرائط Parallax الإطباق.
رسم خرائط انسداد المنظر
تعمل طريقة رسم خرائط Parallax Occlusion جميعها على نفس المبادئ الأساسية مثل Steep PM ، ولكن بدلاً من استخدام إحداثيات النسيج للطبقة الأولى ، حيث تم العثور على تقاطع مع تخفيف وهمي ، تستخدم الطريقة استيفاء خطي بين طبقتين: الطبقة بعد التقاطع وقبله. يعتمد معامل الترجيح للاستكمال الخطي على نسبة عمق الإغاثة الحالي إلى أعماق كلتا الطبقتين قيد الدراسة. ألق نظرة على الرسم التخطيطي للحصول على فهم أفضل لكيفية عمل كل شيء:
كما ترى ، كل شيء مشابه جدًا لـ Steep PM ، تتم إضافة خطوة إضافية واحدة فقط لإقحام إحداثيات النسيج لطبقي العمق المتاخمين لنقطة التقاطع. بالطبع ، هذه الطريقة هي مجرد تقريب ، ولكنها أكثر دقة من PM حاد.
رمز مخطط انسداد Parallax هو بالإضافة إلى رمز PM الحاد وليس معقدًا للغاية:
[...]
في لحظة العثور على الطبقة ملقاة بعد نقطة التقاطع مع الارتياح الخيالي ، نحدد أيضًا إحداثيات الملمس للطبقة الموضوعة قبل نقطة التقاطع. بعد ذلك ، نجد الإزاحة لعمق الإغاثة التخيلي بالنسبة إلى أعماق الطبقتين قيد النظر ونستخدم نسبتها كمعامل وزن لمزيد من الاستكمال الخطي لإحداثيات النسيج المقابلة للطبقتين قيد النظر. يتم إرجاع نتيجة الاستيفاء بواسطة الوظيفة للاستخدام في المستقبل.
يعطي مخطط انسداد Parallax نتائج موثوقة بشكل مدهش بصريًا ، على الرغم من العيوب الصغيرة والتحف المستعارة. ولكن للحصول على حل وسط في السرعة والجودة ، فهي غير ذات أهمية ولا تظهر إلا مع المراقبة الدقيقة للسطح القريب من الكاميرا أو في زوايا رؤية حادة للغاية.
رمز المثال
هنا .
يعد Parallax Mapping تقنية رائعة حقًا تسمح لك بزيادة التفاصيل المرئية لمشهدك بشكل كبير ، ولكن ، بالطبع ، لها عيوبها في شكل التحف ، والتي تستحق التذكر عند تنفيذ التقنية في المشروع. بالنسبة للجزء الأكبر ، يتم استخدام Parallax Mapping على أسطح مستوية مثل الجدران أو الأرضيات - حيث ليس من السهل تحديد مخطط الكائن ككل ، وزاوية رؤية السطح غالبًا ما تكون قريبة من العمودي. في هذه الحالة ، تكون عيوب رسم خرائط Parallax غير مرئية تقريبًا ، على خلفية زيادة تفاصيل السطح.
مكافآت المترجم:
رسم خرائط Parallax الإغاثة
بما أن المؤلف ذكر طريقتين لتوضيح نتيجة PM الحاد ، من أجل الاكتمال ، سأصف ثاني النهج.
مثل Parallax Occlusion Mapping ، يتم استخدام نتيجة تنفيذ PM الحاد هنا ، أي نحن نعرف أعماق طبقتين تقع بينهما نقطة التقاطع الحقيقية للمتجه
colororange barV مع الارتياح ، وكذلك إحداثيات الملمس المقابلة
T2 و
T3 . يرجع تنقيح تقدير نقطة التقاطع في هذه الطريقة إلى استخدام البحث الثنائي.
خطوات خوارزمية التحسين:
- إجراء حساب PM حاد والحصول على إحداثيات الملمس T2 و T3 - في هذا الفاصل تقع نقطة تقاطع الناقل colorgreen barV مع تضاريس السطح. التقاطع الحقيقي يتميز بصليب أحمر.
- تنقسم إلى قيمتين حاليتين لإزاحة إحداثيات النسيج وارتفاع طبقة العمق.
- نقل إحداثيات الملمس من النقطة T3 في الاتجاه المعاكس للمتجه colorgreen barV بمقدار الإزاحة. قم بتقليل عمق الطبقة بقيمة قيمة الطبقة الحالية.
- بحث ثنائي مباشر. يتم تكرار عدد محدد من التكرارات:
- اختر من خريطة العمق. قم بتقسيم إزاحة النسيج الحالي وحجم طبقة العمق إلى قيمتين حاليتين.
- إذا كان حجم العينة أكبر من عمق الطبقة الحالية ، فقم بزيادة عمق الطبقة حسب حجم الطبقة الحالية ، وقم بتغيير إحداثيات النسيج على طول المتجه colorgreen barV إلى الإزاحة الحالية.
- إذا كان حجم العينة أقل من عمق الطبقة الحالية ، فقم بتقليل عمق الطبقة حسب حجم الطبقة الحالية ، وقم بتغيير إحداثيات النسيج على طول ناقل العكسي colorgreen barV إلى الإزاحة الحالية.
- آخر إحداثيات نسيج تم الحصول عليها هي نتائج PM Relief.
تظهر الصورة أنه بعد العثور على النقاط
T2 و
T3 نقوم بتخفيض حجم الطبقة وحجم إزاحة إحداثيات النسيج إلى النصف ، مما يعطينا أول نقطة تكرار للبحث الثنائي (1). نظرًا لأن حجم العينة فيها كان أكبر من العمق الحالي للطبقة ، فإننا نخفض المعلمات مرة أخرى ونتحرك على طول
colorgreen barV الحصول على النقطة (2) مع إحداثيات الملمس
Tp والتي ستكون نتيجة PM الحاد لاثنين من تكرارات البحث الثنائي.
كود شادر:
أيضًا إضافة صغيرة حول إضافة تظليل من مصدر ضوء محدد إلى خوارزمية الحساب. قررت أن أضيف ، لأن طريقة الحساب متطابقة تقنيًا مع تلك المذكورة أعلاه ، لكن التأثير لا يزال مثيرًا للاهتمام ويضيف التفاصيل.في الواقع ، يتم تطبيق نفس PM الحاد ، ولكن البحث لا يتعمق في السطح المحاكي على طول خط الرؤية ، ولكن من السطح ، على طول المتجه إلى مصدر الضوءˉ لام .
يتم نقل هذا الناقل أيضًا إلى الفضاء المماس ويستخدم لتحديد مقدار إزاحة إحداثيات النسيج. عند إخراج الطريقة ، يتم الحصول على معامل إضاءة المواد في الفاصل الزمني [0 ، 1] ، والذي يُستخدم لتعديل مكونات الانتشار والمرآة في حسابات الإضاءة.لتحديد التظليل بحواف حادة ، ما عليك سوى المشي على طول المتجهˉ L حتى نقطة تقع تحت السطح. بمجرد العثور على هذه النقطة ، نأخذ معامل الإضاءة 0. إذا وصلنا إلى عمق صفر دون التقاء نقطة تقع تحت السطح ، فإننا نأخذ معامل الإضاءة يساوي 1.لتحديد التظليل بحواف ناعمة ، من الضروري التحقق من عدة نقاط ملقاة على المتجهˉ L وتقع تحت السطح. يتم أخذ عامل التظليل مساوياً للفرق بين عمق الطبقة الحالية والعمق من خريطة العمق. يؤخذ في الاعتبار أيضًا إزالة النقطة التالية من الجزء المعني في شكل معامل وزن يساوي (1.0 - stepIndex / numberOfSteps). في كل خطوة ، يتم تحديد معامل الإضاءة الجزئي على النحو التالي:P S F i = ( l a y e r H e i g h t i - h e i g h t F r o m t e x t u r e i ) ∗ ( 1.0 - in u m S t e p s )
تكون النتيجة النهائية هي الحد الأقصى لعامل الضوء الجزئي:S F = m a x ( P S F i )
مخطط الطريقة:تقدم الطريقة لثلاث تكرارات في هذا المثال:- نقوم بتهيئة عامل الضوء الكلي إلى الصفر.
- خذ خطوة على طول المتجه ˉ L ، الوصول إلى النقطةح أ . من الواضح أن عمق النقطة أقل من التحديد من الخريطة. H ( T L 1 ) - تحت السطح. هنا أجرينا أول فحص ، وتذكرًا لإجمالي عدد الفحوصات ، وجدنا عامل الضوء الجزئي الأول وحفظه: (1.0 - 1.0 / 3.0).
- خذ خطوة على طول المتجه ˉ L ، الوصول إلى النقطةح ب . من الواضح أن عمق النقطة أقل من التحديد من الخريطة. H ( T L 2 ) - تحت السطح. الفحص الثاني والمعامل الجزئي الثاني: (1.0 - 2.0 / 3.0).
- نأخذ خطوة أخرى على طول المتجه ونصل إلى الحد الأدنى من العمق 0. أوقف الحركة.
- تعريف النتيجة: إذا لم يتم العثور على نقاط تحت السطح ، فإننا نرجع معامل يساوي 1 (بدون تظليل). خلاف ذلك ، يصبح المعامل الناتج هو الحد الأقصى للمعاملات الجزئية المحسوبة. للاستخدام في حسابات الإضاءة ، نطرح هذه القيمة من الوحدة.
مثال كود شادر:
يتم استخدام المعامل الناتج لتعديل نتيجة نموذج الإضاءة Blinn-Fong المستخدم في الأمثلة: [...]
مقارنة بين جميع الطرق في مجموعة واحدة بحجم 3 ميجابايت.أيضا مقارنة فيديو:مواد إضافية
ملاحظة : لدينا برقية أسيوط لتنسيق التحويلات. إذا كانت لديك رغبة جادة في المساعدة في الترجمة ، فأنت مرحب بك!