2012-01-30 15 views
5

मैं अपने Geforce 330M पर CUDA टूलकिट 4.0 के साथ बनावट के लिए ओपनसीएल-ओपनजीएल इंटरऑप का प्रयास कर रहा हूं।सीएल/जीएल-इंटरऑप के लिए गलत ओपनजीएल बनावट प्रारूप प्रकार?

मैं एक फ्रेम कैप्चर करना चाहता हूं, एक इनपुट छवि (Image2D) के रूप में उस डेटा का उपयोग ओपनसीएल कर्नेल में करें। कर्नेल को डेटा में हेरफेर करना चाहिए और उसे Image2DGL पर लिखना चाहिए, जो एक संलग्न ओपनजीएल बनावट वाला एक छवि ऑब्जेक्ट है। मूल रूप से यह है कि जैसा दिखता है:

_______________  RGB  _______________ 
|    | uint8*  |    | CL_RGBA/CL_UNORM_INT8 
| Grabber  | ------------> | Image2D  | -------------------------. 
| avcodec  |    | [input]  |       | 
|_______________|    |_______________|       | 
                      |  
                      V 
_______________     _______________      _______________ 
|    |    |    |      |    | 
| Texture  | ------------> | Image2DGL | <-----------------> | Kernel  | 
|_______________|    | [output] |      |_______________| 
           |_______________| 
Internal 
Format: GL_RGBA 
Format: GL_RGBA 
Type: ? 

मैं उस तरह बनावट आरंभ कर रहा हूँ:

GLuint tex = 0; 

void initTexture(int width, int height) 
{ 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_RECTANGLE, tex); 
// now here is where I need assistance: The type parameter of the Texture (GL_FLOAT) 
    glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, NULL); 
} 


संपादित करें: मैं भी GL_UNSIGNED_INT का एक प्रकार हो सकता है।

texMems.push_back(Image2DGL(clw->context, CL_MEM_READ_WRITE, GL_TEXTURE_RECTANGLE, 0, tex, &err)); 

तो मैं स्रोत छवि (इनपुट छवि) बनाने:

ImageFormat format; 
format.image_channel_data_type = CL_UNORM_INT8; 
format.image_channel_order = CL_RGBA; 
srcImgBuffer = Image2D(clw->context, CL_MEM_READ_WRITE, format, width, height, 0, NULL, &err); 

हर में प्रस्तुत पाश मैं लिख रहा हूँ


तब मैं साझा किए गए चित्र (Image2DGL) बनाने srcImgBuffer में डेटा:

// write the frame to the image buffer 
clw->queue.enqueueWriteImage(srcImgBuffer, CL_TRUE, origin, region, 0, 0, (void*)data, NULL, NULL); 

इसके अलावा, मैं कर्नेल के लिए बहस की स्थापना कर रहा हूँ:

tex_kernel.setArg(0, texMems[0]); 
tex_kernel.setArg(1, srcImgBuffer); 
tex_kernel.setArg(2, width); 
tex_kernel.setArg(3, height); 

पहले और बाद में मैं प्राप्त और जीएल वस्तुओं जारी है। परीक्षण गिरी कि तरह लग रहा है:

__kernel void init_texture_kernel(__write_only image2d_t out, __read_only image2d_t in, int w, int h) 
{ 
    const sampler_t smp = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; 

    int2 coords = { get_global_id(0), get_global_id(1) }; 
    float4 pixel = read_imagef(in, smp, coords); 
    float4 test = { (float)coords.x/(float)w , 0, 0, 1}; 
    write_imagef(out, coords, pixel); 
} 

image_channel_data_type कर्नेल में नाव के रूप में पढ़ा जा सकता है और सामान्यीकृत मान के रूप में व्याख्या की है। आउटपुट छवि सही नहीं लगती है, मुझे स्पष्ट रूप से गलत डेटा व्याख्या के कारण एक कटा हुआ चित्र (linewise) मिला है। जैसा कि मैंने उल्लेख किया है कि मुझे लगता है कि त्रुटि बनावट के प्रकार के प्रारंभ में है। मैंने GL_FLOAT की कोशिश की (जैसा कि मैं कर्नेल में छवि के लिए फ्लोट के रूप में लिख रहा हूं)।

