3 ডি রেন্ডারিংয়ে সূচকের উদ্দেশ্য কী?


11

মনে করুন আপনি ওপেনজিএলে একটি 3 ডি কিউব তৈরি করছেন। আপনি অবজেক্ট (কিউব) এর জন্য প্রয়োজনীয় ভারটিেক্স ডেটা প্রয়োগ করেন। সূচকগুলি ব্যবহার করে কী লাভ হবে?

বনাম

 void CreateCube()
        {
            const Vertex VERTICES[8] =
            {
                { { -.5f, -.5f,  .5f, 1 }, { 0, 0, 1, 1 } },
                { { -.5f,  .5f,  .5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f,  .5f, 1 }, { 0, 1, 0, 1 } },
                { {  .5f, -.5f,  .5f, 1 }, { 1, 1, 0, 1 } },
                { { -.5f, -.5f, -.5f, 1 }, { 1, 1, 1, 1 } },
                { { -.5f,  .5f, -.5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f, -.5f, 1 }, { 1, 0, 1, 1 } },
                { {  .5f, -.5f, -.5f, 1 }, { 0, 0, 1, 1 } }
            };

            const GLuint INDICES[36] =
            {
                0,2,1,  0,3,2,
                4,3,0,  4,7,3,
                4,1,5,  4,0,1,
                3,6,2,  3,7,6,
                1,6,5,  1,2,6,
                7,5,6,  7,4,5
            };

    //....

    glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(INDICES), INDICES, GL_STATIC_DRAW);

উপরের উদাহরণে, একটি মহাশূন্য তৈরি করা হয়েছে বিশ্ব স্পেসে প্রয়োজনীয় শীর্ষগুলি দিয়ে। সূচকের জন্য প্রাসঙ্গিকতা কী?


1
অনেক জায়গায় আপনি দেখতে পাবেন লোকেরা তাদের মুখ ডাকছে। এবং তারা কি হয়। ত্রিভুজ গঠনের জন্য প্রতিটি মুখ সাধারণত 3 টি শীর্ষ দ্বারা রচিত হয়। অতএব, প্রতিটি 3 সূচকগুলি চূড়ান্ত জালটিতে একটি ত্রিভুজটির সাথে মিলে যায়। এগুলিকে সূচক বলা হয় কারণ এগুলি মূলত যেখানে ভার্টেক্সের অ্যারেতে প্রকৃত ভার্টেক্স তথ্য রয়েছে তার অফসেট। সূচকগুলি সম্পর্কে আপনার যা যা জানা দরকার তা অনুমান করি :)
গ্রিমশো

উত্তর:


24

3 ডি মডেল উপস্থাপনের জন্য প্রয়োজনীয় মেমরি পদচিহ্নগুলি হ্রাস করতে সূচকগুলি উপস্থিত রয়েছে, রঙ প্যালেটগুলি 2D চিত্রের মেমরির পদচিহ্ন হ্রাস করতে একইভাবে ব্যবহার করা যেতে পারে।

সূচীকরণ আপনাকে একটি শীর্ষবিন্দুর পুরো সংজ্ঞা পুনরাবৃত্তি এড়াতে দেয় যদি আপনাকে সেই ভার্টেক্সের ডেটা নকল করতে হয়, কারণ সাধারণত কোনও জটিল মডেলের জন্য আপনাকে যা করতে হবে।

আধুনিক 3 ডি এপিআই ত্রিভুজ ব্যবহার করে রেন্ডার করে; কিউবের প্রতিটি মুখের জন্য দুটি ত্রিভুজ প্রয়োজন:

A--B 
|\ |   This cube face has two triangles:
| \|   ABD and ADC.
C--D

সূচকগুলি ছাড়াই সেই মুখটি নির্দিষ্ট করতে আপনাকে অবশ্যই শীর্ষবিন্দু নির্দিষ্ট করতে হবে A, B, D, A, D, C। ভার্টেক্স বাফারে দুটি ভার্টেক্স ( Aএবং D) পুনরাবৃত্তি হয়।

যাইহোক, সূচকের সঙ্গে, আপনি শুধুমাত্র প্রয়োজনীয় ছেদচিহ্ন (সম্বলিত একটি প্রান্তবিন্দু বাফার থাকতে পারে A, B, C, এবং D) এবং ছয় সূচকের: 0, 1, 3, 0, 3, 2। যেহেতু সূচকগুলি সাধারণত উল্লম্বের তুলনায় অনেক ছোট এবং অনেকগুলি উল্লম্ব সাধারণত ব্যবহারিক মডেলগুলিতে পুনরাবৃত্তি হয়, তাই এটি একটি গুরুত্বপূর্ণ স্থান-সঞ্চয় হতে পারে।

নোট করুন যে কিছু শীর্ষবিন্দু কেবল আংশিক বৈশিষ্ট্যগুলি ভাগ করে নেবে। উদাহরণস্বরূপ, টেক্সচার ম্যাপিংয়ের সাথে একটি ঘনককে রেন্ডার করার সময়, একজন সাধারণত প্রতি মুখের জন্য অনন্য টেক্সচারের স্থানাঙ্ক চায়, তাই আপনার একই অবস্থান এবং বিভিন্ন টেক্সচারের স্থানাঙ্কের সাথে একাধিক উল্লম্ব থাকবে। সেই পরিমাণ নকল গ্রহণযোগ্য এবং প্রয়োজনীয়; আপনি যখন সূচকগুলি থেকে সুবিধাগুলি দেখতে শুরু করতে চান এমন একটি ভার্টেক্স গুণাবলীর পুরো সেটটিকে নকল করুন ।

