ওপেনগিএলে একটি রেন্ডারবাফার থেকে একটি টেক্সচার পাচ্ছেন?


13

আমি একটি এফবিওতে একটি রেন্ডারবুফার (ডিপথস্টেনসিল) পেয়েছি এবং এটি থেকে আমার একটি টেক্সচার পাওয়া দরকার। আমার এফবিওতে একটি ডিপথ কম্পোনেন্ট টেক্সচার এবং ডিপথস্টেনসিল রেন্ডারবাফার উভয়ই থাকতে পারে না বলে মনে হয়, তাই পাইপলাইনের পরে ব্যবহারের জন্য আমি এর সাথে সম্পন্ন করার পরে রেন্ডারবফারকে একটি ডিপথকম্পোন্ট টেক্সচারে রূপান্তর করার জন্য আমার কিছু উপায় প্রয়োজন।

আমি সপ্তাহের জন্য রেন্ডারবফার থেকে গভীরতার উপাদানটি ধরতে প্রচুর কৌশল চেষ্টা করেছি তবে আমি সর্বদা আবর্জনা নিয়ে বেরিয়ে আসি। আমি শেষে যা চাই তা হ'ল যদি আমি কোনও রেন্ডারবফার ব্যবহার না করে থাকি তবে আমি কোনও এফবিও থেকে পেয়ে যাব। এই আপাতদৃষ্টিতে সহজ অপারেশনটিকে কভার করে এমন কোনও বিস্তৃত নির্দেশ বা কোড পোস্ট করতে পারেন কেউ?

সম্পাদনা করুন:

কোডটির একটি এক্সট্র্যাক্ট সংস্করণে লিঙ্কযুক্ত http://dl.rodbox.com/u/9279501/fbo.cs

ক্ষেত্রের প্রভাবের গভীরতার স্ক্রিনি + এফবিও - গভীরতা ছাড়াই (!) Http://i.stack.imgur.com/Hj9Oe.jpg

মাঠের প্রভাবের গভীরতা ছাড়াই স্ক্রিন + এফবিও - গভীরতার সাথে কাজ করছে http://i.stack.imgur.com/boOm1.jpg

উত্তর:


2

পর্যায়ক্রমে, আপনি কেবল একটি FBO থেকে অন্যটিতে ব্লিট করতে পারেন, যেমন একটি রেন্ডারবু্ফার-ভিত্তিক এক থেকে টেক্সচার ভিত্তিক কোনওটিতে। আমি এটি এইভাবে করি:

glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_renderBufferSurface->m_fbo);
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_textureSurface->m_fbo);
glBlitFramebufferEXT(0, 0, m_renderBufferSurface->m_width, m_renderBufferSurface->m_height, 0, 0, m_textureSurface->m_width, m_textureSurface->m_height, GL_COLOR_BUFFER_BIT, GL_NEAREST);

(আপনার ক্ষেত্রে যেখানে আপনি গভীরতা বাফার করতে চান সেখানে আপনি GL_COLOR_BUFFER_BIT এর পরিবর্তে GL_DEPTH_BUFFER_BIT ব্যবহার করতে পারেন)

টেক্সচার-ভিত্তিক রেন্ডারবুফারে ব্লিট করার পরে, আপনি টেক্সচারটি স্বাভাবিক হিসাবে ব্যবহার করতে পারেন; এটি ইউনিফর্ম হিসাবে শেডারে বা যা আপনার পছন্দ মত পাস করা।


1

না, এটা সম্ভব নয়। সর্বাধিক আপনি সিপিইউতে ডেটা glReadPixels করতে পারেন এবং এর একটি টেক্সচার তৈরি করতে পারেন তবে এটি জটিল এবং ধীর হবে। রেন্ডারবার্ফারগুলি এর জন্য বোঝানো হয় না, এই কার্যকারিতাটি কেবল টেক্সচারের মাধ্যমে সরবরাহ করা হয়।


যে দেওয়া, বিকল্প কি? আপনি কীভাবে আপনার অঙ্কন বাফারটিতে গভীরতা বজায় রাখতে পারেন এবং একটি টেক্সচার হিসাবে গভীরতা উপাদানও অর্জন করতে পারেন?
রাশিও

@ রাশিয়ো: স্টেনসিল বাফার থেকে মুক্তি পাওয়ার (যদি সম্ভব হয়!) একটি বিকল্প হতে পারে এবং গভীরতা রেন্ডারবফারকে গভীরতার জমিনে পরিণত করে। কেন আপনি স্টেনসিল ব্যবহার করছেন?
Calvin1602

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

