ওপেনজিএল ইএসে কোয়াড আঁকার দ্রুততম উপায়?


22

আমি ওপেনগিএল ইএস ২.০ ব্যবহার করছি আমার কাছে একগুচ্ছ কোয়াড আঁকতে হবে, যদি আমি জিএল_কিউএডিএস ব্যবহার করছিলাম তবে কোয়াডের জন্য কেবল চারটি শীর্ষে থাকতে পেরেছি, তবে মূলত আমি কেবল আঁকার সর্বোত্তম উপায়টি জানতে চাই আলাদা কোয়াডের গুচ্ছ

এখনও অবধি আমি যা করতে পেরেছি তা করতে পেরেছি: -GL_TRIANGLES (কোয়াডে vert টি উল্লম্ব) -ডিজেনেট করুন GL_TRIANGLE_STRIP (প্রতি কোয়াডে vert টি উল্লম্ব)

সম্ভাব্যতাগুলি আমি খুঁজে পেয়েছি: -GL_TRIANGLE_STRIP একটি বিশেষ সূচক মানের সাথে যা কোয়াড স্ট্রিপটি পুনরায় সেট করে (এর অর্থ কোয়াড প্রতি 5 টি সূচক হবে, তবে আমি মনে করি না যে এটি সম্ভব) ওপেনগেল ইএস 2.0

উত্তর:


33

কেবলমাত্র সূচক বাফার এবং জিএল_আরআইআরএলইএস ব্যবহার করুন। এক্ষেত্রে আপনার চার কোয়াড + 6 সূচক প্রয়োজন যা কোয়াড প্রতি 6 টি সূচকগুলি (6 অতিরিক্ত সূচকগুলি বড় ওভারহেডের মতো শোনাতে পারে তবে বাস্তবে এটি হয় না - একবার আপনি নিজের সূচক বাফারটি তৈরি করলে আপনাকে আবার এটি স্পর্শ করতে হবে না)। আরও তথ্যের জন্য এই পৃষ্ঠাটি দেখুন (glDrawE উপাদান অনুসন্ধান)

সাধারণ উদাহরণ কোড:

GLfloat vertices[] = {-1, -1, 0, // bottom left corner
                      -1,  1, 0, // top left corner
                       1,  1, 0, // top right corner
                       1, -1, 0}; // bottom right corner

GLubyte indices[] = {0,1,2, // first triangle (bottom left - top left - top right)
                     0,2,3}; // second triangle (bottom left - top right - bottom right)

glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);

এছাড়াও, আপনি যদি মাত্র একটি কোয়াড আঁকেন তবে ত্রিভুজ স্ট্রিপগুলি ( উইকিপিডিয়াতে দেখানো হয়েছে ) দিয়ে এটি আঁকতে আপনার কেবল 4 টি শীর্ষকোষ প্রয়োজন তবে আমার ধারণা আপনি ইতিমধ্যে এটি জানেন।


