拓幻图形学工程师教学手册(第八讲)|一字一字敲出OpenGL学习教程

上次教程关于光照,这次内容会比较复杂,关于着色器(Shader),GLSL(OpenGL Shading Language)。对于初次接触图形学的童鞋,可能比较晦涩。并且用Mac开发的同学注意,本教程中有关Shader内容,环境均为win下VS,但这并不代表Mac不支持Shader,只是需要配置一些环境,Google可以百度一下。

  1. 着色器(Shader)
    6.1 着色器分类
    还记得第一讲中的管线图吗?有个词叫光栅化,记得吗?在光栅化之前都是对顶点进行变换,顶点光照和投影变换等,这些都是对顶点进行操作,其对应的着色器也叫做顶点着色器(Vertex Shader)。光栅化之后,进行片元处理,纹理映射等都是对片元的操作,对应的着色器也叫片元着色器(Fragment Shader)。当然也会有别的着色器,比如细分着色器,计算着色器等,有兴趣可以了解。

    6.2 GLSL概述
    首先介绍一下GLSL的变量类型。GLSL中,有四种类型参数:顶点属性(attribute),一致变量(uniform),还有一种有人称为易变变量(varying),但是这里我们将它称为out/in变量。varing是很早之前的版本,现在大部分都改为out/in了。最后一个是常数变量(const)。

顶点属性(attribute),是只能在vertex shader中使用的变量,用来表示一些顶点的数据,如:顶点坐标,法线,纹理坐标,顶点颜色等。

一致变量(uniform),是外部application程序传递给(vertex和fragment)shader的变量,可以理解为全局变量,并且是只读的属性,不能通过shader来改变其值。

易变变量(out/in),被从一个着色器传递至下一个着色器,相当于模块之间的接口。在我们上述提到的情况里,out变量来自于vertex shader,然后到fragment shader变为in变量。当然,顶点属性(attribute)变量可以当做vertex shader的in变量。

常数变量(const),这个就不用多做介绍了吧,和你理解的常量是一个意思。

了解了变量种类,来看看GLSL语言的风格。其实GLSL某种意义上更像是C语言为图形学的一种扩展语言。比如也有 int, ivec2, ivec3, ivec4,float, vec2, vec3, vec4 ,bool, bvec2, bvec3, bvec4等类型。vector的元素可以通过"."来获取,比如c1.rgba= c2.abgr 。当然也有不一样的部分,比如没有string类型,没有枚举enums,当然更没有指针,并且数组也只能用一维数组。

这里介绍一个GLSL的操作discard,片元丢弃。这是用在片元着色器进行丢弃当前片元的,效果如下:

我们刚刚提到还有其他类型的shader,比如细分着色器(Tessellation Shader),几何着色器(Geometry Shader)等,但我们的材料只会提及顶点和片元着色器,其他的不会涉及,之后有时间可能会做一组专门关于shader的教程,那时候会设计这些着色器。我们看下shaders的流程图吧:

接下里进入正题,首先从顶点着色器开始。

6.3 着色器示例代码
顶点着色器(Vertex Shader),会进行顶点变换,法线变换,法线归一化,计算顶点光照,以及得到顶点的纹理坐标并将其传到片元着色器。

内置的Vertex Shader变量主要用到的有:

vec4 gl_Vertex
vec3 gl_Normal
vec4 gl_Color
vec4 gl_MultiTexCoord0
mat4 gl_ModelViewMatrix
mat4 gl_ProjectionMatrix
mat4 gl_ModelViewProjectionMatrix
mat4 gl_NormalMatrix (this is the transpose of the inverse of the MV matrix)

vec4 gl_Position

片元着色器(Fragment Shader),会进行颜色的计算,纹理映射,处理片元光照操作,还有颜色的融合以及片元丢弃等操作。

内置的Fragment Shader变量主要用到的有:

vec4 gl_FragColor

这样就可以写出一个最简单的vertex shader和fragment shader:

在vertex shader中有gl_ModelViewProjectionMatrix gl_Vertex这么一句话,其实可以分开,写成gl_ProjectionMatrix gl_ModelViewMatrix gl_Vertex,但是变换每个顶点时,投影矩阵都将乘上模型视图矩阵,这显然非常浪费时间,因为这些矩阵不是随每个顶点变化的。所以GLSL提供一些派生的矩阵,也就是说gl_ModelViewProjectionMatrix是上面两个矩阵的乘积,所以便写成gl_ModelViewProjectionMatrix gl_Vertex。

原文地址:https://blog.51cto.com/14528075/2438276

时间: 2025-01-17 09:23:00

拓幻图形学工程师教学手册(第八讲)|一字一字敲出OpenGL学习教程的相关文章

拓幻图形学工程师教学手册(第四讲)|一字一字敲出OpenGL学习教程