@ ক্যালভিন ১60০২ যখন আমি রেন্ডারব্ফারের সাথে ছড়িয়ে পড়ছিলাম তখন আমি দেখতে পেলাম যে স্টেনসিল সংযুক্তি ছাড়াই গভীরতা সংযুক্তি ব্যবহার করা অনাকাঙ্ক্ষিত ফলাফল এনেছে।
রাশিও

@ রাশিয়ো আমি বাজি ধরেছি আপনি টেক্সচারটি সঠিকভাবে স্থাপন করছেন না, পোস্টিং কোডটি আমাদের সহায়তা করার অনুমতি দেবে :)
মাতিয়াস ভালডেনেগ্রো

1

আপনি যা জিজ্ঞাসা করছেন তা ওপেনজিএল 3.2 এ সম্ভব। আমি আমার এফবিওকে একটি রঙের টেক্সচারে ছড়িয়ে রঙের ছিটকে পেয়েছি, অন্য রঙের টেক্সচারের জন্য নরমাল এবং গভীরতার টেক্সচারে গভীরতা - কোনও রেন্ডারবুফার দরকার নেই। প্রকৃতপক্ষে রেন্ডারবুফারগুলি কেবল একটি সমস্যা, কারণ আপনি সেগুলি থেকে নমুনা নিতে পারবেন না, তাই আপনাকে glReadPixels(...)জিপিইউ মেমরির সমস্ত কিছু বজায় রাখার পরিবর্তে আরবিওর বাইরে এবং সিপিইউতে একটি টেক্সট ব্যবহার করতে হবে বা অন্যভাবে কোনওভাবে অনুলিপি করতে হবে। তাই ...

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

আমার গভীরতার টেক্সচার সেটআপ কোডটি দেখতে দেখতে (জাভা, কেবল বাইটবফার স্টাফটিকে উপেক্ষা করুন ... এবং নোট করুন যে আমি "আইডি" ব্যবহার করি পূর্ণসংখ্যার হ্যান্ডলগুলি / পয়েন্টারগুলিকে উল্লেখ করার জন্য, যেহেতু সেই ধারণাটি জাভাতে ভালভাবে বসে না):

        gBufferDepthTexture = new Texture();
        gBufferDepthTexture.id = glGenTextures();
        gBufferDepthTexture.unit = 2;
        gBufferDepthTexture.width = Display.getWidth();
        gBufferDepthTexture.height = Display.getHeight();
        gBufferDepthTexture.bytes = ByteBuffer.allocateDirect(Display.getWidth()*Display.getHeight() * 4);
        glActiveTexture(gBufferDepthTexture.unit + GL_TEXTURE0); //eg. 0 + 33984 = GL_TEXTURE0, while 31 + 33984 = GL_TEXTURE31.
        glBindTexture(GL_TEXTURE_2D, gBufferDepthTexture.id);

        glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, gBufferDepthTexture.width, gBufferDepthTexture.height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, gBufferDepthTexture.bytes);
        //...GL_UNSIGNED_INT or GL_UNSIGNED_BYTE may work better for you, instead... YMMV.

        //glPixelStorei(GL_PACK_ALIGNMENT, 4);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

এবং পরে:

        glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
        //your existing glFramebufferTexture2D(...) calls here
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);

আপনি এখন gBufferDepthTextureআপনার দ্বিতীয়, তৃতীয় পাস খণ্ড শেডারে ইউনিফর্ম হিসাবে (বা আপনার কী আছে) পাস করতে পারেন । আমি মনে করি আমরা নিরাপদে ধরে নিতে পারি যে আপনি স্টেনসিল বাফার দিয়ে ঠিক একই জিনিসটি করতে পারেন।


0

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

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


সমস্যাটি তখন কোনও জমিনে GL_DEPTH_STENCIL উপাদান ক্যাপচার করছে না, তবে আপনি যখনই এটি করেন তখন সমস্ত গভীরতার তথ্য FBO এ হারিয়ে যায়। এফবিও তখন দৃশ্যের সাথে ড্র বাফারটি সরবরাহ করার জন্য অকেজো হয়ে যায়। তাই আমি এই সমস্যাটিকে বাইপাস করার আশায় একটি রেন্ডারবার্ফার ব্যবহার করছি। আমি মনে করি এখন আমি কোন বিকল্প কিন্তু দুই পাস গভীরতা দখল + + তথ্য আলাদাভাবে আঁকা করতে = (ব্যয়বহুল হিসাবে জাহান্নাম পর্যন্ত আমি এর চারপাশে একটি উপায় খুঁজে বের করতে পারেন।
Rushyo

@ রাশিয়ো আমি এই প্রাচীন প্রশ্নের উত্তর পোস্ট করেছি :) আপনি সম্ভবত একবার দেখতে চাইবেন, যদিও আপনি সম্ভবত কয়েক বছর আগে সমাধান করেছেন solved
ইঞ্জিনিয়ার

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