سؤال

ولدي بعض بيانات الصورة العلمية التي يخرج من جهاز كاشف في مجموعة 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 لديها العائمة القوام نقطة أم لا بالرغم من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top