2

16 ビット範囲の検出器デバイスから出てくる科学的な画像データがあり、それが画像にレンダリングされます。このデータを表示するために、ライブラリの一部として ushorts をサポートする必要があるため、OpenGL を使用しています。このデータを OpenGL 1.4 プラットフォームでレンダリングするテクスチャに入れることができました。これは、このプロジェクトの要件である制限です。

残念ながら、結果のテクスチャは 16 ビットではなく 8 ビットに削減されているように見えます。これをテストするには、グラデーション イメージを生成して表示します。画像自体は隣接するピクセルとは異なる各ピクセルを持っていますが、表示されたテクスチャは縞模様を示しており、隣り合うすべてのピクセルが等しい値として表示されています。

GlDrawPixels でこれを試してみましたが、結果の画像は、実際には 16 ビットすべてを実際にレンダリングしているように見えます。

これらのテクスチャを適切に表示するにはどうすればよいですか?

背景を詳しく説明すると、LUT (ルックアップ テーブル) は次のコードによって決定されます。

        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);
        }
4

3 に答える 3

1

テクスチャを作成する場合、glTexImageの「type」パラメータは、OpenGLによって独自の形式に変換される前のテクスチャデータのデータ型のみです。チャネルあたり16ビットのテクスチャを作成するには、フォーマットとしてGL_LUMINANCE16のようなものが必要です(内部フォーマットはGL_LUMINANCEのままです)。OpenGL 1.4のGL_LUMINANCE16がない場合は、GL_EXT_textureが使用可能かどうかを確認し、GL_LUMINANCE16_EXTで試してください。

これらの1つが機能するはずです。ただし、そうでない場合は、16ビット値をGL_LUMINANCE_ALPHAを使用して2つの8ビットペアとしてエンコードし、シェーダー内で再度デコードすることができます。

于 2009-02-03T22:47:36.917 に答える
0

GL_ARB_texture_floatハードウェアがサポートしている場合は、GL_ATI_texture_floatまたは拡張機能のいずれかを介して単一チャネルの浮動小数点テクスチャを使用することを検討できますがGL_NV_float_buffer、GL 1.4 に浮動小数点テクスチャがあるかどうかは思い出せません。

于 2009-02-04T08:39:01.373 に答える
0

チャンネルあたり 8 ビットよりも高い (より深い) 深さで作業したことはありませんが、最初に試すことは次のとおりです。

テクスチャのフィルタリングをオフにして、出力にどのように影響するかを確認します。

テクスチャリング glHints を最高の品質に設定します。

于 2009-02-03T22:37:57.623 に答える