iOS: как визуализировать текстуру канала в GLES2 - PullRequest
6 голосов
/ 20 мая 2011

Теперь я уверен, что после нескольких часов ударов это не может быть сделано.

На данный момент это мой код (НИЖЕ) для рендеринга в текстуру;это делает работу, но очень расточительно.Мне нужен только один 8-битный канал, возможно, 16-битная шкала серого.Мне не нужны бесполезные каналы RG и B.

Но если я попытаюсь переключить GL_RGBA / * GL_ALPHA * / в glTexImage2D, glCheckFramebufferStatus перехватывает ошибку «буфер кадра неполон»: 36054 0x8CD6 GL_FRAMEBUFFER_INCOMPLET

ребята из IRC предлагают GL_R, но Xcode не предлагает автозаполнение для этого, так что, похоже, это одна из тех вещей, которые были исключены из GL для GLES

, но это кажется странным!это мобильное устройство.Конечно, что-то, что уменьшает в четыре раза количество битов, необходимых для выполнения операции ... конечно, это будет одна из последних вещей, которые нужно извлечь.

?!?

можетКто-нибудь окончательно похоронит это?Возможно ли рендерить на одноканальную текстуру в GLES2.0?

+ (void)  blurTexture: (GLuint)     in_texId
             POTWidth: (GLuint)     in_W
            POTHeight: (GLuint)     in_H
       returningTexId: (GLuint*)    out_pTexId
{
    // search HELP: 'Using a Framebuffer Object as a Texture'
    // /2549206/glframebufferincompleteattachment-pri-popytke-prikrepit-teksturu

    // Create the destination texture, and attach it to the framebuffer’s color attachment point.

    // create the texture
    GLuint id_texDest;
    {
        // fragshader will use 0 
        glActiveTexture( GL_TEXTURE0 );

        // Ask GL to give us a texture-ID for us to use
        glGenTextures( 1, & id_texDest );
        glBindTexture( GL_TEXTURE_2D, id_texDest );


        // actually allocate memory for this texture
        GLuint pixCount = in_W * in_H;

        typedef struct { uint8_t r, g, b, a } rgba;

        rgba * alphas = calloc( pixCount, sizeof( rgba ) );

        // XOR texture
        int pix=0;
        for ( int x = 0;  x < in_W;  x++ )
        {
            for ( int y = 0;  y < in_H;  y++ )
            {
                //alphas[ pix ].r = (y < 256) ? x^y : 0;
                //alphas[ pix ].g = (y < 512) ? 127 : 0;
                //alphas[ pix ].b = (y < 768) ? 127 : 0;
                alphas[ pix ].a = (y < 512) ? x^y : 0; // half mottled, half black

                pix++;
            }
        }

        // set some params on the ACTIVE texture
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR/*_MIPMAP_LINEAR*/  );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );

        // WRITE/COPY from P into active texture  
        glTexImage2D( GL_TEXTURE_2D, 0,
                     GL_RGBA /*GL_ALPHA*/, in_W, in_H, 0, 
                     GL_RGBA /*GL_ALPHA*/, 
                     GL_UNSIGNED_BYTE, 
                     (void *) alphas );

        //glGenerateMipmap( GL_TEXTURE_2D );

        free( alphas );

        glLogAndFlushErrors();

    }


    GLuint textureFrameBuffer;
    {
        GLint oldFBO;
        glGetIntegerv( GL_FRAMEBUFFER_BINDING, & oldFBO );

        // create framebuffer
        glGenFramebuffers( 1, & textureFrameBuffer );
        glBindFramebuffer( GL_FRAMEBUFFER, textureFrameBuffer );

        // attach renderbuffer
        glFramebufferTexture2D( GL_FRAMEBUFFER, 
                               GL_COLOR_ATTACHMENT0, 
                               GL_TEXTURE_2D, 
                               id_texDest, 
                               0 );

        //glDisable( GL_DEPTH_TEST );

        // Test the framebuffer for completeness. This test only needs to be performed when the framebuffer’s configuration changes.
        GLenum status = glCheckFramebufferStatus( GL_FRAMEBUFFER ) ;
        NSAssert1( status == GL_FRAMEBUFFER_COMPLETE, @"failed to make complete framebuffer object %x", status );

        // 36054  0x8CD6  GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

        // unbind frame buffer
        glBindFramebuffer( GL_FRAMEBUFFER, oldFBO );
    }




    glLogAndFlushErrors();

    // clear texture bitmap to backcolor
    {
        GLint oldFBO;
        glGetIntegerv( GL_FRAMEBUFFER_BINDING, & oldFBO );

        glBindFramebuffer( GL_FRAMEBUFFER, textureFrameBuffer );
        glLogAndFlushErrors();

        {
            float j = 0.1f;
            glClearColor( j, j, j, j );
            glLogAndFlushErrors();
            glClear( GL_COLOR_BUFFER_BIT );
            glLogAndFlushErrors();
        }

        glBindFramebuffer( GL_FRAMEBUFFER, oldFBO );
    }

    glDeleteFramebuffers( 1, & textureFrameBuffer );

    * out_pTexId = id_texDest;

    glLogAndFlushErrors();
}

Ответы [ 2 ]

7 голосов
/ 31 октября 2012

Начиная с iOS 5.0, вы можете визуализировать как 1, так и 2 канальные текстуры, используя GL_EXT_texture_rg.

http://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_rg.txt

http://developer.apple.com/library/ios/#releasenotes/General/WhatsNewIniPhoneOS/Articles/iOS5.html#//apple_ref/doc/uid/TP30915195-SW47

Редактировать: я тестировалэто и работает, но только на A5 и выше (iPad2 / 3/4 / mini, iPhone4S / 5, iPod touch 5-го поколения).К сожалению, он недоступен на A4 и старше, где это необходимо больше всего (iPhone4, iPod touch 4-го поколения, 3GS, iPad1).

4 голосов
/ 22 мая 2011

Нет, OpenGL ES 2.0 не имеет визуализируемых 1-канальных форматов текстур.GL_ALPHA и GL_LUMINANCE не воспроизводимы, поэтому они бесполезны для RTT.

...