صور نسيج متعددة ممزوجة معا على الأرض ثلاثية الأبعاد

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

  •  12-09-2019
  •  | 
  •  

سؤال

كيف تقوم ألعاب الكمبيوتر بتقديم أرضها؟ سوف أستخدم مرتفعا للهندسة (على الرغم من أنني سأحسن ذلك لاحقا) ولكني أتساءل ما هي أفضل التقنية، على سبيل المثال، "الطلاء" على أرضي؛ العشب في كل مكان، مسارات الأوساخ هنا وهناك، والحصى داخل البلدات، والانتقال السلس بين كل نوع من المواد.

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

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

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

فقط للتوضيح، النسيان هو مرجع جيد لما أبحث عنه. لا أعرف كيف تكون هندسة الأرض (مرتفعات، نماذج ثابتة ثلاثية الأبعاد، إلخ) ولكن التضاريس لها أنواع مختلفة من الأرضيات والانتقال السلس بينهما، كما أتحدث عنه. فيما يلي صورة مثال، لاحظ كيف يمزج المرصوف بالحصى في العشب وغير واقعي ولكن بسلاسة: http://www.elitistsnob.com/images/oblivion٪202006-05-21٪2008-38-25-15.jpg.

وأعتقد أيضا أنني قرأت عن هذا في واحدة من كتب GEMS برمجة اللعبة، لكنني لم أدفع الكثير من الاهتمام لها في ذلك الوقت، والآن بعد أن كان الصيف ليس لدي حق الوصول إلى مكتبة جامعتي للتحقق! أبحث عن جداول محتويات الآن وسوف تحرير إذا وجدت ذلك، لكنني سأظل قادرا على قراءتها حتى منتصف أغسطس.

عدل لم أتمكن من العثور على أي شيء مثل هذا تماما في لعبة GEMS البرمجة الأخرى، على الرغم من أن زوجين كان لديهم بعض مقالات الهندسة التضاريس.

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

المحلول

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

يمكنني استخدام خمسة قوام لإنجاز هذا. أربعة من هذه القوام هي نسيج التفاصيل: العشب والصخور والماء والرمل. هذه القوام صغيرة، 512 × 512 القوام، وهي مبلطة عبر التضاريس. الملمس الخامس هو mixmap. Mixmap هو نسيج عملاق يغطي التضاريس بأكمله، في حالتي 4096x4096.

mixmap.

يستخدم هذا Mixmap جميع قنوات الألوان الأربعة (R، G، B، A) لوصف مقدار نسيج التفاصيل لعرضه في موقع محدد. أنا أستخدم قناة اللون الأحمر لتحديد كيفية كفء الرمال، والأخضر هو للعشب، والأزرق مخصص للمياه، والألفا للصخور. يتم احتساب هذا mixmap بناء على expermap عند التهيئة وأي استخدام ارتفاعات لتحديد هذه القيم. على سبيل المثال، بالقرب من مستوى سطح البحر، فأنا أرغب في الغالب بالماء، لذلك قمت بتعيين قيمة عالية في القناة الزرقاء والقيم المنخفضة في القنوات الأخرى. عندما أحصل على أعلى في الجبال، أقوم بتعيين قناة ألوان ألفا إلى قيمة عالية لأنني أريد الكثير من نسيج الصخور، لكنني قمت بتعيين جميع قنوات الألوان الأخرى لخفض القيم.

شظافة الشظية

ثم يتم استخدام هذا mixmap لاستخدامه في شادظ الشظية، حيث أخذ هذه القنوات الملونة من mixmap واستخدامها للجمع بين قوام التفاصيل. هنا هو رمز GLSL الذي أستخدمه من Shader Fragment:

uniform sampler2D alpha;
uniform sampler2D grass;
uniform sampler2D water;
uniform sampler2D rock;
uniform sampler2D sand;
uniform float texscale;

varying vec3 normal, lightDir ;

void main()
{
   // Get the color information
   vec3 alpha    = texture2D( alpha, gl_TexCoord[0].st ).rgb;
   vec3 texSand  = texture2D( sand, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texGrass = texture2D( grass,  gl_TexCoord[0].st * texscale ).rgb;
   vec3 texWater = texture2D( water, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texRock  = texture2D( rock,  gl_TexCoord[0].st * texscale ).rgb;

   // Mix the colors together
   texSand *= mixmap.r;
   texGrass = mix(texSand,  texGrass, mixmap.g);
   texWater = mix(texGrass, texWater, mixmap.b);
   vec3 tx  = mix(texWater, texRock,  mixmap.a);

   // Lighting calculations
   vec3 dl = gl_LightSource[0].diffuse.rgb;   
   vec3 al = gl_LightSource[0].ambient.rgb;
   vec3 n = normalize(normal);
   vec3 d = tx * (dl * max( dot ( n, lightDir), 0.0 ) + al );   

   // Apply the lighting to the final color   
   vec4 finalColor = vec4( min(d, 1.0), 1.0);
   gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor);
}

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

نصائح أخرى

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

معرف يبدو أنه جعل واحد كبير "MeGatexture" (نحن نتحدث 32K ^ 2-128k ^ 2) العمل في QakeWars.

هناك Q & A مثيرة للاهتمام مع Carmack حولها في

http://web.archive.org/web/20080121072936/http://www.gamerwithin.com/?view=article&article=1319&cat=2

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

واحدة من الطرق القياسية، المستخدمة على سبيل المثال في المحرك المصدر (HL2)، هي أن يكون لكل قمة ألفا المزج بين موادتين. تتكون المواد عادة من albedo على الأقل وخريطة طبيعية. في المحرك المصدر، يتم السماح فقط بالمواد 2 لكل "مزيج نسيج"، وهو نوع من Crappy.

إذا كنت ترغب في الحصول على أكثر من 2 موادا، فعليك محاكاة ذلك عن طريق نسخ النزوح المختلفة مع نسيج مختلف، والتأكد من أن أي بلاط فردي يحتوي فقط على 2 مواد على الأكثر.

وجود ألفا لكل قمة الرأس بدلا من بكسل يعطي مظهرا سيئا للغاية. كما لاحظت في النسيان، فإنك تحصل على مزج روز بسلاسة في الرمل على سبيل المثال. هناك إصلاح لهذا العيب؛ يمكنك استخدام نسيج آخر يقوم بتعديل Alpha على أساس كل بكسل، بحيث تشمل الشقوق بين الحجارة المرصوفة بالرمل بسهولة، لكن قمم الحجارة المركبة لا تزال تظل عند 1.0 ألفا تقريبا حتى تبلغ درجة الصدارة المحمولة تقريبا 0 للكوبل مواد. هذا يمكن أن يجعل الانتقال يبدو لطيفا حقا بدلا من مجرد تشويه قبيح.

يمكنك أيضا استخدام نسيج RES منخفض يحتوي على ألفاس (ولكن لا يزال أعلى بكثير من 1 ألفا لكل قمة). قد تكون قوام Terain Terain 1148x2048، لكن الملمس المستخدم لمزجه لا يحتاج إلى دقة لكل تكسيل. الملمس 256 × 256 8 بت لكل نسيج Texel 96 كيلو بايت فقط مع خرائط MIP.

عموما، يتم تدوير المناطق الانتقالية، على الرغم من أنه من الممكن القيام ببعض الأشياء مع قنوات ألفا ومزج القوام.

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

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

وحاول استخدام القوام غير الملحومة لعشبك، وقوائم الصخور ... لا يحل ولكن يجعلها تبدو غير مشكلة

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