আমি কেন একটি পুল প্যাক করে একটি ডি 3 ডি ধ্রুবক বাফারে সংযুক্ত করতে পারি না?


9

ঠিক আছে, আমি একটি বড় প্যাক পেয়ে একটি hlsl ধ্রুবক বাফারের সাথে সংযুক্ত হয়েছি এবং আমি কেন নিশ্চিত তা জানি না।

এইচএলএসএল-এ বাফারটি এখানে

cbuffer MaterialBuffer : register(b1) {
    float3 materialDiffuseAlbedo;
    float  materialSpecularExponent;
    float3 materialSpecularAlbedo;
    bool isTextured;
};

এবং এখানে এটি সি ++ এ রয়েছে

struct GeometryBufferPass_MaterialBuffer {
    XMFLOAT3 diffuse;
    float specularExponent;
    XMFLOAT3 specular;
    bool isTextured;
};

আমি কোনও প্রকার ভাগ্য ছাড়াই বুল সরিয়ে এবং স্ট্রাক্টকে প্যাডিং করার চেষ্টা করেছি। এটি করার সঠিক উপায় কী?


এটি কী কারণে সমস্যা সৃষ্টি করছে?
MichaelHouse

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

অন্যান্য মূল্যবোধ কাজ করে কিন্তু বুল হয় না? আপনি কী ছায়ার জন্য উপলব্ধ ডিবাগারগুলির মধ্যে একটি ব্যবহার করার চেষ্টা করেছেন তাতে কী লাগছে?
MichaelHouse

2
একটি মানচিত্রে bool মান সংরক্ষণ করার চেষ্টা করুন। সত্য হিসাবে 1 এবং মিথ্যা হিসাবে 0 সংরক্ষণ করুন। কেবল পরীক্ষার জন্য, এবং এছাড়াও, একটি বুল হ'ল সি ++ তে 1 বাইট হয় ...
গুস্তাভো ম্যাকিয়েল

3
একটি বুলের আকার বাস্তবায়ন নির্ভর। কিছু প্ল্যাটফর্মে এটি কোনও আকারের সমান হয়। stackoverflow.com/questions/5067492/…
তেত্রাদ

উত্তর:


9

দক্ষতার জন্য, ধ্রুবক বাফারগুলি ম্যাপ করা হবে যাতে মানগুলি জিপিইউ নিবন্ধগুলিতে বিভক্ত হয় না । প্রতিটি নিবন্ধক চারটি আকারের ফ্লোট (16 বাইট) তাই ধ্রুবক বাফার কাঠামোগুলি অবশ্যই এটির GPU এর একাধিক হতে হবে। আপনার সি ++ কাঠামোটি সেই অনুযায়ী প্যাড করা উচিত যদি আপনি ডেটা ম্যাপিংয়ের সুবিধার্থে এটি ব্যবহার করতে চান (এটি, নোট, সর্বদা ভাল স্কেল করে না)।

আপনার সমস্যাটি হ'ল, এইচএলএসএল বুলেটিয়ানটি চার বাইট, তবে সিপিইউয়ের দিকের একটি বাইট (আপনার নির্দিষ্ট প্রয়োগে)। এটি আপনার সি ++ কাঠামোটি সঠিকভাবে প্রান্তিককরণের জন্য সৃষ্টি করে: একটি বুলিয়ান মানের (0 বা 1 যে বিষয়টি বিবেচনা করে) এর উল্লেখযোগ্য বিটটি মানটির সর্বনিম্ন-স্বাক্ষর বাইটে সংরক্ষণ করা হবে, এবং যেহেতু আকারগুলি স্থানটি একমত করে না মেমরির এই বাইটটির কাঠামোর সিপিইউ এবং জিপিইউ সংস্করণে পৃথক হবে।

