如何学习OpenGL Shader开发?

shader也称着色器,着色器是运行在GPU上的小程序,着色器是一种C风格语言——GLSL。

一、GLSL GLSL是为图形量身定制的,它为向量和矩阵运算提供了很大帮助。

1、着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。main函数时每个着色器的入口,用于处理所有输入变量,并用输出变量输出处理结果。

2、类型:着色器的类型包括:int、float、double、uint、bool。GLSL的两种容器类型:向量和矩阵。 向量是有1、2、3或4个元素的基本类型容器。vecn:包含n个默认为float元素的向量;其他还有bvecn、ivecn、uvecn、dvecn,可以使用vec.x、.y、.z、.w来获取它们的1、2、3、4号元素,GLSL也允许使用rgba来获取颜色的元素,或者stpq获取纹理坐标元素。

3、in和out:着色器是各自独立的小程序,每个着色器都是用这两个关键字定义输入和输出。使用layout元数据制定输入变量,这样才可以在CPU上配置顶点属性。

4、定点着色器:

layout (location = 0) in vec3 position; // 位置变量的属性position为0

out vec4 vertexColor; // 为像素着色器指定一个颜色输出

void main()
{
    gl_Position = vec4(position, 1.0); // 把一个vec3作为vec4的构造器的参数
    vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f); // 把输出颜色设置为暗红色
}

5、像素着色器

in vec4 vertexColor; // 和顶点着色器的vertexColor变量类型相同、名称相同

out vec4 color; //像素着色器输出的变量名可以任意命名,类型必须是vec4

void main()
{
    color = vertexColor;
}

6、uniform uniform 是另一种从CPU应用向GPU着色器发送数据的方式; uniform和顶点属性的不同: 1)uniform是全局的:在所有着色器程序对象中都是独一无二的,可以在任何着色器程序的任何阶段使用,并且无论吧uniform值设置成什么,uniform都会一直保存着它们的数据,直到它们被重置或更新; 2)uniform是constant的:不能在着色器中修改,任何修改都会报错;

out vec4 color;

uniform vec4 ourColor; // 在C++代码中设置

void main()
{
    color = ourColor;
}

而视频/游戏中酷炫逼真的效果又是由shader来控制实现的。所以想要提高自己技能就必须啃下shader这个硬骨头。学习OpenGL现在市面上比较受欢迎的书籍就是《OpenGL超级宝典(中文第5版3.3或者英文第七版4.5)》和《OpenGL编程指南(中文第九版4.5)》。建议先学习OpenGL超级宝典第五版,虽然现在OpenGLl已经到最新的4.6了,而超级宝典第五版里面只是到3.3,但是并没有关系,因为3.3到4.6之间的核心架构都没变,只是引进了一些新的功能以及改善了某些功能的实现而已。而且书中细节讲解的很清晰,还有大量的例子来佐证,非常适合OpenGL初学者。当看完超级宝典第五版后建议再学习下OpenGL编程指南第九版,该书针对OpenGL4.5版本,不仅引入了很多有意思和高大上的技能讲解,可以继续更深层次学习3.3往后的版本技能。

二、实时开发shader

shader 调试

片元着色器使用后缀: .frag 等,参考

brew update 
brew upgrade
brew install glslviewer
SublimeText-3 插件安装

glslViewer sublimeText 安装

  cd ~/Library/Application Support/Sublime Text 3/Packages/
  git clone https://github.com/patriciogonzalezvivo/sublime-glslViewer.git
package control 安装

工具栏中查找 package control, 则control安装成功。

组合键 Command+Shift+P ,

搜索 package control:Install package

然后进行搜索 OpenGL Shading Language (GLSL), 即可实现 代码高亮

着色器 GLSL

如何进行编写和我们书写GLSL一样,存在部分差异参考glslViewer GitHub:https://github.com/patriciogonzalezvivo/glslViewer

脚本文件和资源文件放在同一文件夹下,终端cd到文件夹下,运行如下:

glslViewer text.frag test.jpg

效果:

原文发布于微信公众号 - 何俊林(DriodDeveloper)

原文发表时间:2018-10-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python绿色通道

数据分析 | Numpy进阶

切片索引Numpy中选取数据子集或者单个元素的方式有很多,一维数组和Pyhon列表的功能差不多,看下图:

1291
来自专栏蜉蝣禅修之道

Max-Min Fairness带宽分配算法

2266
来自专栏java 成神之路

java.util.Random 实现原理

3435
来自专栏机器学习实践二三事

Python-OpenCV(5)

这次咱们比较下,python的函数、numpy的函数和OpenCV的函数的效率问题,让大家对功能相同的情况下如何选择合适的函数有比较直观的认识 程序(语句)运行...

2327
来自专栏前端菜鸟变老鸟

判断两个json是不是相等的

1683
来自专栏Java架构沉思录

如何优雅地过滤敏感词

敏感词过滤功能在很多地方都会用到,理论上在Web应用中,只要涉及用户输入的地方,都需要进行文本校验,如:XSS校验、SQL注入检验、敏感词过滤等。今天着重讲讲如...

3741
来自专栏潇涧技术专栏

Python Algorithms - C2 The basics

本节主要介绍了三个内容:算法渐近运行时间的表示方法、六条算法性能评估的经验以及Python中树和图的实现方式。

1122
来自专栏人工智能LeadAI

Python json 模块dumps、dump、loads、load的使用

本文主要讲下json.dumps和json.dump、json.loads和json.load的区别,因为经常需要加载json文件,读取数据,傻傻分不清...

1101
来自专栏青玉伏案

iOS开发之Masonry框架源码解析

Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁。Masonry简化了NSLay...

2168
来自专栏AI科技大本营的专栏

入门 | 海量数据处理算法总结【超详解】

作者 | Angel_Kitty ➤1. Bloom Filter 【Bloom Filter】 Bloom Filter(BF)是一种空间效率很高的随机数据...

4399

扫码关注云+社区

领取腾讯云代金券