如何学习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 条评论
登录 后参与评论

相关文章

来自专栏小文博客

蓝桥杯 C语言省赛 习题2 格子中输出

1554
来自专栏C语言及其他语言

【编程经验】C语言中如何使用随机数?

C语言中如何使用随机数 随机数的使用,是不少在学C语言过程中进行一些小功能开发的同学的一个技术问题,今天我们就为大家讲解如何在C语言中使用随机数...

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

Python-OpenCV(5)

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

2117
来自专栏数说工作室

统计师的Python日记【第6天:数据合并】

本文是【统计师的Python日记】第6天的日记 回顾一下: 第1天学习了Python的基本页面、操作,以及几种主要的容器类型。 第2天学习了python的函数、...

4328
来自专栏Python绿色通道

数据分析 | Numpy进阶

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

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

判断两个json是不是相等的

1073
来自专栏PPV课数据科学社区

Pandas速查卡-Python数据科学

Josh Devlin 2017年2月21日 Pandas可以说是数据科学最重要的Python包。 它不仅提供了很多方法和函数,使得处理数据更容易;而且它已经...

3887
来自专栏calmound

HDU 1536 S-Nim

师时隔几个月后,在看博弈NIM终于懂了,做出了第一道根据所有堆的异或和的题 题意:在一个Si容器中,输入可以行走的步数,然后在下面T组测试数据中,输入堆的情况 ...

3616
来自专栏漫漫深度学习路

pytorch学习笔记(七):pytorch hook 和 关于pytorch backward过程的理解

pytorch 的 hook 机制 在看pytorch官方文档的时候,发现在nn.Module部分和Variable部分均有hook的身影。感到很神奇,因为在使...

9825
来自专栏青玉伏案

iOS开发之Masonry框架源码解析

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

2068

扫码关注云+社区