Теперь я уверен, что после нескольких часов ударов это не может быть сделано.
На данный момент это мой код (НИЖЕ) для рендеринга в текстуру;это делает работу, но очень расточительно.Мне нужен только один 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();
}