উপযুক্ত প্যাডিংটি ম্যানুয়ালি properোকানো এবং যথাযথ 16-বাইট প্রান্তিককরণ নিশ্চিত করা, বা কেবল একটি যথাযথ আকারের টাইপ যেমন একটি পূর্ণসংখ্যার মতো ব্যবহার করা উচিত, সমস্যাটি ঠিক করা উচিত। এই থ্রেডটি আপনার পক্ষেও কার্যকর হতে পারে কারণ এটিতে প্রায় একই সমস্যার আরও গভীর-আলোচনা রয়েছে।


1
আমি অনুসরণ করি না: " isTexturedসেই একই নিবন্ধের সাথে খাপ খায় যেহেতু এটি পরেরটিতে প্রবেশ করতে হবে Thus সুতরাং এটি পরবর্তী নিবন্ধে পুরোপুরিভাবে গুঁড়িয়ে গেছে" " দ্বিতীয় নিবন্ধটি specularপ্রথম তিনটি উপাদান এবং isTexturedসর্বশেষে গঠিত, তাই আমি কী দেখতে পাচ্ছি না যে পরবর্তী রেজিস্টারে কোনও কিছুর দরকার? 1-বাইট বনাম 4-বাইট বাল দৈর্ঘ্যের স্পষ্টতই গুরুত্বপূর্ণ, তবে উভয়ই specularএকই রেজিস্টারে ফিট হবে ।
নাথান রেড

আপনি সঠিক; আমি নিজেকে নিবন্ধের আকারের তুলনায় আকারের বিপরীতে বিভ্রান্ত করেছিলাম এবং ম্যাপিংয়ের একটি ভুল উপস্থাপনা নিয়ে এসেছি। মেমরিতে প্রাসঙ্গিক বাইটের একমাত্র সমস্যা। আমি আমার উত্তর অনুসারে সমন্বয় করেছি।

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

3

ঠিক আছে, কিছু পড়েছেন এবং লক্ষ্য করেছেন যে এইচএলএসএল বুলটি মূলত একটি 32 বিট পূর্ণসংখ্যা। সুতরাং আমি আমার সমস্যা সমাধানের জন্য কেবলমাত্র সি ++ স্ট্রাক্টের একটি ইনট ব্যবহার করেছি।

struct GeometryBufferPass_MaterialBuffer {
    XMFLOAT3 diffuse;
    float specularExponent;
    XMFLOAT3 specular;
    int isTextured;
};

আপনি বুলের ধরণটি রাখেন না কেন কেবল সংকলক পাশের ইনট ব্যবহার করেন? শুধু শব্দার্থিক রাখা।
গুস্তাভো ম্যাকিয়েল

হ্যাঁ, এটি আমি উপরে করছি। স্ট্রাক্ট সিপিইউ পাশের জন্য একটি পূর্ণসংখ্যা এবং ধ্রুবক বাফার জিপিইউ পাশের জন্য একটি বুল ব্যবহার করুন।
ক্লাজনিকভকিড

0

বিশেষত একাধিক আইটেমের জন্য এন্ডিয়ানগুলির জন্য ভাসা, বুল এবং ইনট প্রয়োজনীয় লাইন আপ করার প্রয়োজন নেই।

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

আমি লাইটিং টাইপের জন্য টাইপ ইন্টের একটি অ্যারের যোগ করার সময় অবশ্যই করেছি।

আমি খুঁজে পাওয়া সবচেয়ে সহজ উপায়টি হল XM প্রকারের সাথে লেগে থাকা যা 16 দ্বারা প্রান্তিক হয়, যার জন্য নষ্ট উপাদান / বাইট প্রয়োজন হতে পারে তবে আপনার জন্য এন্ডিয়ান সাজান। EG XMINT4 এবং স্রেফ আপনার মূল্যের জন্য প্রথম উপাদান .x ব্যবহার করেছেন, বা আপনার যদি প্রয়োজন হয় তবে অন্য উপাদানগুলি অন্য উদ্দেশ্যে ব্যবহার করুন তবে এর অর্থ খারাপ নামকরণ (মন্তব্য করতে ভুলবেন না)। দ্রষ্টব্য: এক্সএমআইএনটি 2 অ্যারেটি লজিকাল ক্রমের বাইরেও থাকবে

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