上一讲已经介绍了基础的OpenGL知识和绘制方面的内容.示例代码都会在我们公司Github找到.Github请搜索Tillusory可以看到.代码都是有注释的,运行环境是Mac OSX的Xcode.win版本的童鞋可以下下来之后放到VS中跑,环境搭建资料很多,有问题的可私信微信公众号. 纹理映射4.1 基本概念上一讲提到绘制太阳系,那么只是学了上一讲,最多就是画几个球,移动位置,做各种旋转运动等等,这怎么是太阳系.太阳,和各大行星至少要有表面图案吧,那么怎么把这些图案覆盖到球体表面呢? 先来了解

拓幻图形学工程师教学手册(第六讲)|一字一字敲出OpenGL学习教程

上一讲已经介绍了的OpenGL纹理部分的内容,今天这讲关于OpenGL光照(Lighting)示例代码也都在公司github共有仓了,不知道各位是不是试着跑过,没跑过也不要紧,继续往下听吧,最后总要实践的,讲再多不如自己上手一试.我记得Dr. Lee当初还做了蛮多不错的示例代码,比如旋转的五彩菊花,回头我让他贡献一下他的五彩菊花,放到我们的Github上给大家参考.后期Dr. Lee也将推出一些他自己的教程,这可是来自美国克莱姆森大学的教程,大家不要错过,关注我们微信公众号,一起来学习吧. 光照

拓幻图形学工程师教学手册(第一讲)|一字一字敲出OpenGL学习教程

动机首先申明,我是拓幻科技图形处理工程师,自己接触OpenGL,图形图像等方面也有六年多了,很多人其实并不了解这方面,也不了解如何系统地去学,我觉得基于我硕士时期的课程和经验给大家.这些资料和经验也得感谢我的老师,来自普渡大学的终生教授迈克 贝利(Mike Bailey). 以此连载OpenGL学习教程,给大家讲解,一起学习一下,不对之处,欢迎大家指出讨论. 所有渲染工作都离不开OpenGL, 着色器(Shader)这些,如果你和我一样对图形处理比较感兴趣的话,可能你和当初的我有着同样的困惑:如

拓幻图形学工程师教学手册(第二讲)|一字一字敲出OpenGL学习教程

上一节我们提到过模型变换时有旋转操作,那么在坐标系中,旋转的方向是怎样呢?比如旋转90度,到底向左是正还是右是正呢?我们可以用右手法则来进行正方向判断:图中所示就是右手坐标系中旋转正方向. 3.3 3D绘制下面到代码讲解.最基础的图形学,总要先画最基础的图形吧,那么现在来看以下代码: 看到glBegin括号里GL_LINE_STRIP了吗?顾名思义,画的是一条连线.glVertex3f是用来绘制顶点,坐标为括号里的值,这里我们画了v0,v1,v2,v3,v4 四个顶点,并将其按照顺序连接成以v0

Stanford机器学习---第八讲. 支持向量机SVM

本文原始文章见http://blog.csdn.net/abcjennifer/article/details/7849812,本文添加了一些自己的理解 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学习系统设计.SVM(Support Vector Machines 支持向量机).聚类.降维.异常检测.大规模机器学习等章节.所有内容均来自Sta

16位汇编第八讲指令第四讲

16位汇编第八讲指令第四讲 一丶串操作类指令 1.什么是串操作? 1.串操作指令是8086指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,在操作主存连续区域 的数据是,特别好用.因而比较常用 简而言之,就是内存中的一段数据,拷贝/读取/修改... 到另一块另内存 重点掌握  MOVS  STOS  LODS CMPS SCAS REP 2.串操作的简介 1.串操作指令的操作数,是驻村中连续存放的数据串(String 注意string表示串的意思)--也就是一段数据在内存中 是连续的,

《上古天真论》第八讲文字版

上古天真论篇第八讲 主讲:徐文兵  主持:梁  冬 播出时间:2009-01-24  23:00—24:00 经文:丈夫八岁,肾气实,发长齿更:二八,肾气盛,天癸至,精气溢泻,阴阳和,故能有子:三八,肾气平均,筋骨劲强,故真牙生而长极 梁冬:是的,重新发现,中医太美.大家好,欢迎收听今天晚上的<国学堂>.我是梁冬,对面的依然是,让我很兴奋的,厚朴中医学堂堂主徐文兵老师.徐文兵老师,您好! 徐文兵:梁冬好!听众朋友们过年好,该过年了. 梁冬:诶!差不多.诶,上一期的时候呢,我们讲到了这个,女子啊

《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示

原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与PageLayoutControl同步 第四讲 状态栏信息的添加与实现 第五讲 鹰眼的实现 第六讲 右键菜单添加与实现 教程Bug及优化方案1 第七讲 图层符号选择器的实现1 第七讲 图层符号选择器的实现2 第八讲 属性数据表的查询显示 摘要:这一讲中,我们将实现图层属性数据表的查询显示.在ArcMap中,单击图层右

第八讲:HTML5中canvas实现小球击打小方块游戏

源代码:http://download.csdn.net/detail/liumingm900913/7469969 游戏开发流程: 1.创建画布: 将画布放在div标签里面,这样可以控制画布居中的位置,在对div标签加上一些样式,利于观看 <div id="main"> <!--将画布嵌在div块里面,使其可以居中--> <canvas id="liuming_canvas" width="300px" heigh