একটি সাধারণ কণা প্রভাব তৈরির দ্রুততম উপায়


12

আমি সত্যিই সাধারণ কণা প্রভাব তৈরির দ্রুততম পন্থায় সন্ধান করছি যা খেলায় নরকের মতো স্প্যামযুক্ত হবে ...

মূলত, আমার খেলাটি ভেক্টরেক্স গেমের মতো দেখাচ্ছে, বেশিরভাগ লাইনে তৈরি ... আমি কিছু ছোট বিস্ফোরণ তৈরি করতে চাই যা সত্যিই সাধারণ হবে।

কিছু পয়েন্ট ঘুরে বেড়ানো এবং জিএল_পয়েন্টের সাথে রেন্ডারিংয়ের চেয়ে আরও দ্রুত কিছু আছে?


কেবল ভেক্টরেক্স রেফারেন্সের জন্য +1। আমি 80 এর দশকের শুরুর দিকে ছোটবেলায় স্ক্র্যাম্বেল এবং টেম্পেস্টে কিছু মজার সময় ব্যয় করি। তা না হলে আমি সম্ভবত আজ গেম ডেভেলপার হিসাবে শেষ করতে পারতাম না।
কাইলোটন

হ্যাঁ, টেম্পেস্ট দুর্দান্ত: ডি
স্পিডার

আমি কীভাবে বলি যে কোনওটিই সঠিক নয়?
স্পিডার

উত্তর:


13

প্রতিটি কণার জন্য মেমরি সঞ্চয় করার প্রয়োজন নেই এবং প্রতিটি কণাকে আলাদাভাবে অ্যানিমেট করার দরকার নেই। ক্লাসিক পদার্থবিজ্ঞানের সমীকরণটি ব্যবহার করে অঙ্কনের সময় কণার অবস্থানটি পুনর্গঠন করে আপনি প্রক্রিয়াগতভাবে এটি করতে পারেন। s = ut + 1 / 2.at ^ 2

একটি সাধারণ উদাহরণ (কণার ধ্রুবক ত্বরণ ছাড়াই):


void drawExplosion(ExplosionParameters& s)
{
  Random rng;
  rng.seed(s.startSeed);
  glBegin(GL_POINTS);
  for (int i = 0; i < s.numParticles; i++)
  {
    vec3 vel = rng.getRandomVector(-1.0f, 1.0f) * s.explosionSpeed;
    float timeBias = rng.getRandom(0, s.particleTimeBias);
    vec3 pos = s.explosionCentre + (vel * (s.timeElapsed + timeBias));
    glPoint3fv(&pos);
  }
  glEnd();
}

তারপরে আপনি কেবল আপনার আপডেট লুপের প্রতিটি পুনরাবৃত্তিতে s.TimeElapsed বৃদ্ধি করেন।

এটি আপনার সিপিইউকে কোনও কাজ না করা থেকে মুক্ত করে জিপিইউতে প্রয়োগ করাও পুরোপুরি জবাবদিহি। একটি জিপিইউ বাস্তবায়ন এর মতো দেখতে পারে:

void drawExplosion(ExplosionParameters& s)
{
    //bind Vertex Shader If Not Already Bound();
    ...
    // bindVertexBuffer of Zeroes If Not AlreadyBound();
    glVertexPointer(...)
    //uploadShaderUniformsForExplosion(s);
    glUniform3f(...)
    ...
    glDrawArrays(GL_POINTS, 0, s.numParticles);
} 

জিপিইউ ভার্টেক্স শ্যাডার তারপরে পদার্থবিজ্ঞানের সমীকরণের মাধ্যমে কণার অবস্থানটি পুনর্গঠন করে এবং ইউনিফর্ম / ধ্রুবকগুলি এতে চলে যায় - ঠিক যেমন সিপিইউ সংস্করণটি করেছিল।

কিছু বৈকল্পিকতা যুক্ত করতে, আপনি সামান্য বিচ্ছিন্ন পরামিতি, রঙ / আলফা অ্যানিমেট করে, পৃথক পৃথক অবস্থানগুলি বেছে নিয়ে আরও একযোগে বিস্ফোরণগুলি ব্যবহার করতে পারেন। প্রভৃতি


