我只需要通过片段着色器1传递纹理,得到结果并将其传递给片段着色器2.
我知道如何将顶点和片段着色器链接到一个程序中并获取着色器对象。
我不知道如何获取着色器1的结果,切换着色器(GLES20.glUseProgram
?)并将着色器1的结果传递给着色器2.
任何想法怎么做?
更新 这是我想要实现的一个例子
效果1:
效果2:
我的目标是结合效果1和效果2。 更新2
效果2功能:
...
uniform float effect2;
vec2 getEffect_() {
float mType = effect2;
vec2 newCoordinate = vec2(textureCoordinate.x, textureCoordinate.y);
vec2 res = vec2(textureCoordinate.x, textureCoordinate.y);
//case 1
if(mType==3.5) {
if (newCoordinate.x > 0.5) {
res = vec2(1.25 - newCoordinate.x, newCoordinate.y); }
}
else
//case 2
...
return res;
}
...
答案 0 :(得分:1)
如果要将结果作为纹理传递给另一个着色器,则应使用RTT(渲染到纹理),以便可以将纹理传递给另一个着色器。
是的,您应该使用glUseProgram(name)来切换另一个着色器,但不仅如此,您应该在原始FBO(现在使用)上渲染它
如果您只想组合两个效果,只需合并两个片段着色器即可。
//At the end of the second frag shader
// skip this below
//gl_FragColor = result;
// put these codes
float grayScale = dot(result.rgb, vec3(0.299, 0.587, 0.114));
gl_FragColor = vec4(grayScale, grayScale, grayScale, 1.0);
仅使用一个着色器程序和第二个效果片段着色器。
我假设您不需要一次显示这30种效果。
uniform float effect2
。 根据您传递的值,不同地混合效果。 例如,
if(effec2>2.0) { float grayScale = dot(result.rgb, vec3(0.299, 0.587, 0.114)); gl_FragColor = vec4(grayScale, grayScale, grayScale, 1.0); } else if(effect2>1.0) { vec3 final_result_of_effec2_2 = fun_2(result.rgb); gl_FragColor = vec4(final_result_of_effec2_2, 1.0); } else { vec3 final_result_of_effec2_3 = fun_3(result.rgb); gl_FragColor = vec4(final_result_of_effec2_3, 1.0); }