Now I am sure that after several hours of beating this cannot be done.
This is my code so far (BELOW) for rendering the texture; he does his job, but very wasteful. I need only one 8-bit channel, maybe a 16-bit shade of gray. I do not want useless RG and B channels.
But if I try to switch GL_RGBA / * GL_ALPHA * / to glTexImage2D, glCheckFramebufferStatus will catch the error "frame buffer uncomplete": 36054 0x8CD6 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
The IRC guys suggest GL_R, but Xcode doesn't offer autocomplete for this, so it looks like this is one of those things that were cropped from GL to GLES
but it seems really strange! This is a mobile device. Of course, something that reduces by four times the number of bits needed to complete the operation ... of course, this will be one of the last things to be done.
?!?
Can anyone bury this for good? Is it possible to display texture on one channel in 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' // http://stackoverflow.com/questions/3613889/gl-framebuffer-incomplete-attachment-when-trying-to-attach-texture // 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(); }