如何用 OpenGL 绘制雪花?
作者 | 许向武
责编 | 张红月
出品 | CSDN博客
看冬奥才知道,阿勒泰不但是中国的“雪都”,还是“人类滑雪起源地”。这个说法是否成立,姑且不论,阿勒泰的雪的确很漂亮。冬奥会有一个宣传片,就是借用一朵阿勒泰雪花的视角来讲述冬奥会的故事,既有历史的厚重,又有艺术的浪漫,极具视觉冲击感。
那么问题来了:如何用OpenGL绘制雪花呢?通常,点精灵(point sprite)技术被用于描述大量粒子在屏幕上的运动,自然也可以用于绘制雪花。点精灵可以理解为贴了纹理图片的点——仅用一个vertex就可以把一个2D纹理图片绘制到屏幕的任何位置。
在OpenGL中开启和使用点精灵有一点点复杂,好在WxGL对此做了封装,用起来非常简单。在给出演示代码前,先贴两张雪花的纹理图片。
熟悉GLSL语言的同学,很容易读懂着色器源码。将着色器源码、纹理图片装进模型之后,只需要show一下,雪花就显示出来了。如果想实现雪花飘飘的效果,请参考我的另一篇博文《用OpenGL导演一场烟花盛会,迎接即将到来的新年》(https://xufive.blog.csdn.net/article/details/122743824)。
好了,话不多说,直接上绘制雪花的代码:
import numpy as np
import wxgl
from wxgl import wxplot as pltvshader_src = """#version 330 corein 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 coreuniform 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 pltvshader_src = """#version 330 corein 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 coreuniform 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()
这个雪花有点独特吧?
往
期
回
顾
资讯
谷歌使出禁用2G大招
资讯
大型模型语言能够理解吗?
Python写了一个网页版的P图软件
11款可替代top命令的工具!
分享
点收藏
点点赞
点在看
相关文章:
面试之Hashtable和ConcurrentHashMap
那么要如何保证HashMap的线程安全呢? 方法有很多,比如使用Hashtable或者Collections.synchronizedMap,但是这两位选手都有一个共同的问题:性能。因为不管是读还是写操作,他们都会给整个集合上锁,导致同一时…

PHP动态编译出现Cannot find autoconf
在安装完PHP后,想动态编译PHP的memcache扩展库 cd memcache-2.2.5//usr/local/webserver/php/bin/phpize./configure --with-php-config/usr/local/webserver/php/bin/php-config 但是执行/usr/local/webserver/php/bin/phpize时出现错误:Configuring for:PHP Api Version: …

AnimeGANv2 实现动漫风格迁移,简单操作
作者 | Yunlord出品 | CSDN博客前言之前一直在研究如何将图像动漫化,尝试了阿里云api和百度api,效果都不尽如人意。结果发现了一个宝藏github项目——AnimeGANv2,能够将现实世界场景照片进行动漫风格化。可以看出AnimeGAN的效果非常好&#x…

C#调用win32 api程序实例
1、声明static extern 方法,使用DllImport特性 class MyClass{[DllImport("kernel32", SetLastError true)]public static extern int GetCurrentDirectory(int a, StringBuilder b);} 2、调用 StringBuilder sbnew StringBuilder {Length 250}; MyClas…

Python 之 pip拒绝访问
起因 在我使用pip安装第三方库的时候,控制台提示我升级pip版本 You are using pip version 9.0.1, however version 10.0.1 is available. You should consider upgrading via the python -m pip install --upgrade pip command. 很显然,需要使用这样的指…

Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)
著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:孙立伟 链接:http://www.zhihu.com/question/20140085/answer/14107336 来源:知乎 这个问题quora上有人提过 What are some lesser known but useful…

干货满满的 Python 实战项目,点赞收藏
作者 | 俊欣来源 | 关于数据分析与可视化今天小编来给大家介绍3个干货满满的计算机视觉方向的Python实战项目,主要用到的库有opencv-pythonnumpypillow要是大家所配置的环境当中没有这几个模块的话,就需要先用pip命令下载安装pip install opencv-python …

php安装完成以后要复制php.ini文件
直接 #find / -name "php.ini" 找不到,是因为安装php的时候没有复制配置文件 php版本变化以后ini文件名有变 php.ini-production对应于php.ini-recommended php.ini-development对应于php.ini-dist二者差异? 由于版本更新,这些文件有了新的命…

MASQUERADE --random 端口不随机
iptables -t nat -A POSTROUTING -o xxxx -j MASQUERADE --random发现源端口并不是随机的而是有规律递增,经过Google的搜索查找,发现新的版本有--random-full 这个参数iptables -t nat -A POSTROUTING -o xxxx -j MASQUERADE --random-full经过测试端口随…

PHP安装与使用VLD查看opcode代码【PHP安装第三方扩展的方法】
需要分析PHP代码的性能,或者说实现同样功能的代码到底哪个更好呢?或者说想知道底层的实现可以使用VLD查看opcode 下载与安装VLD # wget http://pecl.php.net/get/vld-0.11.2.tgz# tar zxvf vld-0.11.2.tgz# cd ./vld-0.11.2# /usr/local/php/bin/phpize …

实现数组字符串翻转的两种方法
//第一种方法:递归法 #include <stdio.h> int reverse_string(char * string) {if (*string ! \0){reverse_string(string1);printf("%c", *string);} } int main() {char *string "abcde";printf("源字符串为:%s\n&quo…

详解 Python 如何将爬取到的数据分别存储到 txt、excel、mysql 中!
作者 | 黄伟呢来源 | 数据分析与统计学之美1. 页面分析我爬取的页面是腾讯体育,链接如下:https://nba.stats.qq.com/player/list.htm观察上图:左边展示的分别是NBA的30支球队,右边就是每只球队对应球员的详细信息。此时思路就很清…

