通过Python OpenGL的point sprite技术绘制雪花

看冬奥才知道,阿勒泰不但是中国的“雪都”,还是“人类滑雪起源地”。这个说法是否成立,姑且不论,阿勒泰的雪的确很漂亮。冬奥会有一个宣传片,就是借用一朵阿勒泰雪花的视角来讲述冬奥会的故事,既有历史的厚重,又有艺术的浪漫,极具视觉冲击感。

那么问题来了:如何用OpenGL绘制雪花呢?通常,点精灵(point sprite)技术被用于描述大量粒子在屏幕上的运动,自然也可以用于绘制雪花。点精灵可以理解为贴了纹理图片的点——仅用一个vertex就可以把一个2D纹理图片绘制到屏幕的任何位置。

在OpenGL中开启和使用点精灵有一点点复杂,好在WxGL对此做了封装,用起来非常简单。在给出演示代码前,先贴两张雪花的纹理图片。

snow_1.png

snow_2.png

熟悉GLSL语言的同学,很容易读懂着色器源码。将着色器源码、纹理图片装进模型之后,只需要show一下,雪花就显示出来了。如果想实现雪花飘飘的效果,请参考我的另一篇博文《用OpenGL导演一场烟花盛会,迎接即将到来的新年》。

import numpy as np
import wxgl
from wxgl import wxplot as plt

vshader_src = """
    #version 330 core
    in vec4 a_Position;
    uniform mat4 u_MVPMatrix;
    void main() { 
        gl_Position = u_MVPMatrix * a_Position; 
        gl_PointSize = (a_Position.z + 1) * 30;
    }
"""

fshader_src = """
    #version 330 core
    uniform sampler2D u_Snow_1;
    in float idx;
    void main() { 
        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做纹理的效果。

不过,这样的雪花略显单调,毕竟,世界上没有两片完全相同的雪花。怎样让雪花看起来更逼真一点呢?下面的代码尝试在片元着色器中混用两种纹理。

import numpy as np
import wxgl
from wxgl import wxplot as plt

vshader_src = """
    #version 330 core
    in vec4 a_Position;
    uniform mat4 u_MVPMatrix;
    void main() { 
        gl_Position = u_MVPMatrix * a_Position; 
        gl_PointSize = (a_Position.z + 1) * 30;
    }
"""

fshader_src = """
    #version 330 core
    uniform sampler2D u_Snow_1;
    uniform sampler2D u_Snow_2;
    in float idx;
    void main() { 
        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) # 添加雪花纹理1
m.add_texture('u_Snow_2', 'res/image/snow_2.png', wxgl.TEXTURE_2D) # 添加雪花纹理2
m.set_mvp_matrix('u_MVPMatrix') # 设置模型矩阵、视点矩阵和投影矩阵

plt.model(m)
plt.show()

这个雪花有点独特吧?

