質問

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

残念ながら、結果のテクスチャは、彼らが8ビットではなく、16ビットに縮小されているように見えます。 Iは、勾配画像を生成し、それを表示することによってこれをテスト。画像自体がその隣接異なる各画素を有している、表示テクスチャは次相互にすべてのピクセルが同じような値を示しているストライプのパターンを示している。

私は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の間である。

ありがとうございます。

EDITは:他のいくつかの質問に答えるために、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_EXT_textureが利用可能であり、GL_LUMINANCE16_EXTでそれをしようとした場合のOpenGL 1.4のチェックにはGL_LUMINANCE16がない場合ます。

これらの一つが動作するはずです。しかし、それはあなたがGL_LUMINANCE_ALPHAを持つ2つの8ビットのペアとしてあなたの16ビット値をエンコードして、シェーダ内で再びそれをデコードすることができていない場合ます。

他のヒント

私は、チャネルあたり8ビットよりも高い(深い)深さで働いていませんが、ここで私が最初に試してみたものです決してきます:

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

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

あなたは、ハードウェアがサポートしている場合GL 1.4ががポイントテクスチャをフローティングにするかしていない場合、私は思い出すことができないGL_ARB_texture_floatGL_ATI_texture_floatまたはGL_NV_float_buffer拡張子の1つを介して単一チャネル浮動小数点テクスチャを使用して検討することもできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top