热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何学习OpenGLShader开发?

shader也称着色器,着色器是运行在GPU上的小程序,着色器是一种C风格语言——GLSL。一、GLSLGLSL是为图形量身定制的,它为向

640?wx_fmt=png

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 = 0in 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


效果:

640?wx_fmt=gif

640?wx_fmt=png


推荐阅读
author-avatar
UPI
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有