如何通过两个着色器传递纹理?
How to pass texture through two shaders?
我只需要将纹理通过片段着色器1,得到结果并将其传递给片段着色器2。
我知道如何link将顶点着色器和片段着色器一起放入程序中并获取着色器对象。
我不知道如何获取shader 1的结果,切换shader(GLES20.glUseProgram
?)并将shader 1的结果传递给shader 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;
}
...
如果你想将结果作为纹理传递给另一个着色器,你应该使用 RTT(渲染到纹理),这样你就可以获得纹理传递给另一个着色器。
是的,你应该使用 glUseProgram(name) 来切换另一个着色器但不仅如此,你应该在原来的 FBO 上渲染它(现在你使用)
- 做一个FBO把结果做成贴图。
- 使用第一个着色器渲染到纹理然后你可以获得纹理
- 在主 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 种效果。
- 在effect1等10个片段中定义
uniform float effect2
。
- 传递 effect2,例如 0.5、1.5 或 2.5
根据你传递的值,混合不同的效果。
例如,
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);
}
我只需要将纹理通过片段着色器1,得到结果并将其传递给片段着色器2。
我知道如何link将顶点着色器和片段着色器一起放入程序中并获取着色器对象。
我不知道如何获取shader 1的结果,切换shader(GLES20.glUseProgram
?)并将shader 1的结果传递给shader 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;
}
...
如果你想将结果作为纹理传递给另一个着色器,你应该使用 RTT(渲染到纹理),这样你就可以获得纹理传递给另一个着色器。
是的,你应该使用 glUseProgram(name) 来切换另一个着色器但不仅如此,你应该在原来的 FBO 上渲染它(现在你使用)
- 做一个FBO把结果做成贴图。
- 使用第一个着色器渲染到纹理然后你可以获得纹理
- 在主 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 种效果。
- 在effect1等10个片段中定义
uniform float effect2
。 - 传递 effect2,例如 0.5、1.5 或 2.5
根据你传递的值,混合不同的效果。 例如,
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); }