タオ/ C位を介しOpenGlの16ビット表示
-
21-08-2019 - |
質問
私は、画像にレンダリングされる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_float
、GL_ATI_texture_float
またはGL_NV_float_buffer
拡張子の1つを介して単一チャネル浮動小数点テクスチャを使用して検討することもできます。