بينغل عرض 16 بت عبر تاو / C #
-
21-08-2019 - |
سؤال
ولدي بعض بيانات الصورة العلمية التي يخرج من جهاز كاشف في مجموعة 16 بت التي ثم يحصل المقدمة في صورة ما. من أجل عرض هذه البيانات، وأنا أستخدم برنامج OpenGL، لأنه ينبغي أن تدعم ushorts كجزء من المكتبة. لقد تمكنت من الحصول على هذه البيانات إلى القوام تقديم على 1.4 منصة برنامج OpenGL، وهو الحد الذي هو شرط من هذا المشروع.
وللأسف، فإن القوام مما أدى تبدو وكأنها أنهم يتعرضون للانخفاض إلى 8 بت بدلا من 16 بت. I اختبار هذا عن طريق توليد صورة التدرج وعرضه. عندما تكون الصورة نفسها لديها كل بكسل مختلفة من جيرانها، والملمس عرض يظهر أنماط شريط حيث كل بكسل بجانب بعضها البعض تظهر حتى القيم كما متساوية.
ولقد حاولت القيام بذلك مع GlDrawPixels، والصورة الناتجة يبدو في الواقع وكأنه يجعل حقا كل 16 بت.
وكيف يمكنني فرض هذه القوام لعرض بشكل صحيح؟
لإعطاء مزيد من المعلومات الأساسية، وطرفية (جدول بحث) يتم تحديدها من قبل البرمجية التالية:
String str = "!!ARBfp1.0\n" +
"ATTRIB tex = fragment.texcoord[0];\n" +
"PARAM cbias = program.local[0];\n" +
"PARAM cscale = program.local[1];\n" +
"OUTPUT cout = result.color;\n" +
"TEMP tmp;\n" +
"TXP tmp, tex, texture[0], 2D;\n" +
"SUB tmp, tmp, cbias;\n" +
"MUL cout, tmp, cscale;\n" +
"END";
Gl.glEnable(Gl.GL_FRAGMENT_PROGRAM_ARB);
Gl.glGenProgramsARB(1, out mFragProg);
Gl.glBindProgramARB(Gl.GL_FRAGMENT_PROGRAM_ARB, mFragProg);
System.Text.Encoding ascii = System.Text.Encoding.ASCII;
Byte[] encodedBytes = ascii.GetBytes(str);
Gl.glProgramStringARB(Gl.GL_FRAGMENT_PROGRAM_ARB, Gl.GL_PROGRAM_FORMAT_ASCII_ARB,
count, encodedBytes);
GetGLError("Shader");
Gl.glDisable(Gl.GL_FRAGMENT_PROGRAM_ARB);
وأين cbias وcScale ما بين 0 و 1.
وشكرا!
وتحرير: للرد على بعض الأسئلة الأخرى، وتمشيا مع glTexImage:
Gl.glBindTexture(Gl.GL_TEXTURE_2D, inTexData.TexName);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_LUMINANCE, inTexData.TexWidth, inTexData.TexHeight,
0, Gl.GL_LUMINANCE, Gl.GL_UNSIGNED_SHORT, theTexBuffer);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR); // Linear Filtering
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR); // Linear Filtering
theTexBuffer = null;
GC.Collect();
GC.WaitForPendingFinalizers();
ويتم تعيين تنسيق بكسل عند تهيئة السياق:
Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR();// The pixel format descriptor
pfd.nSize = (short)Marshal.SizeOf(pfd); // Size of the pixel format descriptor
pfd.nVersion = 1; // Version number (always 1)
pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW | // Format must support windowed mode
Gdi.PFD_SUPPORT_OPENGL | // Format must support OpenGL
Gdi.PFD_DOUBLEBUFFER; // Must support double buffering
pfd.iPixelType = (byte)Gdi.PFD_TYPE_RGBA; // Request an RGBA format
pfd.cColorBits = (byte)colorBits; // Select our color depth
pfd.cRedBits = 0; // Individual color bits ignored
pfd.cRedShift = 0;
pfd.cGreenBits = 0;
pfd.cGreenShift = 0;
pfd.cBlueBits = 0;
pfd.cBlueShift = 0;
pfd.cAlphaBits = 0; // No alpha buffer
pfd.cAlphaShift = 0; // Alpha shift bit ignored
pfd.cAccumBits = 0; // Accumulation buffer
pfd.cAccumRedBits = 0; // Individual accumulation bits ignored
pfd.cAccumGreenBits = 0;
pfd.cAccumBlueBits = 0;
pfd.cAccumAlphaBits = 0;
pfd.cDepthBits = 16; // Z-buffer (depth buffer)
pfd.cStencilBits = 0; // No stencil buffer
pfd.cAuxBuffers = 0; // No auxiliary buffer
pfd.iLayerType = (byte)Gdi.PFD_MAIN_PLANE; // Main drawing layer
pfd.bReserved = 0; // Reserved
pfd.dwLayerMask = 0; // Layer masks ignored
pfd.dwVisibleMask = 0;
pfd.dwDamageMask = 0;
pixelFormat = Gdi.ChoosePixelFormat(mDC, ref pfd); // Attempt to find an appropriate pixel format
if (!Gdi.SetPixelFormat(mDC, pixelFormat, ref pfd))
{ // Are we not able to set the pixel format?
BigMessageBox.ShowMessage("Can not set the chosen PixelFormat. Chosen PixelFormat was " + pixelFormat + ".");
Environment.Exit(-1);
}
المحلول
إذا خلق نسيج من 'نوع' المعلمة من glTexImage ليست سوى نوع البيانات البيانات الملمس الخاص بك هو في قبل يتم تحويلها عن طريق برنامج OpenGL في شكل خاص بها. لخلق نسيج مع 16 بت لكل قناة تحتاج شيء من هذا القبيل GL_LUMINANCE16 كما شكل (لا يزال التنسيق الداخلي GL_LUMINANCE). اذا لم يكن هناك GL_LUMINANCE16 ل OpenGL 1.4 الاختيار إذا GL_EXT_texture هو متاح، وحاول مع GL_LUMINANCE16_EXT.
واحدة من هذه يجب أن تعمل. ولكن إذا كان لا يمكنك تشفير القيم بدورك 16 عن اثنين من أزواج 8 بت مع GL_LUMINANCE_ALPHA وترجم ذلك مرة أخرى داخل تظليل.
نصائح أخرى
ولم يسبق لي ان عملت في أعماق أعلى (أعمق) من 8bit لكل قناة، ولكن هنا ما كنت أول محاولة:
وإيقاف التصفية على الملمس ونرى كيف يؤثر على الانتاج.
وglHints مجموعة التركيب لأفضل نوعية.
هل يمكن النظر في استخدام قناة واحدة العائمة الملمس نقطة من خلال واحدة من GL_ARB_texture_float
، GL_ATI_texture_float
أو GL_NV_float_buffer
ملحقات إذا كان الجهاز يدعم ذلك، وأنا لا أذكر إذا GL 1.4 لديها العائمة القوام نقطة أم لا بالرغم من ذلك.