我正在构建一个包含各种文本和图像元素的视图.
我想在视图中显示一些文本,其背后是文本的模糊副本,但不仅仅是文本阴影.
如何将高斯模糊文本应用于UIImage或图层?
看看Apple的GLImageProcessing iPhone示例.除其他外,它做了一些模糊.
相关代码包括:
static void blur(V2fT2f *quad, float t) // t = 1 { GLint tex; V2fT2f tmpquad[4]; float offw = t / Input.wide; float offh = t / Input.high; int i; glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex); // Three pass small blur, using rotated pattern to sample 17 texels: // // .\/.. // ./\\/ // \/X/\ rotated samples filter across texel corners // /\\/. // ../\. // Pass one: center nearest sample glVertexPointer (2, GL_FLOAT, sizeof(V2fT2f), &quad[0].x); glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &quad[0].s); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glColor4f(1.0/5, 1.0/5, 1.0/5, 1.0); validateTexEnv(); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Pass two: accumulate two rotated linear samples glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); for (i = 0; i < 4; i++) { tmpquad[i].x = quad[i].s + 1.5 * offw; tmpquad[i].y = quad[i].t + 0.5 * offh; tmpquad[i].s = quad[i].s - 1.5 * offw; tmpquad[i].t = quad[i].t - 0.5 * offh; } glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &tmpquad[0].x); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_2D); glClientActiveTexture(GL_TEXTURE1); glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &tmpquad[0].s); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glBindTexture(GL_TEXTURE_2D, tex); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_PRIMARY_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR); glColor4f(0.5, 0.5, 0.5, 2.0/5); validateTexEnv(); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Pass three: accumulate two rotated linear samples for (i = 0; i < 4; i++) { tmpquad[i].x = quad[i].s - 0.5 * offw; tmpquad[i].y = quad[i].t + 1.5 * offh; tmpquad[i].s = quad[i].s + 0.5 * offw; tmpquad[i].t = quad[i].t - 1.5 * offh; } glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // Restore state glDisableClientState(GL_TEXTURE_COORD_ARRAY); glClientActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Half.texID); glDisable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); glActiveTexture(GL_TEXTURE0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glDisable(GL_BLEND); }