문제

16 비트 범위의 탐지기 장치에서 나오는 과학적 이미지 데이터가 있으며 이미지에서 렌더링됩니다. 이 데이터를 표시하기 위해서는 OpenGL을 사용하고 있습니다. 라이브러리의 일부로 Ushorts를 지원해야하기 때문입니다. 이 데이터를 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);
        }
도움이 되었습니까?

해결책

텍스처를 만들 경우 glteximage의 'type'매개 변수는 OpenGL에 의해 자체 형식으로 변환되기 전에 텍스처 데이터가있는 데이터 유형 일뿐입니다. 채널 당 16 비트의 텍스처를 만들려면 GL_LUMINANCE16과 같은 형식으로 형식이 필요합니다 (내부 형식은 GL_LUMINANCE가 남아 있음). OpenGL 1.4 용 GL_LUMINANCE16이없는 경우 GL_EXT_TEXTURE를 사용할 수 있는지 확인하고 GL_LUMINANCE16_EXT로 사용해보십시오.

이 중 하나는 작동해야합니다. 그러나 그렇지 않은 경우 16 비트 값을 GL_LUMINANCE_ALPHA와 함께 2 개의 8 비트 쌍으로 인코딩하여 셰이더 내에서 다시 해독 할 수 있습니다.

다른 팁

나는 채널 당 8 비트보다 깊이 (더 깊은) 일을 한 적이 없지만 여기에 내가 시도한 내용은 다음과 같습니다.

텍스처에서 필터링을 끄고 출력에 어떤 영향을 미치는지 확인하십시오.

텍스처링 글 린트를 최상의 품질로 설정하십시오.

하나를 통해 단일 채널 플로팅 포인트 텍스처를 사용하는 것을 고려할 수 있습니다. GL_ARB_texture_float, GL_ATI_texture_float 또는 GL_NV_float_buffer 확장 하드웨어가 지원하는 경우 GL 1.4에 플로팅 포인트 텍스처가 있는지 여부를 기억할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top