2 ডি গেমস এবং আধুনিক ওপেনএল


10

Preconcepts

ঠিক আছে, সুতরাং আমি এখন পর্যন্ত যা সংগ্রহ করেছি তা হ'ল:

  • স্থির পাইপলাইন ব্যবহার করবেন না (অবনতিযুক্ত বা হ্রাস করা হবে)
  • vbos "অবজেক্ট মডেলগুলি" সঞ্চয় করে (এন ভার্টেক্স ডেটা, বেশিরভাগ)
  • ভোস বর্ণনা করে যে কীভাবে ডেটা বিছানো হয়েছে যাতে কল কলগুলি জানতে পারে যে প্রতিটি ভিবিওর কোন অংশটি কোন ধরণের ভার্টেক্স তথ্যগুলির জন্য রয়েছে (একটি ভোও একাধিক ভিবিওসকে বোঝাতে পারে, বিপরীত দিকটি কঠিন)
  • প্রতিটি ড্র কল শেডারগুলিতে ভার্টেক্স তথ্য প্রেরণ করে

আমি কীভাবে 3D দেখি (alচ্ছিক)

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

সমস্যা / প্রশ্ন

যদিও 2 ডি সমস্যা এবং অগ্রাধিকারগুলি সম্পূর্ণ আলাদা। আপনি খুব জটিল অবজেক্ট আঁকেন না, আপনার জটিল প্রজেকশন ম্যাট্রিক্সের দরকার নেই এবং হোয়াট নোট এবং শেডারগুলি আরও সহজ।

আধুনিক ওপেনলএল দিয়ে জ্যামিতি পরিবর্তন করে ঘন ঘন (সত্যিকারের ঘন ঘন, মূলত প্রতিটি ফ্রেম) আঁকার সর্বোত্তম উপায় কী হবে?

নিম্নলিখিত অনুচ্ছেদে আপনি সমস্যার কয়েকটি ধারণা (বৃত্ত এবং আয়তক্ষেত্রের সমস্যা) দেখতে পাচ্ছেন, এটি আমার যে ধরণের পরিবর্তনগুলি আগ্রহী তা আরও ভালভাবে সনাক্ত করতে পারে।

আমার প্রচেষ্টা (alচ্ছিক)

সুতরাং, আমি ভাবতে শুরু করেছিলাম যে আমি কীভাবে পর্দায় বেসিক 2D জ্যামিতি আঁকার সাথে মোকাবিলা করব:

  • a বর্গ: লোড ক [(1, 0), (1, 1), (0, 1), (0, 0)] স্থানীয় স্থানের বর্গক্ষেত্রের জ্যামিতির জন্য ভিবিও , তারপরে শেডারটি বর্গের প্রকৃত প্রস্থ এবং বিশ্বের স্থানাঙ্ক এবং রঙের তথ্য সরবরাহ করুন

শীতল, সহজ দেখাচ্ছে। আসুন একটি বৃত্তে সরানো যাক:

  • একটি বৃত্ত: ত্রিভুজ ফ্যান সহ ... এএইচ। কত নির্ভুলতা (ভার্টেক্সের সংখ্যা)? ছোট চেনাশোনাগুলির জন্য নির্ভুলতা অবশ্যই ছোট হতে হবে এবং বাগের চেনাশোনাগুলির জন্য নির্ভুলতা অবশ্যই বেশি হওয়া উচিত। স্পষ্টত 1 ভিবিও লোড করা সমস্ত ক্ষেত্রে সম্ভবত ফিট করে না। একটি বৃত্ত বড় হওয়ার জন্য পুনরায় আকার দেওয়ার কারণে যদি আমাকে নির্ভুলতা যুক্ত করতে হয় তবে কী হবে?

কম শীতল। আসুন সামান্য কিছু সহজ, একটি আয়তক্ষেত্র:

  • একটি আয়তক্ষেত্র: এএইচ। কোনও "সাধারণ আয়তক্ষেত্র জ্যামিতি" নেই। আপনার কেবল প্রস্থ / উচ্চতার অনুপাত রয়েছে এবং এটি তবে এটির আকার পরিবর্তন হলে প্রতিটি আয়তক্ষেত্রটি সম্ভবত আলাদা।

আপনি দেখতে পাচ্ছেন, জিনিসগুলি সেখান থেকে উতরাইয়ের দিকে। বিশেষত জটিল বহুভুজ এবং কী নয় not

