ঠিক আছে, ধ্রুবক বাফারগুলি কীভাবে পাইপলাইন পর্যায়ে আবদ্ধ এবং আপডেট হয় তা উপলব্ধি করতে আমার বেশ কষ্ট হচ্ছে। আমি বুঝেছি যে ডাইরেক্টএক্স 11 -এর পর্যায়ে 15 পর্যন্ত শেডার-ধ্রুবক বাফার থাকতে পারে এবং প্রতিটি বাফার 4096 ধাপে ধাপে ধরে রাখতে পারে। তবে, আমি বুঝতে পারছি না যে আইডি 3 ডি 11 বাফার সিওএম ধ্রুবক বাফারের সাথে ইন্টারেক্ট করার জন্য ব্যবহৃত হয়েছিল তা এই বাফার স্লটগুলি পূরণ করার জন্য ব্যবহৃত একটি প্রক্রিয়া (বা হ্যান্ডেল) বা যদি বস্তুটি আসলে বাফার ডেটার একটি নির্দিষ্ট উদাহরণকে উল্লেখ করে যা সামনে এবং পিছনে ঠেলা যায় is জিপিইউ এবং সিপিইউ এর মধ্যে।
আমি মনে করি বিষয়টিতে আমার বিভ্রান্তি একটি সমস্যার কারণ যা আমি দুটি ভিন্ন ধ্রুবক বাফার ব্যবহার করছি।
এখানে কিছু উদাহরণ শ্যাডার কোড রয়েছে is
cbuffer PerFrame : register(b0) {
float4x4 view;
};
cbuffer PerObject : register(b1) {
float4x4 scale;
float4x4 rotation;
float4x4 translation;
};
আমার কোডটি যেভাবে সংগঠিত হয়েছে, ক্যামেরাটি প্রতি ফ্রেম ডেটা সম্পর্কিত প্রাসঙ্গিক আপডেটটি পরিচালনা করবে এবং গেমঅবজেক্টস তাদের নিজস্ব প্রতি বস্তুর ডেটা আপডেট করবে। উভয় শ্রেণীর নিজস্ব আইডি 3 ডি 11 বাফার রয়েছে যা এটি করতে ব্যবহৃত হয় (একটি হাব আর্কিটেকচার ব্যবহার করে, সুতরাং একটি গেমঅজেক্ট ক্লাস বিশ্বের সমস্ত ইনস্টল করা গেমঅবজেক্টের রেন্ডারিং পরিচালনা করবে)।
সমস্যাটি হ'ল আমি স্লটের উপর নির্ভর করে কেবল একবারে একটি আপডেট করতে পারি এবং আমি অনুমান করি যে আপডেটের ক্রমটি একটি বাফার পূরণ হয়ে যায় এবং অন্যটি শূন্য হয়ে যায়।
এটি মূলত আমার কোড। উভয় শ্রেণিতে অভিন্ন আপডেট যুক্তি ব্যবহার করা হয়।
static PerObjectShaderBuffer _updatedBuffer; // PerFrameShaderBuffer if Camera class
_updatedBuffer.scale = _rScale;
_updatedBuffer.rotation = _rRotation;
_updatedBuffer.translation = _rTranslation;
pDeviceContext->UpdateSubresource(pShaderBuffer, 0 , 0, &_updatedBuffer, 0, 0);
pDeviceContext->VSSetShader(pVShader->GetShaderPtr(), 0, 0);
pDeviceContext->PSSetShader(pPShader->GetShaderPtr(), 0, 0);
pDeviceContext->VSSetConstantBuffers(1, 1, &pShaderBuffer);
pDeviceContext->IASetVertexBuffers(0, 1, &pVertexBuffer, &vStride, &_offset );
pDeviceContext->IASetPrimitiveTopology(topologyType);
pDeviceContext->Draw(bufSize, 0);
আমার প্রধান প্রশ্নগুলি হ'ল -
- আপডেটসুব্রোসোর্স কল দিয়ে আপডেট করার জন্য আমার কি শেডারবাফার সেট বা বাঁধাই করা দরকার? (অর্থ যখন পাইপলাইনে থাকবে তখনই এটি হেরফের করবে) বা এটি কোনও ডেটা ব্লব যা ভিএসসেট কনস্ট্যান্টবাফার কল দিয়ে প্রেরণ করা হবে? (অর্থ ডেটা বাঁধাই ও আপডেট করার ক্রমের অর্থ হয় না, আমি পাইপলাইনে এটি আপডেট করতে পারি বা কোনওভাবে সিপিইউতে)
- বাফার সেট বা বাঁধাইয়ের সময়, পেরফ্রেম বাফার আপডেট করার জন্য আমার কি স্লট 0 রেফারেন্স করা দরকার এবং পেরোবজেক্ট বাফারটি আপডেট করার জন্য স্লট 1? আমার কোডে এই কলটির সাথে কোনও ধরণের বিভ্রান্তি কি সমস্ত বাফারগুলিকে ওভাররাইট করার কারণ হতে পারে?
- ডি 3 ডি 11 কীভাবে জানবে যে আমি আপডেট করতে বা মানচিত্রটি করতে চাই? এটি ID3D11Buffer COM ব্যবহৃত থেকে জানতে পারে?
সম্পাদনা করুন -
উপরের উদাহরণে ধ্রুব বাফার রেজিস্টার ট্যাগগুলি পরিবর্তন করা হয়েছে। (খ #) এর পরিবর্তে (সিবি #) ব্যবহার করা বাফারকে কোনও কারণে সঠিকভাবে আপডেট হতে প্রভাবিত করছে। আমি আসল সিনট্যাক্সটি কোথায় নিয়েছি বা এটি আদৌ বৈধ কিনা তা নিশ্চিত নয় তবে এটি আমার মূল সমস্যা বলে মনে হয়।