到此这篇关于通过Python OpenGL的point sprite技术绘制雪花的文章就介绍到这了,更多相关Python OpenGL雪花内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python OpenGL绘制一场烟花盛会

    目录 1. 安装WxGL 2. 快速体验 3. 编写自己的着色器 4. 绽放的烟花 忙碌了一年,今天终于放假了.原本打算好好休息一下,没成想只过了半天就觉得有点无聊.看家人和朋友们都在忙年,那我就用OpenGL导演一场烟花盛会,献给即将到来的新年吧. 一说到OpenGL,很多人都会觉得复杂,其实不然.只要掌握了几个基本的概念,借助于工具软件,任何人都可以很轻松地上手.在制作烟花之前,我先介绍一下WxGL这个三维数据快速可视化工具. 1. 安装WxGL WxGL是一个基于PyOpenGL的三维数据

  • 基于python绘制科赫雪花

    什么是科赫曲线 科赫曲线是de Rham曲线的特例.给定线段AB,科赫曲线可以由以下步骤生成: 将线段分成三等份(AC,CD,DB) 以CD为底,向外(内外随意)画一个等边三角形DMC 将线段CD移去 分别对AC,CM,MD,DB重复1~3. 什么是科赫雪花 三段科赫曲线组成的图形 实现的效果 < #KocheDraw1 import turtle def koch(size,n): if n==1: turtle.fd(size) else: for i in [0,60,-120,60]:

  • python使用turtle库与random库绘制雪花

    本文实例为大家分享了python绘制雪花的具体代码,供大家参考,具体内容如下 代码非常容易理解,画着玩玩还是可以的.直接上代码 # -*- coding: utf-8 -*- """ Created on Fri Jan 12 14:35:14 2018 @author: Administrator """ from turtle import * from random import * def ground(): hideturtle() s

  • python实例小练习之Turtle绘制南方的雪花

    导语 又到了裹紧被子,穿起秋裤的季节! 这些天,我们这边开始下雨了,温度瞬间降了10几度. 遭受了秋天第一场寒潮的"侵袭",我是真的冷,一大早穿上了长裙. 寒风呼啸,大雪飘飘,咳咳咳......说的严重了点儿,还没飘雪呢,思维有点儿远了! 唯一的愿望就是: 我们公司的冷空调能不能稍微收住一点儿,话说还有的同事穿着短衣短裤是怎么熬过来的, 咋没感觉冷呢?后面我还加了一件外套来着!后来想了想:估计是男孩子皮比较厚一点点.[开个玩笑.jpg] 哼唧唧,独冷冷不如众冷冷,木木子来帮你了~大家一

  • Python绘制圣诞树+落叶+雪花+背景音乐+浪漫弹窗 五合一版圣诞树

    目录 一.背景故事 二.五合一版圣诞树制作过程 1.基础圣诞树 2.落叶效果 3.雪花特效 4.背景音乐 5.浪漫弹窗 6.署名制作 三.源码分享 一.背景故事 圣诞节风波 马上不就到圣诞节了嘛,我看到朋友圈里很多小伙伴再纷纷炫耀自己收到的专属圣诞树,也有小伙伴私信我,说还没有自己的圣诞树!!! 作为我的粉丝朋友们,我不允许大家还没有专属于自己的圣诞树!我要让大家收到最特别最美丽的圣诞树,于是-冒着-期末挂科-的风险-我重拾了自己失传已久的海龟画图: 海龟画图全解-值得你一看!(这篇文章写了很久

  • 通过Python OpenGL的point sprite技术绘制雪花

    看冬奥才知道,阿勒泰不但是中国的“雪都”,还是“人类滑雪起源地”.这个说法是否成立,姑且不论,阿勒泰的雪的确很漂亮.冬奥会有一个宣传片,就是借用一朵阿勒泰雪花的视角来讲述冬奥会的故事,既有历史的厚重,又有艺术的浪漫,极具视觉冲击感. 那么问题来了:如何用OpenGL绘制雪花呢?通常,点精灵(point sprite)技术被用于描述大量粒子在屏幕上的运动,自然也可以用于绘制雪花.点精灵可以理解为贴了纹理图片的点——仅用一个vertex就可以把一个2D纹理图片绘制到屏幕的任何位置. 在OpenGL中

  • Python+OpenGL制作一个元宵花灯

    目录 1.准备 2.快速体验 3.模型动画 4.子图布局 5.颜色映射 6.走马灯 又是一年元宵节,作为程序员的你,打算怎么过呢?如果昨天情人节的红包发得手软又心疼,不妨静下心来,了解一下三维数据可视化,顺便做一盏花灯送给女朋友,也许比红包更能讨她欢心呢. 1.准备 三维数据快速可视化工具,我喜欢用WxGL.这是一个基于PyOpenGL的三维数据可视化库,提供类似Matplotlib风格的3D绘图函数.如果熟悉NumPy和Matplotlib的话,只需要几分钟时间就可以学会使用WxGL的交互式绘

  • Python OpenGL基本配置方式

    目录 OpenGL基本配置方式 pip 安装 PyOpenGL 测试代码 Python+OpenGL库理解及代码应用 1.读取off文件 OpenGL基本配置方式 参考:http://pyopengl.sourceforge.net pip 安装 PyOpenGL pip install PyOpenGL PyOpenGL_accelerate 测试代码 from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT impor

  • Python中的pygal安装和绘制直方图代码分享

    有关pygal的安装,大家可以参阅<pip和pygal的安装实例教程>. 直方图: 直方图是一个特殊的条,它可以取3个数值:纵坐标高度,横坐标开始和横坐标结束. import pygal hist = pygal.Histogram() hist.add('Wide bars', [(5, 0, 10), (4, 5, 13), (2, 0, 15)]) hist.add('Narrow bars', [(10, 1, 2), (12, 4, 4.5), (8, 11, 13)]) hist.

  • 详解Python使用Plotly绘图工具,绘制甘特图

    今天来讲一下如何使用Python 的绘图工具Plotly来绘制甘特图的方法 甘特图大家应该了解熟悉,就是通过条形来显示项目的进度.时间安排等相关情况的. 我们今天来学习一下,如何使用ployly来绘制甘特图 绘制甘特图的函数为Plotly.figure_factoryz中create_gantt方法 通过参数事件Task,开始Start,结束Finish的时间的数据来绘制甘特图 import plotly as py import plotly.figure_factory as ff pypl

  • python ImageDraw类实现几何图形的绘制与文字的绘制

    python PIL图像处理模块中的ImageDraw类支持各种几何图形的绘制和文本的绘制,如直线.椭圆.弧.弦.多边形以及文字等. 下面直接通过示例来进行说明: #-*- coding: UTF-8 -*- import numpy as np from PIL import Image from PIL import ImageDraw from PIL import ImageFont def draw_test(): #生成深蓝色绘图画布 array = np.ndarray((480,

  • Python 里最强的地图绘制神器

    今天给大家介绍一个非常 NB 的Python 库,专门用来绘制地图的,它叫 Folium . 1. Folium简介 Folium是一个基于leaflet.js的Python地图库,其中,Leaflet是一个非常轻的前端地图可视化库.即可以使用Python语言调用Leaflet的地图可视化能力.它不单单可以在地图上展示数据的分布图,还可以使用Vincent/Vega在地图上加以标记.Folium可以让你用Python强大生态系统来处理数据,然后用Leaflet地图来展示. Folium中有许多来

  • Python数据可视化之用Matplotlib绘制常用图形

    一.散点图 散点图用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式. 特点:判断变量之间是否存在数量关联趋势,表示离群点的分布规律. 散点图绘制: plt.scatter(x,y) # 以默认的形状颜色绘制散点图 实例: 假设我们获取到了上海2020年5,10月份每天白天的最高气温(分别位于列表a.b),那么此时如何观察气温和随时间变化的某种规律. # 绘制图形所需的数据 y_5 = [11,17,16,11,12,11,12,13,10,14,8

随机推荐