目的:
接SDL_Image,d3d9与OpenGL Shader混用方法(一)的”结果“。
在OpenGL+SDL2的环境下实现能采用不同shader的图片。
为实现此目标,已经基本脱离SDL,到了自己写引擎的地步。
在自己实现GL引擎的过程中,对渲染流程,drawcall,material和materialInstance有了更为深刻的体会,在此分享一下。
(图1:背景图使用不断改变tex的shader1,蓝图使用了将图片扭成漩涡的shader2)
背景图Shader:
//quad.vs
in vec2 LVertexPos2D;
in vec2 inTexCoord2D;
varying vec2 texCoord2D;
void main()
{
texCoord2D = inTexCoord2D;
gl_Position = vec4( LVertexPos2D.x, LVertexPos2D.y, 0, 1 );
}
//quad.fs
uniform sampler2D tex;
varying vec2 texCoord2D;
void main()
{
vec4 finalColor = texture(tex, texCoord2D);
gl_FragColor = vec4(finalColor.b,finalColor.g,finalColor.r,1.0f);
}
漩涡Shader:
//vortex.vs
in vec2 LVertexPos2D;
in vec2 inTexCoord2D;
varying vec2 texCoord2D;
void main()
{
texCoord2D = inTexCoord2D;
gl_Position = vec4( LVertexPos2D.x, LVertexPos2D.y, 0, 1 );
}
//vortex.fs
uniform sampler2D tex;
uniform float maxTheta;
varying vec2 texCoord2D;
void main()
{
float pi = 3.1415926f;
float maxRho2 = 0.5f;
float thetaMin = 0.0f;
float thetaMax = maxTheta;
float u = texCoord2D.x-0.5f;
float v = texCoord2D.y-0.5f;
float rho2 = u*u+v*v;
float theta = mix(thetaMin,thetaMax,rho2/maxRho2) ;
float s = sin(theta);
float c = cos(theta);
float u0 = c*u+s*v;
float v0 = -s*u+c*v;
vec2 uv0 = vec2(u0+0.5,v0+0.5);
vec4 finalColor = texture(tex, uv0);
gl_FragColor = vec4(finalColor.r,finalColor.g,finalColor.b,1.0f);
}
参考:
1.LazyFoo关于OpenGL的教程: