gpt4 book ai didi

c# - 通过 Tao/C# 的 OpenGl 16 位显示

转载 作者:太空宇宙 更新时间:2023-11-03 14:37:17 27 4
gpt4 key购买 nike

我有一些科学图像数据,这些数据来自 16 位范围内的检测器设备,然后在图像中呈现。为了显示这些数据,我使用了 OpenGL,因为它应该支持 ushorts 作为库的一部分。我已经设法将这些数据放入 OpenGL 1.4 平台上的纹理渲染中,这是该项目要求的限制。

不幸的是,生成的纹理看起来像是被缩减为 8 位,而不是 16 位。我通过生成渐变图像并显示它来测试它;虽然图像本身的每个像素都与其相邻像素不同,但显示的纹理显示条纹图案,其中所有相邻的像素都显示为相等的值。

我已经尝试使用 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);
}

最佳答案

如果您创建一个纹理,glTexImage 的“类型”参数只是您的纹理数据在被 OpenGL 转换为它自己的格式之前所处的数据类型。要创建每 channel 16 位的纹理,您需要像 GL_LUMINANCE16 这样的格式(内部格式仍然是 GL_LUMINANCE)。如果 OpenGL 1.4 没有 GL_LUMINANCE16,请检查 GL_EXT_texture 是否可用并尝试使用 GL_LUMINANCE16_EXT。

其中一个应该可以工作。但是,如果不是这样,您可以使用 GL_LUMINANCE_ALPHA 将 16 位值编码为两个 8 位对,然后在着色器中再次对其进行解码。

关于c# - 通过 Tao/C# 的 OpenGl 16 位显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/508448/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com