এছাড়াও, আপনি সমস্ত কণার প্রাথমিক ভেক্টর তৈরি করতে সিউডো এলোমেলো সংখ্যার পূর্বাভাসটি ব্যবহার করতে পারেন, কয়েক ইনট এর মূল্য মূল্য থেকে শত শত কণা তৈরি করে। কোয়াড তৈরি করতে জিপিইউ ব্যবহার করা সহজ কণার জন্য সত্যই একটি ভাল ধারণা।
স্কিজে

কয়েক বছর ধরে আমি ক্লাসের অ্যারেগুলি দিয়ে কণার সিস্টেমগুলিকে theতিহ্যবাহী উপায়ে তৈরি করে চলেছি যা কণাকে আধা-বুদ্ধিমান সত্তা হিসাবে বিবেচনা করে এবং এটি সর্বদা অপ্রয়োজনীয় এবং স্ফীত মনে হয় seemed এই উপায়টি বেসিক কণাগুলির জন্য অনেক ভাল যা স্ক্রিন জুড়ে স্কো ছাড়া আর কিছুই করে না।
পিকু

7

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

প্রভাবটি সত্যিই দুর্দান্ত (এটি দেখতে কোনও জ্যামিতির যুদ্ধের ভিডিও দেখুন) এবং খুব দ্রুত। কোয়াডস থেকে ক্রেপ কিক আউট (বিশেষত কারণ কোয়াডস আমাকে দ্বিগুণ পরিমাণে ভার্টেক্সেস গণনা করা প্রয়োজন)

এছাড়াও, এটি ইতিমধ্যে সম্পন্ন কণা সিস্টেম ব্যবহার করার চেয়ে ভাল, কারণ আমি একটি নির্দিষ্ট এবং দ্রুত প্রভাব চেয়েছিলাম, কণা সিস্টেমগুলি সাধারণত প্রচুর বৈশিষ্ট্য সমর্থন করে, আনুপাতিক পরিমাণে ওভারহেড সহ।


2
আপনি কী করছেন তা ব্যাখ্যা করার জন্য +1, যদিও আমি আপনার পরীক্ষাগুলিতে আরও বিশদ শুনতে আগ্রহী। =)

বিটিডব্লিউ: এগুলি সবই তাত্ক্ষণিক মোডে ছিল (এটিই কেবলমাত্র আমি কোড করতে জানি এবং আমি গতকাল নামটি শিখেছি ...)
স্পিডার

6

সাধারণত আমি মনে করি আপনি টেক্সচার-ম্যাপযুক্ত কোয়াডস হিসাবে কণা করবেন। এগুলিকে মূলত 2D স্প্রাইট হিসাবে বিবেচনা করুন এবং সময়ের সাথে তাদের বিবর্ণ করুন, অদৃশ্য হলে তাদের ধ্বংস করুন। আরও ভাল, আপনি যখন নতুন তৈরি করেন তখন পুরানোগুলি পুনরায় ব্যবহার করুন যাতে আপনি এই জিনিসগুলির জন্য মেমরি ছাড়ে না।

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


হাম ... পয়েন্টগুলি টেক্সচারের চেয়ে দ্রুত নয়?
স্পিডার

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

কিসের মত? মনে মনে আমি একটি পূর্ণ বৈশিষ্ট্যযুক্ত কণা সিস্টেম তৈরি করছি না, এটি কেবলমাত্র একটি নির্দিষ্ট প্রভাব (ছোট বিস্ফোরণ, বেশিরভাগ গেমপ্লে প্রতিক্রিয়ার জন্য যা আপনি কিছু আঘাত করেন)
স্পিডার

আপনি যদি কেবল পয়েন্ট বা লাইন ব্যবহার করতে চান তবে তা ঠিক আছে। কণার জন্য বেশিরভাগ লোকেরা কী করে তা আমি কেবল মন্তব্য করতে পারি। সম্ভবত একটি পরিপূর্ণ ত্রিভুজ একটি দুর্দান্ত কণা তৈরি করবে।
কাইলোটন