প্রকৃতপক্ষে যদি আপনার সমস্ত জাল কোণগুলি 100% স্বতন্ত্র হয় তবে সূচকের কোনও লাভ নেই (বাস্তবে আপনি রিডানড্যান্ট সূচক বাফারের ব্যবহারে আরও বেশি জায়গা ব্যবহার করবেন)। তবে এটি সর্বদা ঘটে না।


1
পরিবর্তে এটি 0,1,3, 0,1,2 হওয়া উচিত?
খিত CRUD বিকাশকারী

0, 1, 3, 0, 3, 2 আসলে, ধন্যবাদ (ভিত্তিক এ = 0, বি = 1, সি = 2, ডি = 3)। আমি উত্তর আপডেট।

হতে পারে এটি উল্লেখ করার মতো, যে একটি ত্রিভুজটিতে জাল দিয়ে সংলগ্ন ত্রিভুজগুলির গড় সংখ্যা 6 হয়
আরনে

7

সূচকগুলি ব্যবহার করা তিনটি প্রধান উদ্দেশ্যে কাজ করে:

  • আসল জাল থেকে সরাতে ডুপ্লিকেট শীর্ষকে সক্ষম করে মেমরির প্রয়োজনীয়তা হ্রাস করা।
  • ডুপ্লিকেট শীর্ষকে একবারে রূপান্তরিত করতে সক্ষম করে ভার্টেক্স শ্যাডার গণনা হ্রাস করা।
  • সংঘবদ্ধ আদিমদের দ্বারা এর ফলে আপনাকে কল কল হ্রাস করতে সক্ষম করে।

এর মধ্যে প্রথমটি সুস্পষ্ট কারণ আপনি এটি নিজের কোডে সরাসরি পরিমাপ করতে পারবেন: যদি কোনও জাল থাকে তবে বলুন, 50k উল্লম্ব কিন্তু যদি তাদের 30k ডুপ্লিকেট থাকে তবে আপনার একটি স্মৃতি সঞ্চয় রয়েছে।

দ্বিতীয় এবং তৃতীয়টি এতটা সুস্পষ্ট নয় - আপনাকে ইতিমধ্যে সূচকগুলি ব্যবহারের সিদ্ধান্ত নেওয়া উচিত এবং সেগুলি পরিমাপ করার জন্য আপনাকে নিজের কোড প্রোফাইল তৈরি করতে হবে এবং "এর আগে" এবং "পরে" পারফরম্যান্সকে আলাদা করতে হবে।

দ্বিতীয়টির জন্য, হার্ডওয়্যার সাম্প্রতিক রূপান্তরিত উল্লম্বের ফলাফলকে ক্যাশে করতে সক্ষম। সাম্প্রতিক রূপান্তরিত একের মতো একই ভার্টেক্সটি যদি আসে তবে ক্যাশেড সংস্করণটি আবারও গণনা সম্পাদন না করে ব্যবহার করা যেতে পারে। হার্ডওয়্যার এগুলি সনাক্ত করতে সূচি ব্যবহার করে, সুতরাং এই আচরণটি পাওয়ার জন্য সূচকগুলি একেবারে প্রয়োজনীয়।

তৃতীয়টির জন্য, আপনি যে প্রতিটি ড্র কল করেন তা জিপিইউর কতটুকু কাজ করা প্রয়োজন তা নির্বিশেষে একটি সিপিইউ ওভারহেড রাখে। যদি সমস্ত কিছু সমান হয়, তবে 1 ড্র কলটিতে 50k জাল আঁকানো 10k ড্র কলগুলিতে আঁকার চেয়ে আরও দ্রুত হতে চলেছে। তবে যদি আপনার জাল একাধিক স্ট্রিপ, বা (আরও খারাপ) স্ট্রিপ এবং অনুরাগীর সমন্বয়ে গঠিত, আপনি সূচকগুলি ব্যবহার না করে (1) সূচকগুলি ব্যবহার না করে বা (২) অবক্ষয় ত্রিভুজ প্রবর্তন না করে একক ড্র কলটিতে এটি করতে পারবেন না। সূচকগুলি উল্লম্বের চেয়ে অনেক ছোট হওয়ায় সাধারণ ক্ষেত্রে সূচকগুলি ব্যবহার করা পছন্দ হয়।


0

সূচকগুলি বলে যে তিনটি উল্লম্বের কোন গ্রুপ একসাথে কিউবের মুখ গঠন করে। ত্রিভুজের তিনটি উলম্বের প্রতিটি সেট ত্রিভুজের মুখ নয়।

আপনি প্রতিটি ভার্টেক্স ঠিক একবার ব্যবহার করতে পারতেন এবং ত্রিভুজটির চেয়ে বেশি ব্যবহৃত হয় এমন বহুবার পুনরাবৃত্তি করতে পারেন, তবে এর অর্থ অতিরিক্ত ভার্টেক্স রূপান্তর হবে। সূচকগুলির সাহায্যে আপনি কেবল একবারে শীর্ষকে রূপান্তর করেন এবং আপনার প্রয়োজন হিসাবে এটি বহুবার ব্যবহার করুন।


আপনি যখন ত্রিভুজ মানে?
খিত CRUD বিকাশকারী 21

আধুনিক গ্রাফিক্স হার্ডওয়্যার সবকিছুকে ত্রিভুজ হিসাবে উপস্থাপন করে।

1
আপনি যদি সত্যিই বুঝতে চান যে কি চলছে, কিছু গ্রাফ পেপার পান, 3D শীর্ষবিন্দু আঁকুন, এবং ইন্ডিকস দ্বারা নির্দিষ্ট উল্লম্বের মধ্যে রেখা আঁকুন।
ggambett
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.