【发布时间】:2016-02-18 08:19:09
【问题描述】:
-
说明
- 我在android中使用OpenGL es 2.0和glsl shader来做高斯模糊效果。
- 如果没有 alpha 通道,它可以正常工作,但是当我有 png 的 alpha 通道时,结果会变得太暗,它会是相同的链接:http://www.jhlabs.com/ip/premultiplied_blur.jpg(中间一个效果有点暗)。
- 所有文章都说使用预乘 alpha,但我不知道如何使用它,是否可以帮助我,谢谢。
- 我在android中使用OpenGL es 2.0和glsl shader来做高斯模糊效果。
-
我如何做模糊
- 加载 png 纹理
- 创建 FBO 以渲染水平模糊
- 创建 FBO 以渲染垂直模糊
- 将结果纹理渲染到屏幕
我的着色器文件
static const char* ULBlurShader_vertexShader =
"uniform mat4 fpsWorldViewProjectionMatrix;\n"
"attribute vec4 gInPosition;\n"
"attribute vec2 gInTex0;\n"
"varying vec2 varTex0;\n"
"void main() {\n"
" gl_Position = fpsWorldViewProjectionMatrix * gInPosition;\n"
" varTex0 = gInTex0.xy;\n"
"}\n";
static const char* ULBlurShaderHor_pixelShader =
"uniform sampler2D sampler0; \n"
"uniform vec4 fpsGaussBlur; \n"
"uniform vec4 fpsGaussWeights[65]; \n"
"varying vec2 varTex0;\n"
"vec4 gaussBlurHorizontal(const int anRadius,vec2 avBaseCoo, vec2 avSamplerRes)"
"{ \n"
" float fStartX = avBaseCoo.x - anRadius*avSamplerRes.x; \n"
" vec4 color = vec4(0, 0, 0, 0); \n"
" for (int x = 0; x < anRadius * 2; x++) \n"
" { \n"
" color += texture2D(sampler0, vec2(fStartX + x*avSamplerRes.x, avBaseCoo.y))*fpsGaussWeights[x / 4][x % 4]; \n"
" } \n"
" return color; \n"
"}\n"
"void main() {\n"
" gl_FragColor.rgba = gaussBlurHorizontal(int(fpsGaussBlur.y), varTex0, vec2(fpsGaussBlur.z, fpsGaussBlur.w)); \n"
"}\n";
static const char* ULBlurShaderVert_pixelShader =
"uniform sampler2D sampler0; \n"
"uniform vec4 fpsGaussBlur; \n"
"uniform vec4 fpsGaussWeights[65]; \n"
"varying vec2 varTex0;\n"
"vec4 gaussBlurVertical(const int anRadius,vec2 avBaseCoo, vec2 avSamplerRes)"
"{ \n"
" float fStartY = avBaseCoo.y - (anRadius*avSamplerRes.y); \n"
" vec4 color = vec4(0, 0, 0, 0); \n"
" for(int y=0; y<anRadius*2; y++) \n"
" { \n"
" color += texture2D(sampler0, vec2(avBaseCoo.x, fStartY+y*avSamplerRes.y))*fpsGaussWeights[y/4][y%4]; \n"
" } \n"
" return color; \n"
"}\n"
"void main() {\n"
" gl_FragColor.rgba = gaussBlurVertical(int(fpsGaussBlur.y), varTex0, vec2(fpsGaussBlur.z, fpsGaussBlur.w));\n"
"}\n";
【问题讨论】:
标签: opengl-es glsl shader blur