继上一篇shader车道线效果,这一篇将实现动态车道线效果。上效果:
上一篇我们利用的是三角函数sin的y随着x的变化,在-1~0~1的变化规律,改变虚线的不可见位置,我们动态改变sin函数的x参数。
首先要解决的问题就是如何在shader中获取一个动态的参数,我们需要先定义一个uniform 类型的变量var_param,然后把参数加载三角函数的公式中。
//Fragment Shader
char fShaderStr_my[] =
"precision mediump float; \n"
"varying vec2 ssUV; \n"
"uniform sampler2D ssTextureSampler; \n" //【不可修改】变量名固定
"uniform vec3 myColor; \n" //【自定义】变量
"uniform float var_param = 0.0; \n" //【自定义】变量
"float line_kx(vec2 st, float k, float t, float line_width) {\n"
" float y = k*st.x + t;\n"
" return step(y, st.y) - step(y + line_width, st.y);\n"
"}\n"
"void main() \n"
"{\n"
"float alpha = (line_kx(ssUV, 4.5, -0.3, 0.2) + line_kx(ssUV, -4.5, 4.2, 0.2)) * smoothstep(0.0, 1.0, sin(30 * (ssUV.y + var_param))); \n"
"gl_FragColor = vec4(myColor, alpha);\n"
"}\n";
然后我们需要在标准接口updateMyVar中定义var_param参数的动态变化实现,ssRender渲染引擎会自动调用updateMyVar接口,调用频率大概是每20ms调用一次,然后想要给shader中的var_param,需要调用setFloat接口,达到与shader的联动。
void UserPluginDLL::updateMyVar()
{
//修改自定义变量的值
setVec3("myColor", 1.0, 1.0, 1.0);
setFloat("var_param", time_index);
if (time_index < 100.0)
{
time_index += 0.005;
}
else
{
time_index = 0.0;
}
}
二、将编译完成的Plugin加载到ssRender工具端进行调试
当我们将代码编译完成之后,加载到ssRender Editor工具端,这样我们就可以在Preview窗口,看到我们实现的具体效果。
本篇到此结束,下一篇我们将实现曲线的车道线效果,如果本篇内容对您有多启发,点个赞先Hi~ o(* ̄▽ ̄*)ブ!
ssRender力争做国人自己的渲染引擎!