4

ওপেনগিএল ইএস ২.০, একটি এক্সটেনশনের সাথে ইএস 1.X এবং ওপেনএলএল>> ২.১ সহ, আপনি জিএল_পোইন_এসপিআরটি ব্যবহার করতে পারেন। GL_POINT_SPRITES ক্যামেরার সামনে সর্বদা কোয়াডের মতো।

খণ্ড ছায়া গো, আপনি করতে পারেন:

  • ভার্টেক্স শ্যাডারে গ্লোপয়েন্টিন্ট সাইজের সাথে স্প্রাইটের আকার নির্ধারণ করুন
  • বিভাজন শেডারে gl_PPointCoord (uv স্থানাঙ্ক) ব্যবহার করুন

আপনি বল স্প্রিট আঁকার জন্য আলফা দিয়ে টেক্সচার ব্যবহার করতে পারেন ...

পয়েন্ট স্প্রিটসের জন্য একটি টিউটোরিয়াল


আমি এক্সটেনশানগুলি এড়িয়ে চলেছি, ইঞ্জিন (যেটি আমি তৈরি করি নি) ইতিমধ্যে ব্যবহার করে এমন মূর্খতাগুলি বেশ কয়েকটি লোকের পক্ষে যথেষ্ট বয়সের অভিযোগ, গেমটি চালাচ্ছে না ...
স্পিডার

1

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


1
সত্য, তবে তিনি ভেক্টরেক্স স্টাইলের জন্য লক্ষ্য রেখেছিলেন, এটি সেখানে কম ভাল কাজ করবে।
কাজ

1
ঠিক কী কাজ বলেছিল ... তা অর্থহীন হবে এবং ডাউনলোডের আকার বাড়বে (আমি স্প্রিট থেকে সত্য ভেক্টরগুলিতে সর্বাধিক গ্রাফিকগুলি স্যুইচ করছি, তাই আমি ফাইলাইজ হ্রাস করতে পারি)
স্পিডার

1

কণার স্প্যানিং / মুছা / হালনাগাদ পরিচালনা করার জন্য খুব অল্প উপায়ের জন্য, ধরে নেওয়া আপনার কণার একটি সহজ অ্যারে রয়েছে - কণা [MAX_PARTICLES]:

সক্রিয় কণাগুলির উপর নজর রাখুন (NumActiveParticles = 0 দিয়ে শুরু)

অ্যারের শেষে সর্বদা নতুন কণা যুক্ত করা হয়:

pNewParticle = &Particles[NumActiveParticles++];

চতুর বিট - একটি 'মৃত' কণা অপসারণ করার সময় - এটি সর্বশেষ সক্রিয় কণা, এবং হ্রাস NumActiveParticles দিয়ে অদলবদল করুন:

if ( DeadParticle < NumActiveParticles-1 )
{
  Particles[ DeadParticle ] = Particles[ NumActiveParticles-1 ];
}
NumActiveParticles--;

এটি যখন স্প্যানিংয়ের সময় 'অব্যবহৃত কণাগুলি' অনুসন্ধান করতে অস্বীকার করে এবং কোনও ব্যবহার না করা থাকে তবে MAX_PARTICLES এর অ্যারের মাধ্যমে কোনও স্ক্যানিং এড়ানো যায়।

নোট করুন যে আপডেটটি / রেন্ডার অর্ডারটি গুরুত্বহীন হলে (যেমন কণা মুছার এই পদ্ধতিটি অ্যারেটিকে পুনরায় অর্ডার দেয়) তবে এটি কার্যকর হয়


-1

আমি ধরে নিচ্ছি দ্রুততম উপায়টি হল একটি কণা ইঞ্জিন অনুসন্ধান করা এবং এটি আপনার প্রভাবগুলির জন্য ব্যবহার করা। এখানে কয়েকটি দেওয়া হল:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.