मैं अपने 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 की कोशिश की (जैसा कि मैं कर्नेल में छवि के लिए फ्लोट के रूप में लिख रहा हूं)।
बाईं एक विकोडक के बाहर एक PPM
है, सही क्या मैं अपने उत्पादन बनावट पर वापस हो रही है है।
यदि कोई वास्तव में यहां तक पढ़ता है: क्या आपके पास इस मुद्दे को हल करने के लिए बनावट के प्रकार के बारे में सुझाव हैं?
संपादित करें: अगर मैं सीधे बनावट के लिए कब्जा कर लिया फ्रेम बाँध, वीडियो ठीक निभाता है। तो यह किसी भी तरह सीएल-जीएल इंटरफ़ेस से संबंधित होना चाहिए।
क्या छवि 2 डीजीएल ने एक त्रुटि वापस की? और क्या होता है यदि आप एक आयताकार बनावट के बजाय नियमित 2 डी बनावट का उपयोग करते हैं? –
नहीं, Image2DGL से कोई त्रुटि नहीं। मैंने पहले 2 डी की कोशिश की, बनावट कॉर्ड को सामान्यीकृत किया और मैग/मिन फ़िल्टर के साथ-साथ रैप भी सेट किया, लेकिन उसके बाद कोई आउटपुट नहीं था। – rdoubleui