如何在此 glsl 着色器中为纹理的每次迭代添加不同的颜色叠加层?



所以我现在正在研究这个着色器,目标是拥有一系列基于相机的图块,每个图块都覆盖着不同的颜色(想想安迪沃霍尔)。我已经让瓷砖工作了(附带问题 - 末端的瓷砖目前正在被切断~50%),但我想为每次迭代添加一个滤色器。我正在寻找最干净的方法来做到这一点。有什么想法吗?

碎片着色器:

#define N 3.0 // number of columns
#define M 3. // number of rows
#import "GPUImageWarholFilter.h"
NSString *const kGPUImageWarholFragmentShaderString = SHADER_STRING
(
precision highp float;
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
void main()
{
vec4 color = texture2D(inputImageTexture, vec2(fract(textureCoordinate.x * N)/(M/ N), fract(textureCoordinate.y * M) / (M/N)));
gl_FragColor = color;

}
);

假设您的纹理正在应用于四边形,并且您的顶点是:

float quad[] = {
0.0, 0.0,
1.0, 0.0,
1.0, 0.0, // First triangle
1.0, 0.0,
1.0, 0.0,
1.0, 1.0  // Second triangle
};

您可以指定对应于每个顶点的纹理坐标,并描述顶点数组对象中的关系。

现在,如果将折点数增加四倍,则可以访问四边形范围之间的中点(创建四个子四边形),并且可以将 (0,0) -> (1,1) 纹理坐标与每个子四边形相关联。效果将是渲染每个子四边形中的完整纹理。

然后,您可以在顶点着色器中对顶点进行数学运算,以计算要分配给每个子四边形的颜色分量。颜色组件将传递到片段着色器。使用制服指定行数和列数,然后根据您计算出当前顶点所在的单元格定义颜色分量。

您也可以尝试计算片段着色器中的所有内容,但我认为它可能会很快变得昂贵。不过只是一种预感。

您也可以尝试GL_REPEAT纹理参数,但您对结果的控制较少:https://open.gl/textures

最新更新