কোড নীতি নেই: পি

আমার কেবল ধারণাটির একটি ওভারভিউ দরকার, কোনও কোডের দরকার নেই, বিশেষত সি বা সি ++ কোড। কেবল স্টাফের মতো বলুন: "এই ভার্টেক্সের ডেটা দিয়ে একটি ভিবিও তৈরি করুন এবং তারপরে এটি আবদ্ধ করুন," "।


আমি মনে করি আপনি যা জিজ্ঞাসা করছেন তা আমি বুঝতে পেরেছি তবে আপনি এই প্রশ্নটিকে আরও কিছুটা দিকনির্দেশ দিতে চাইতে পারেন। কী জিজ্ঞাসা করা হচ্ছে এটি কিছুটা অস্পষ্ট - যা আসলে একটি ঘনিষ্ঠ কারণ।
লাইসোল

@ আইদানমুয়েলার আপনার অর্থ কী তা আমি নিশ্চিত নই, তবে আপনি যদি প্রয়োজন বোধ করেন তবে আরও বেশি দিকনির্দেশনা দিতে নির্দ্বিধায়
জুতো

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

@ আইদানমুয়েলার সেই প্রসঙ্গে নয়, আমি বিশ্বাস করি। এটিতে "আপনার মূল প্রশ্নটি মনে হচ্ছে ..." এবং তারপরে সে / সে আমার পোস্ট করা প্রশ্নের উদ্ধৃতি দেয়। যা বাস্তবে ইঙ্গিত দেয় যে এটি উদ্ধৃত করার পক্ষে যথেষ্ট স্পষ্ট। এছাড়াও বাক্যাংশটি ইঙ্গিত করে যে আমার প্রশ্নটি অস্পষ্ট নয়, বরং এটি একটি মূল প্রশ্ন এবং অন্য একটি গৌণ প্রশ্ন রয়েছে (যা হ'ল: আমি যে নির্দিষ্ট ক্ষেত্রে উপস্থাপন করেছি তার সমাধান কী)। আমি আমার বর্তমান প্রশ্নটির সাথে সমস্যাটি সত্যিই দেখতে পাচ্ছি না এবং আপাতদৃষ্টিতে উত্তরদাতারাও তা করিনি কারণ আমি উভয় উত্তর খুব দরকারী এবং পয়েন্ট পেয়েছি।
জুতো

আপনি একটি খণ্ড শেডার দিয়ে একটি সুনির্দিষ্ট বৃত্ত আঁকতে পারেন।
ব্যবহারকারী 253751

উত্তর:


5

আপনার মূল প্রশ্নটি মনে হচ্ছে:

আধুনিক ওপেনলএল দিয়ে জ্যামিতি পরিবর্তন করে ঘন ঘন (সত্যিকারের ঘন ঘন, মূলত প্রতিটি ফ্রেম) আঁকার সর্বোত্তম উপায় কী হবে?

বেশিরভাগ উপায়ে, 2 ডি এবং 3 ডি ওপেনজিএলের মধ্যে কোনও বড় পার্থক্য নেই। গ্রাফিক্স পাইপলাইনে রয়েছে একটি অতিরিক্ত স্থানাঙ্ক, জেড, যা 2 ডি তে তত বেশি ব্যবহৃত হবে না, তবে এটি প্রায়।

প্রতিটি ড্রতে জ্যামিতি পরিবর্তন করার কয়েকটি উপায় রয়েছে।

  • আপনি প্রতিটি ফ্রেমে নতুন সিপিইউ-সরবরাহিত ভার্টেক্সকে ধাক্কা দিতে পারেন। ( বাফারগুলি পুনরায় ব্যবহারের বিষয়ে কিছু নোটের জন্য /programming/14155615/opengl-updating-vertex-buffer-with-glbufferdata দেখুন )

  • আপনি একটি বিদ্যমান বাফারের বিভিন্ন অংশ সহ আঁকতে পারেন glDrawArrays(mode, first, count)। অ্যানিমেশনটি যদি লুপ হয়ে যায়, তবে আপনি একটি বড় বাফারে বিভিন্ন ভার্টেক্স তালিকার সাহায্যে প্রাক্পম্পিউটেড ফ্রেমগুলি রাখতে পারেন এবং প্রতিটি ফ্রেমের বাফারের উপযুক্ত অংশটি আঁকতে পারেন।

  • আপনি ইউনিফর্ম অ্যারে বা একটি টেক্সচারের মতো কিছু অন্যান্য ডেটা দিয়ে ভারটেক্স তালিকাকে প্রভাবিত করতে পারেন। আপনার ভার্টেক্স শ্যাডারে, এই ডেটাটি পড়ুন এবং এটি যথাযথভাবে প্রয়োগ করুন। এগুলি জিপিইউতে ডেটা উপস্থাপনের জন্য কেবল অন্যান্য আইডিয়া, এবং সম্ভবত কার্য সম্পাদনের ক্ষেত্রে খুব বেশি পার্থক্য থাকবে না।

  • আপনার যদি একই জ্যামিতির অনেকগুলি উদাহরণ রয়েছে (সম্ভবত বৈশিষ্ট্য দ্বারা প্রভাবিত), তবে glDrawElementsInstanced() হতে পারে

  • আপনি ভার্টেক্স, জ্যামিতি বা টেসলেসেশন শেডারে উল্টোপথটি তালিকার অ্যালগোরিদমকে প্রভাবিত করতে পারেন। অ্যানিমেশনটি যদি গাণিতিকভাবে বর্ণনা করা যায় তবে আপনি একই ভার্টেক্স তালিকাটি রাখতে সক্ষম হবেন এবং প্রতিটি ফ্রেমের জন্য কয়েকটি কয়েকটি শেডার ইউনিফর্ম পরিবর্তন করতে পারবেন।

এবং সম্ভবত আপনার অ্যানিমেশনটি সিপিইউ দ্বারা পিক্সেল দ্বারা পিক্সেল দ্বারা সম্পন্ন সমস্ত অ্যানিমেশন বা ডিস্ক থেকে প্রেরিত পূর্বে বিশুদ্ধ টেক্সচার হিসাবে প্রকাশ করা যেতে পারে।

মোট কথা, আমি বলব, "কম্পিউটারগুলি দ্রুত, এটি আপনার পক্ষে সবচেয়ে সহজ পদ্ধতিতে কাজ করুন, যা সম্ভবত প্রতিটি ফ্রেমে নতুন করে সিপিই-তৈরি ভার্টেক্সগুলি সেট করে Then তারপরে দেখুন, এটি যথেষ্ট ভাল কিনা the ব্যাটারি / সিপিইউ ব্যবহারের প্রোফাইল দিন প্রথম, মেমরির পদচিহ্ন দ্বিতীয়। "

আপনার অন্য প্রশ্ন প্যারাফ্রেসড, "বৃত্ত এবং আয়তক্ষেত্র আঁকতে ভাল উপায় কী?"

চেনাশোনা।

  • টেসলেসেশন শেডার (বা জ্যামিতি শেডার) দিয়ে আপনি নিজের জ্যামিতিটিকে গতিশীল করতে পারেন।

  • আপনি স্কোয়ারগুলি আঁকতে পারেন এবং আপনার খণ্ডের শেডারে ব্যাসার্ধের মধ্যে কেবল অস্বচ্ছ (আলফা = 1.0), এবং ব্যাসার্ধের বাইরে স্বচ্ছ (আলফা = 0.0)। তারপরে এটি প্রতিবার পিক্সেল নিখুঁত। (আপনার বর্গক্ষেত্রের অক্ষগুলি -1 থেকে +1 করুন এবং টুকরো টুকরো টুকরো টুকরো এর মতো কিছু করুন outColor.a = dot(coord.xy, coord.xy) < 1.0 ? 1.0 : 0.0;the

  • আপনি কেবল 120 ​​ত্রিভুজের পাখা বলতে পারেন। সম্ভবত যথেষ্ট ভাল।

আয়তক্ষেত্র।

  • আমি মনে করি আপনি নিজের প্রশ্নের উত্তর দিয়েছেন, সেই একটিতে। আপনি যা পরামর্শ দিচ্ছেন তা ঠিক কাজ করবে!

খণ্ড-শেদার / ব্যাসার্ধটি বেশ ঝরঝরে, ধন্যবাদ। আমার নিজের প্রশ্নের উত্তর দেওয়ার সাথে সাথে, আমি মনে করি না আপনি কী বলতে চাইছেন তা আমি বুঝতে পেরেছি।
জুতো

ওহ, ঠিক যেমন একটি বর্গক্ষেত্রের মতো, আপনি প্রস্থটি নিয়ন্ত্রণের জন্য উল্লেখ করেছেন (ইউনিফর্ম সহ, আমি ধরে নিই), এবং আপনি লিখেছেন, "আপনার কেবল প্রস্থ / উচ্চতার অনুপাত আছে এবং এটিই তবে প্রতিটি আয়তক্ষেত্রটি আকার পরিবর্তন হলে সম্ভবত আলাদা" । সুতরাং, একটি আয়তক্ষেত্রের জন্য, বর্গক্ষেত্রের মতোই করুন তবে আপনার 3 (x, y, w) এর পরিবর্তে 4 টি মান (x, y, w, h) প্রয়োজন হবে। অথবা চারটি ইউনিফর্ম হিসাবে (এক্সলো, এক্সএইচইং, ইয়েলো, ইয়েহি) পাস করুন। আপনার (0,0) থেকে (1,1) ইনপুট দিয়ে, ভার্টেক্স শ্যাডারের যা প্রয়োজন তা করার জন্য এটি যথেষ্ট।
ডেভিড ভ্যান

ওহ, আমি দেখতে পাচ্ছি
জুতো

ফিক্স ফাংশন পাইপলাইন থেকে GL_TRIANGLE_FAN এর মতো আধুনিক জিএল-এ কি কোনও স্বয়ংক্রিয় ফ্যান রয়েছে?
জন পি

5

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

1) স্কোয়ার এবং আয়তক্ষেত্রগুলি বেশ সহজ। আমার কাছে একটি ভিবিওতে মাত্র 1x1 বাক্স রয়েছে যা আমি সমস্ত কিছু ঝাপসা করার জন্য ব্যবহার করি। আমি এই "ইউনিট বাক্স" এর সাথে শেডারে এমভিপি ম্যাট্রিকগুলি পাস করেছি এবং বাক্সটিকে সঠিক মাত্রায় স্কেল করতে আমি এটি অতিরিক্ত স্কেলিংয়ের সাথে একত্রিত করেছি - আপনারা জানেন যে আপনার আলাদা x এবং y স্কেল থাকতে পারে।

আমার উদ্দেশ্যগুলির জন্য, আমি "ইউনিট বাক্স" ব্যবহার করে 2D স্প্রাইটকে ব্লিট করার জন্য কোনও ধরণের কণা ইঞ্জিনে সরিয়ে নিয়ে যাওয়ার কথা ভাবছিলাম, তবে এটি অন্য গল্প।

2) আমি চেনাশোনাগুলির সাথে খুব বেশি কাজ করি না, আমি কেবল নির্দিষ্ট সংখ্যার কোণে স্থির ভিবিও ব্যবহার করি use তবে আমি কল্পনা করতে পারি যে আমি বৃত্তের জন্য টানা উল্লম্ব সংখ্যাগুলিকে প্রভাবিত করতে কিছুটা প্রসারিত টুইট করতে পারি।