Results: Image as PPM dump from the decoder (left), Texture output scattered (right)

बाईं एक विकोडक के बाहर एक PPM है, सही क्या मैं अपने उत्पादन बनावट पर वापस हो रही है है।

यदि कोई वास्तव में यहां तक ​​पढ़ता है: क्या आपके पास इस मुद्दे को हल करने के लिए बनावट के प्रकार के बारे में सुझाव हैं?


संपादित करें: अगर मैं सीधे बनावट के लिए कब्जा कर लिया फ्रेम बाँध, वीडियो ठीक निभाता है। तो यह किसी भी तरह सीएल-जीएल इंटरफ़ेस से संबंधित होना चाहिए।


+0

क्या छवि 2 डीजीएल ने एक त्रुटि वापस की? और क्या होता है यदि आप एक आयताकार बनावट के बजाय नियमित 2 डी बनावट का उपयोग करते हैं? –

+0

नहीं, Image2DGL से कोई त्रुटि नहीं। मैंने पहले 2 डी की कोशिश की, बनावट कॉर्ड को सामान्यीकृत किया और मैग/मिन फ़िल्टर के साथ-साथ रैप भी सेट किया, लेकिन उसके बाद कोई आउटपुट नहीं था। – rdoubleui

उत्तर

1

मैं अंत में समाधान के साथ आया था, स्पष्ट नहीं देख रहे हैं। मेरे पास एक आरजीबी वीडियो था। मैंने इसलिए आरजीबी में फ्रेम पर कब्जा कर लिया। यह एक बनावट पर ठीक से प्रदर्शित किया जा सकता है। हालांकि, अगर कोई एक बार बफर से float4 पकड़ता है (जैसा कि कर्नेल कोड में देखा गया है) जहां केवल तीन चैनल मौजूद हैं, तो यह निश्चित रूप से इसे गड़बड़ कर रहा है। अरे।

मैं भी लाइन गिनती देखकर अपनी गलती ग्रहण कर सकता था: मुझे 512 लाइनों में से 384 लाइनों का अनुरोध किया गया था, जो अच्छी तरह से .75 के अनुपात तक आता है।

मैंने बस आरजीबीए को पकड़ने के लिए अपने हथियार (libavcodec का उपयोग करके) की मांग की और यह मेरे लिए चार चैनल वाली तस्वीर रखने के लिए पैड करेगा।

मैं इस प्रश्न को बंद करने के लिए ध्वजांकित करूंगा।

2

मुझे विश्वास है कि यदि glTexture2D करने के लिए अपने अंतिम तर्क शून्य है, तो प्रारूप और प्रकार तर्क कर सकते हैं किसी भी मान्य ओपन प्रारूप/प्रकार - लेकिन वे उपयोग नहीं किया जाता और कुछ भी प्रभावित नहीं करती।आप चल बिन्दु बनावट के लिए चाहते हैं, तो आप इसे सही internal_format तर्क पारित करके उल्लेख करना होगा:

glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL); 
+0

मैं समझ सकता हूं कि आपका क्या मतलब है, हालांकि मेरा स्रोत डेटा यूंट 8 टाइप है और मैं बनावट के लिए एक संवाद प्रकार की तलाश में हूं। मैं वास्तव में कोई 8 बिट डेटा प्रकार नहीं देख सकता। – rdoubleui

+0

यदि मैं शुरुआत में एक बार बनावट को प्रारंभ नहीं करता हूं, तो मुझे कोई आउटपुट नहीं दिखाई दे रहा है, इसलिए मैं इसे लेता हूं कि मुझे इसकी आवश्यकता है। हालांकि मुझे 'GL_RGBA8' या' GL_RGBA32F' हो सकता है, ऐसा कोई फर्क नहीं पड़ता है। मुझे समझ में नहीं आता – rdoubleui

+0

glTexImage2D के लिए 7 वें और 8 वें तर्क में अंतिम प्रारूप में कौन सा स्वरूप और प्रकार डेटा पारित किया गया है, यह निर्दिष्ट करता है। यदि आप glTexImage2D पर कोई डेटा नहीं पारित करते हैं तो इन दो तर्कों में मान कुछ भी प्रभावित नहीं करते हैं। –

संबंधित मुद्दे