هل يمكنني استخدام صورة رمادية مع وظيفة برنامج OpenGL glTexImage2D؟
سؤال
ولدي الملمس التي لديها سوى 1 قناة كما انها صورة رمادية. عندما أمرر بكسل في لglTexImage2D، فإنه يخرج الأحمر. (من الواضح لقناة 1 حمراء، RGB)
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
dicomImage->GetColumns(), dicomImage->GetRows(),
0, GL_RGBA, GL_UNSIGNED_BYTE, pixelArrayPtr);
هل يمكنني تغيير GL_RGBA؟ إذا كان الأمر كذلك، ماذا؟
المحلول
وتغييره إلى GL_LUMINANCE. انظر http://www.opengl.org/ وثائق / المواصفات / man_pages / رقيا / GL / أتش تي أم أل / GL / teximage2d.html
نصائح أخرى
ويبدو أنني يجب أن تستخدم GL_LUMINANCE
بدلا من GL_RGBA
الوسيطة 3RD.
تحرير (ردا على تعليق):
عند I تعيين الوسيطة 7th ل GL_LUMINANCE
(وكذلك 3)، فإن الصورة يذهب مشوهة تماما. مع شكل DICOM بكسل، يبدو أن حجة 7TH يجب GL_RGBA
لسبب ما.
والسلوك الغريب لأنني باستخدام معيار DICOM . القارئ DICOM معين أستخدمه مخرجات صحيح القيم بكسل (كما قد تتجاوز القيم بكسل الحد الأقصى الطبيعي 255). لسبب غريب مزيج من قول برنامج OpenGL أن أستخدمه شكل RGBA، ولكن يمر في القيم صحيحة المقدمة صورة مثالية.
ولأنني كنت اقتطاع القيم بكسل DICOM> 255 على أي حال، يبدو من المنطقي لنسخ القيم في لمجموعة GLbyte. ومع ذلك، بعد القيام بذلك، وهو SIGSEGV (خطأ تجزئة) وقعت عندما تدعو glTexImage2D
. تغيير المعلمة 7th ل GL_LUMINANCE
(كما هو مطلوب عادة) عاد وظيفة إلى وضعها الطبيعي.
وغربة إيه؟
وهكذا، مذكرة إلى جميع المطورين باستخدام شكل صورة DICOM: أنت في حاجة لتحويل مجموعة عدد صحيح إلى صفيف حرف قبل تمريرها إلى glTexImage2D
، أو مجرد تعيين الوسيطة 7th ل GL_RGBA
(في وقت لاحق وربما لا مستحسن).
وفي FragmentShader، يمكنك كتابة:
uniform sampler2D A;
vec3 result = vec3(texture(A, TexCoord).r);
في ملف حزب الشعب الكمبودي، يمكنك كتابة:
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RED,
dicomImage->GetColumns(), dicomImage->GetRows(),
0, GL_RED, GL_UNSIGNED_BYTE, pixelArrayPtr);