শ্যাডার বৈশিষ্ট্যগুলির সাথে ভিবিও ডেটা সংযোগ করার সময়, আমি glVertexAttribPointer ব্যবহার করি। আন্তঃবাহিত ডেটা (যা আমি ব্যবহার করি) এর জন্য এটি ব্যবহার করতে বোঝাতে স্ট্রাইড প্যারামিটার রয়েছে। তবে এটি এটির মতো ব্যবহার করা সম্ভব হতে পারে:

glVertexAttribPointer(..., n * sizeof(VERTEX_DATA), ...);

... বাফার থেকে প্রতিটি নবম প্রান্তকে বাছাই করা, এভাবে বৃত্তের জন্য টানা উল্লম্বের সংখ্যাকে প্রভাবিত করে। আমি বৃত্তের জন্য টানা ভার্টেক্সের সংখ্যাকে প্রভাবিত করে বিভিন্ন ধাপের সাথে একই ভিবিও সমেত বেশ কয়েকটি ভিএও তৈরি করতে পারি। আমি এটা চেষ্টা করে দেখিনি, ভেবেছি।

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

http://www.quelsolaar.com/opengl_performance.txt

আশা করি এটি আপনাকে আপনার দিকনির্দেশনা ডিজাইন করতে এবং সিদ্ধান্ত নিতে কিছুটা সহায়তা করবে।


2
"বৃত্তের জন্য অঙ্কিত উল্লম্বের সংখ্যাগুলিকে প্রভাবিত করতে স্ট্রাইড টুইটিং" সুপার দুর্দান্ত!
ডেভিড ভ্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.