我正在使用GPUimage和xcode开发iOS平台。
尝试拍摄实时视频流,并将其转换为9格,例如3x3网格。
我已将视频缩放到0.33原始尺寸,然后尝试应用片段着色器将缩放的视频重复到其他图块。
但着色器仅适用于缩放视频而非整个视图。
这是我的着色器:
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform mediump float range;
void main()
{
mediump vec2 p = textureCoordinate;
if (p.x > 0.66) {
p.x = (p.x-0.66);
}
else if (p.x > 0.33) {
p.x = (p.x-0.33);
}
if (p.y > 0.66) {
p.y = (p.y-0.66);
}
else if (p.y > 0.33) {
p.y = (p.y-0.33);
}
lowp vec4 outputColor = texture2D (inputImageTexture, p);
gl_FragColor = outputColor;
}
有什么建议吗?
答案 0 :(得分:2)
// This is necessary for non-power-of-two textures
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
视频输入会产生非二次幂纹理。
所以使用的脚本是:
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
// num tiles row x col
uniform mediump float range;
void main()
{
mediump vec2 p = mod( range * textureCoordinate - vec2( 1.0 ), 1.0 );
lowp vec4 outputColor = texture2D (inputImageTexture, p);
gl_FragColor = outputColor;
}
范围表示行数和列数。
答案 1 :(得分:0)
是的,将纹理包装模式设置为 GL_REPEAT ,这样您就不必关心“克隆”了!
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
你的着色器应该是:
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform mediump float range;
void main()
{
mediump vec2 p = 3.0 * textureCoordinate - vec2( 1.0 );
lowp vec4 outputColor = texture2D (inputImageTexture, p);
gl_FragColor = outputColor;
}
如果由于某种原因你不想使用 GL_REPEAT ,只需使用mod()函数自己重复纹理:
mediump vec2 p = mod( 3.0 * textureCoordinate - vec2( 1.0 ), 1.0 );