gpt4 book ai didi

iphone - 用于模糊的 OpenGL ES 2.0 片段着色器速度慢且质量低

转载 作者:可可西里 更新时间:2023-11-01 03:38:25 25 4
gpt4 key购买 nike

我正在尝试为 iPad 编写模糊着色器。我有它的工作,但我对结果不是很满意。我得到非常不稳定的帧速率,当模糊量很高时,模糊看起来像垃圾。

关于如何改进的任何想法?

一些示例输出:

alt text

uniform sampler2D texture;
varying mediump vec2 fragTexCoord;
varying mediump vec3 eyespaceNormal;

varying highp float blurAmount;

void main(void)
{
highp vec2 gaussFilter[7];
gaussFilter[0] = vec2(-3.0, 0.015625);
gaussFilter[1] = vec2(-2.0, 0.09375);
gaussFilter[2] = vec2(-1.0, 0.234375);
gaussFilter[3] = vec2(0.0, 0.3125);
gaussFilter[4] = vec2(1.0, 0.234375);
gaussFilter[5] = vec2(2.0, 0.09375);
gaussFilter[6] = vec2(3.0, 0.015625);

highp float blurSize = blurAmount * 1.0;

/////////////////////////////////////////////////
// 7x1 gaussian blur fragment shader
/////////////////////////////////////////////////

highp vec4 color = vec4(0,0,0,1);

for( int i = 0; i < 7; i++ )
{
color += texture2D( texture, vec2( fragTexCoord.x+gaussFilter[i].x*blurSize, fragTexCoord.y+gaussFilter[i].x*blurSize ) )*gaussFilter[i].y;
}

gl_FragColor = color;
}

编辑:盒子模糊可能是可行的方法。这是着色器的框模糊版本:

highp vec4 color = vec4(0,0,0,1);

color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y - 4.0*blurAmount)) * 0.05;
color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y - 3.0*blurAmount)) * 0.09;
color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y - 2.0*blurAmount)) * 0.12;
color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y - blurAmount)) * 0.15;
color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y)) * 0.16;
color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y + blurAmount)) * 0.15;
color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y + 2.0*blurAmount)) * 0.12;
color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y + 3.0*blurAmount)) * 0.09;
color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y + 4.0*blurAmount)) * 0.05;

gl_FragColor = color;

这是框模糊输出(注意它只是一个水平模糊,但它可能足以满足我的需求): alt text

最佳答案

该着色器需要运行两次才能工作,你所说的 blurSize 应该是一个 vec2 并且它的值应该是 vec2(0, 1.0/height) 用于垂直模糊,vec2(1.0/width, 0) 用于水平模糊。

参见 http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=240334

进行两次模糊处理的想法是,它会显着减少纹理查找的次数并有望提高速度。内核大小为 7x7 的两遍模糊将需要 14 次纹理查找,但如果它在嵌套循环中完成,则需要进行 49 次纹理查找。

关于iphone - 用于模糊的 OpenGL ES 2.0 片段着色器速度慢且质量低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com