怎么用Python OpenGL的point sprite技术绘制雪花
导读:本文共1914.5字符,通常情况下阅读需要6分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 在OpenGL中开启和使用点精灵有一点点复杂,好在WxGL对此做了封装,用起来非常简单。在给出演示代码前,先贴两张雪花的纹理图片。snow_1.pngsnow_2.png熟悉GLSL语言的同学,很容易读懂着色器源码。将着色器源码、纹理图片装进模型之后,只需要show一下,雪花就显示出来了。如果想实现雪花飘飘的效果,请参考我的另一篇博文《用OpenGL导演一场烟花... ...
音频解说
目录
(为您整理了一些要点),点击可以直达。在OpenGL中开启和使用点精灵有一点点复杂,好在WxGL对此做了封装,用起来非常简单。在给出演示代码前,先贴两张雪花的纹理图片。
snow_1.png
snow_2.png
熟悉GLSL语言的同学,很容易读懂着色器源码。将着色器源码、纹理图片装进模型之后,只需要show一下,雪花就显示出来了。如果想实现雪花飘飘的效果,请参考我的另一篇博文《用OpenGL导演一场烟花盛会,迎接即将到来的新年》。
importnumpyasnpimportwxglfromwxglimportwxplotaspltvshader_src="""#version330coreinvec4a_Position;uniformmat4u_MVPMatrix;voidmain(){gl_Position=u_MVPMatrix*a_Position;gl_PointSize=(a_Position.z+1)*30;}"""fshader_src="""#version330coreuniformsampler2Du_Snow_1;infloatidx;voidmain(){gl_FragColor=texture2D(u_Snow_1,gl_PointCoord);}"""m=wxgl.Model(wxgl.POINTS,vshader_src,fshader_src,sprite=True)#通过sprite=Treue开启点精灵m.set_vertex('a_Position',np.random.random((300,3))*2-1)#随机生成300个点m.add_texture('u_Snow_1','res/image/snow_1.png',wxgl.TEXTURE_2D)#添加雪花纹理m.set_mvp_matrix('u_MVPMatrix')#设置模型矩阵、视点矩阵和投影矩阵plt.model(m)plt.show()
下面是使用snow_1.png做纹理的效果。
下面是使用snow_2.png做纹理的效果。
不过,这样的雪花略显单调,毕竟,世界上没有两片完全相同的雪花。怎样让雪花看起来更逼真一点呢?下面的代码尝试在片元着色器中混用两种纹理。
importnumpyasnpimportwxglfromwxglimportwxplotaspltvshader_src="""#version330coreinvec4a_Position;uniformmat4u_MVPMatrix;voidmain(){gl_Position=u_MVPMatrix*a_Position;gl_PointSize=(a_Position.z+1)*30;}"""fshader_src="""#version330coreuniformsampler2Du_Snow_1;uniformsampler2Du_Snow_2;infloatidx;voidmain(){if(fract(sin(dot(gl_PointCoord,vec2(12.9898,78.233)))*43758.5453)<0.5){gl_FragColor=texture2D(u_Snow_1,gl_PointCoord);}else{gl_FragColor=texture2D(u_Snow_2,gl_PointCoord);}}"""m=wxgl.Model(wxgl.POINTS,vshader_src,fshader_src,sprite=True)#通过sprite=Treue开启点精灵m.set_vertex('a_Position',np.random.random((300,3))*2-1)#随机生成300个点m.add_texture('u_Snow_1','res/image/snow_1.png',wxgl.TEXTURE_2D)#添加雪花纹理1m.add_texture('u_Snow_2','res/image/snow_2.png',wxgl.TEXTURE_2D)#添加雪花纹理2m.set_mvp_matrix('u_MVPMatrix')#设置模型矩阵、视点矩阵和投影矩阵plt.model(m)plt.show()
这个雪花有点独特吧?
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:
怎么用Python OpenGL的point sprite技术绘制雪花的详细内容,希望对您有所帮助,信息来源于网络。