蹭了BCH热度,还来诋毁BCH,这些跳梁小丑到底在玩什么阴谋?
最近一些分叉币为了博眼球简直什么招数都用。有的某分叉币对主链暂停10天的问题闭口不提,靠微博撕逼来吸引关注,有的则自导自演了一出51%***的大戏。而奇怪的是当别人开始谈论他们这些错误的时候,他们却把矛头指向了火热的比特币现金。这些跳…

比 GPT-3 更擅长理解用户意图,OpenAI发布 InstructGPT
作者 | 青苹果来源 | 数据实战派近日,OpenAI 发布了一项令人瞩目的研究—— InstructGPT。在这项研究中,相比 GPT-3 而言,OpenAI 采用对齐研究(alignment research),训练出更真实、更无害,而且更…

The C10K problem原文翻译
原文地址:http://www.cnblogs.com/fll/archive/2008/05/17/1201540.htmlThe C10K problem如今的web服务器需要同时处理一万个以上的客户端了,难道不是吗?毕竟如今的网络是个big place了。 现在的计算机也很强大了,你只需要花大概$…

mysql中模糊查询的四种用法介绍
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。 比如 SELECT * FROM [user] WHERE u_name LIKE …

spring data jpa 详解
2019独角兽企业重金招聘Python工程师标准>>> 本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求。这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring整…

php使用curl可以get 模拟post
本机windows测试需要打开curl php.ini extensionphp_curl.dll重启apacheinclude (Curl.php);$cunew QP_Curl_Curl();$s$cu->get(http://www.baidu.com);echo $s;Curl.php可以使用http://www.myquickphp.com/的框架中的组件Curl.php/*** CURL 工具* * category QuickPHP(II…

为什么使用模块?
# -*- coding: utf-8 -*- #python 27 #xiaodeng #模块01#每个文件都是一个模块,并且模块导入之后就可以导入模块定义的变量名。#为什么使用模块? #命名空间提供了将部件组织为系统的简单的方法。 #在一个模块文件的顶层定义的所有变量名都成了被导入的模…

报告!插件×元宵来啦
欢欢喜喜 闹元宵迈过新年,开工大吉,元宵节的脚步悄悄靠近,在大家努力搬砖得同时,CSDN插件带着它的元宵活动走来啦~元宵喜乐汇虎年的第一个月圆之夜,除了吃汤圆还能干啥呢?当然是猜灯谜咯!CSDN插…

%f%g%e区别
%f 表示按浮点数的格式输出 %e 表示按指数形式的浮点数的格式输出 %g 表示自动选择合适的表示法输出,可以去小数末尾多余的0转载于:https://www.cnblogs.com/holyday/p/9111777.html

Cassandra安装测试
说明,本人成功安装过程记录 只要看解压目录的readme.txt即可,其他网上教程由于版本不对会执行报错,例如遇到编码问题 #wget http://www.apache.org/dyn/closer.cgi?path/cassandra/1.0.3/apache-cassandra-1.0.3-bin.tar.gz #tar -zxvf a…

如何使用 Python 隐藏图像中的数据
作者 | 小白来源 | 小白学视觉隐写术是在任何文件中隐藏秘密数据的艺术。秘密数据可以是任何格式的数据,如文本甚至文件。简而言之,隐写术的主要目的是隐藏任何文件(通常是图像、音频或视频)中的预期信息,而不实际改变…

php 的 危 险 参 数
hpinfo() 功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。 危险等级:中 passthru() 功能描述:允许执行一个外部程序并回显输出,类似于 exec()。 危险等级:高 exec() 功能描述:允许执行一个外部…

开源 | 蚂蚁金服分布式中间件开源第二弹:丰富微服务架构体系
小蚂蚁说: 数据、消息、微服务是蚂蚁金服自主研发的金融级分布式中间件 SOFA (Scalable Open Financial Architecture)的三大方向。 一个多月前,蚂蚁金服开源了 SOFABoot 和 SOFARPC 两个组件,受到了社区的热烈欢迎&am…

System.Web.Caching.Cache类 缓存 各种缓存依赖
原文:System.Web.Caching.Cache类 缓存 各种缓存依赖Cache类,是一个用于缓存常用信息的类。HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例。 一、属性 属性说明Count获取存储在缓存中的项数。EffectivePercentagePhysicalMemoryLimit获取在 ASP.NE…

Python 可视化近 90 天的百度搜索指数 + 词云图
作者 | 叶庭云来源 | AI庭云君一、简介 在实际业务中我们可能会使用爬虫根据关键词获取百度搜索指数历史数据,然后进行对应的数据分析。百度指数,体验大数据之美。但要获取百度指数相关的数据,困难如下:不是静态网页,并…

php常用比较函数区别表
php常用比较函数区别表 表达式 empty() is_null() isset() if($x) $x "" TRUE FALSE TRUE FALSE $x null TRUE TRUE FALSE FALSE $x is undefined TRUE TRUE FALSE FALSE(报E_NOTICE错) $x array() TRUE FALSE TRUE FALSE $x false TRUE FALSE TRUE FALSE $x 0 …

实战分享:淘宝Web 3D应用与游戏开发
大家下午好!我们今天讲个比较有意思的话题,这个话题在业界被谈及得比较少。大家在座有做过移动端开发的同学吗?请举个手,人还挺多的。那做过3D应用的同学请举个手,有用过Threejs的请举个手,做过游戏的呢..人…

常见NoSQL系统使用场景分析
•Cassandra •特性:分布式与复制的权衡\根据列和键范围进行查询\BigTable类似的功能:列,列族\写比读快很多 •最佳适用:写操作较多,读比较少的时候。如果你的系统都是基于Java的时候。 •应用场景:银行&am…