একক স্ট্রিপে একাধিক ত্রিভুজ স্ট্রিপগুলি মার্জ করার জন্য traditionalতিহ্যগত কৌশলটি হ'ল "ডিজেনারেটে ত্রিভুজগুলি": একটি স্ট্রিপের শেষ উপাদানটি পুনরাবৃত্তি করা এবং পরবর্তী স্ট্রিপের প্রথম উপাদানটি শূন্য অঞ্চল সহ 2 ত্রিভুজ তৈরি করে, যাতে কিছুই আঁকেনা। দ্বিতীয় কোয়াড সূচকগুলি বিবেচনা করুন (4, 5, 6, 7) দুটি কোয়াডের জিএল_আরআইএনএলআইপিআইপি-র জন্য সূচক বাফারটি হতে পারে: {0, 1, 2, 3, 3, 4,4, 5, 6, 7}} অবক্ষয়িত ত্রিভুজগুলি হ'ল 3,3,4এবং 3,4,4। এটি কি মূল্যবান? না, যদি না আপনার কোয়াডগুলি সাধারণ প্রান্তগুলির সাথে জোড়া (বা আরও বেশি) আসে। ২ য় কোয়াড যদি {3, 2, 4, 5 is হয় তবে স্ট্রিপটি হয় {0,1,3,2,5,4}
টুলমেকারস্টেভ

8
আর এই যে কেউ quads একটি গুচ্ছ আঁকা বরাবর এবং চাহিদা আসে পরিষ্কার করতে: কর্মক্ষমতা অনুরোধে জন্য, না উপরের কোড কপি, এবং একটি glDrawElements কল করুন প্রতিটি QUAD জন্য একবার । পরিবর্তে, এক শীর্ষে অ্যারে এবং একটি সূচক অ্যারে তৈরি করুন যাতে আপনি আঁকতে চান এমন সমস্ত কোয়াড অন্তর্ভুক্ত রয়েছে । GL_TRIANGLES ব্যবহার করে, দুটি কোয়াডের সূচক থাকতে পারে {0,1,2, 0,2,3, 4,5,6, 4,6,7}বা সমানভাবে ভাল {0,1,2, 2,3,0, 4,5,6, 6,7,4}। এই সাহায্য করার জন্য ভালো ক্লাস হয় glText-অ্যান্ড্রয়েড / SpriteBatch
ToolmakerSteve

6

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

সুতরাং, যখন GL_TRIANGLE_STRIPকোনও সূচক বাফারের প্রয়োজন ছাড়াই এটি 4 টি শীর্ষে এটি করবে এবং আপনি একটি সূচক বাফার ব্যবহার করতে পারেন, এটি 2 লম্বালম্বি পুনরাবৃত্তি করে "সংরক্ষণ" করার চেষ্টা করা বেশ লম্বা । এই কারণে, আমি আপনাকে 2 পৃথক করে আঁকতে GL_TRIANGLESএবং ত্রিভুজের 2 টি শীর্ষকে পুনরাবৃত্তি করার পরামর্শ দিই


8
উম, না। দস্তাবেজ যা বলছে তা হ'ল আপনার মডেলগুলি একক INDEXED ত্রিভুজ স্ট্রিপ হিসাবে জমা দেওয়া হবে। এবং এর পরের বাক্যটি হ'ল, "ভার্টেক্স বাফারে একাধিক বার একই শীর্ষবিন্দুর জন্য ডেটা নির্দিষ্ট করা এড়াতে, একটি পৃথক সূচক বাফার ব্যবহার করুন এবং glDrawElements ফাংশনটি ব্যবহার করে ত্রিভুজ স্ট্রিপটি আঁকুন"। আপনি ঠিক যা ঠিক করেছিলেন ঠিক সেটাই 'খোঁড়া'।
ডেভিডফ 2281

3
প্রদত্ত যে ডক অনুচ্ছেদটি এখন glDrawArrays এর পরিবর্তে glDrawE উপাদানকে বোঝায়, সম্ভবত এই উত্তরটির পরে এটি আবার লেখা হয়েছে। তবুও, ডকটি যে বিষয়টি তৈরি করছিল তা হ'ল পারফরম্যান্সের জন্য একটি একক স্ট্রিপ সরবরাহ করুন (একাধিক স্ট্রিপের পরিবর্তে একাধিক গ্লোবাল কল)। এই পরিস্থিতিতে, আমি বিশ্বাস করি সূচকগুলি ব্যবহার করা বা না করাগুলির মধ্যে পার্থক্য তুচ্ছ নয় ; যা গুরুত্বপূর্ণ তা সমস্ত কিছুকে একটি একক ভার্টেক্স অ্যারে (প্লাস একটি alচ্ছিক সূচক অ্যারে) এ নিয়ে চলেছে, যাতে আপনি একটি সিএন জিএল কল করতে পারেন।
টুলমেকারস্টেভ

0

ডেস্কটপে বড় লাভ হ'ল ডেটাটি জিএলপ্যাটিক_ড্রেআউ ভিবিওগুলিতে স্থানান্তর করা। সম্ভবত এটি আইফোনের এমবিএক্স জিপিইউতেও সত্য।


-2

কোয়াডের GL_TRIANGLE_FANজন্য ব্যবহার করে 6 টি নয়, 4 টি উল্লম্ব ব্যবহার হয়।


হ্যাঁ, তবে GL_TRIANGLE_STRIPঅন্য উত্তরগুলি ইতিমধ্যে উল্লেখ করেছে।
আনকো

@জনাব. বেলা - আপনি প্রশ্নের বিন্দুটি মিস করেছেন, যা কীভাবে দক্ষতার সাথে গুচ্ছের গুচ্ছটি করতে হয়। প্রতিটি কোয়াডের জন্য একটি গ্ল কল করা উচিত নয়, বরং একক অ্যারেতে প্রচুর পরিমাণে কোয়াড একত্রিত করা উচিত, যা একক জিএল কল দিয়ে আঁকতে পারে। GL_TRIANGLE_FAN এটির সাহায্য করবে না, তাই উচ্চ-সম্পাদনা রেন্ডারিংয়ে খুব কমই কার্যকর।
টুলমেকারস্টেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.