写在前面的废话:今天俺又来了哈哈,真的好棒棒!

今天的内容:之前我们大概描述了,我们自己定义的顶点坐标是如何被加载到GPU之中,并且介绍了顶点缓冲对象VBO用于管理这一块内存。今天开始详细分析它的具体作用和用法。

首先OpenGL要求我们必须拥有一个顶点着色器和一个片段着色器,这样才可以进行渲染。当然这两个是必须经过编辑才能使用,而编辑所用的语言是GLSL(OpenGL Shading Language),然后编译这个着色器,这样我们就可以使用了。

举个例子像这样,

这是一个稍微复杂的顶点着色器的编写,大家可以先只看layout(location=0) in vec3 position.这一句我一步步向后解释。但在此之前我们#version 330 core表示的是我们所用的GLSL版本号是3.3 这个版本号要与我们之前在程序开头所用到的opengl的版本一致才可以。

接下来,进入顶点着色器的定义部分,in 在这被Xcode 理解成关键字,和后面out相对应,这里有点像hardwaresimulator里面的in 和out 他们分别表示了顶点着色器输入和输出所特定的数据类型。这里用到的数据类型都是向量型的,比如vec3 表示一个空间向量(即x,y,z),vec2表示的则是一个平面向量(x,y)。例如:这里第一行  in vec3 position 表示这个position这个变量是一个空间向量并且作为输入顶点着色器的存在。

layout(location=0)这里我暂时不解释,等下能提到。

注意你可能看到了一个叫vec4 的东西,这个地方插嘴补一句:在GLSL中一个向量有最多4个分量,每个分量值都代表空间中的一个坐标,它们可以通过vec.xvec.yvec.zvec.w来获取。注意vec.w分量不是用作表达空间中的位置的(我们处理的是3D不是4D),而是用在所谓透视划分(Perspective Division)上。当然这个还算是比较简单的,以后会有更为复杂的顶点着色器。

在这之前,提一下由于我这里已经学到后面独立文件里创建shader,刚入门的朋友们建议暂时把它们放到一个字符串中如下图。这样的目的是接着介绍如何编译这个着色器,也能让大家更加了解这一步。

之前我们已经编辑好了着色器的内容,接下来要编译他们,这样OpenGL才能实时动态使用他们。

先看代码

首先第一步,我们需要创建一个着色器对象,这里按照我的理解,OpenGL为我们封装好了很多编译所需要的东西,我们只需要先创建一个容器(也就是我们的顶点着色器),然后把我们具体操作放入其中,再编译即可。

所以这里参数写顶点着色器。

而在这之后,就到了向容器(vertexShader)里面放内容的步骤了。这里用到glshaderSource函数,首先 第一个参数表示我们容器的名字,第二个参数表示我们所装入的内容的长度,由于只有一个字符串,所以这里填1, 第三个参数就是我们之前的字符串的头指针,第四个直接写NULL。

为了保险,大家可以加上一个检测步骤,让程序运行的时候帮我检查这个顶点着色器是否书写正确。

GLuint success;  //这个整形用于表示是否编译成功

GLchar infoLog[512]; //这个数组用于储存错误信息

glGetShaderiv(vertexShader,GL_COMPILE_STATUS,&success);//通过这个函数可以给success 赋值,如果编译通过则赋值1 失败赋值0

接下来判断success 的值

if(!success)

{

glGetShaderInfoLog(vertexShader,512,NULL,infoLog);

  std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;

}

ok ,以上就是顶点着色器的编辑和编译部分。接下来介绍片段着色器。

同样先创造一个空的容器.. 其他步骤与顶点着色器一致,代码如下。

接下来则是片段着色器的内容了。

#version 330 core out vec4 color; void main() { color = vec4(1.0f, 0.7f, 0.3f, 1.0f); }

简单给定一个RGBA格式的颜色即可。

好的,到目前为止,我们两个重要的着色器就完成了,接下来让我们把这两个单独的程序连接到一起,从而成为一个着色器程序对象(Shader Program Object )

正如之前介绍到的,渲染管线其实是一个阶段连着下一个阶段所形组成的,而现在我们所需要的程序对象,它的功能就是把我们之前定义的两个着色器的in和out链接起来,让他们可以相互完成传递。打个比方来说,两个着色器可以看作两个流水线上的工人,他们一个在前一个在后处理流水线上的东西,当前一个人交接任务给后一个人的时候,我们还没给定这个交接的时候统一接口。(前一个shader的out 是否作为后一个shader的in)

和之前创建着色器类似,代码如下:

唯一要注意的就是glAttachShader()函数的两个参数,第一个是目标程序,第二个是着色器。

好的今天暂时到这里,明天或者后天我将更加详细的解释下VBO以及后面的VAO。

Opengl_入门学习分享和记录_02_渲染管线(一)顶点着色器&片段着色器的更多相关文章

  1. Opengl_入门学习分享和记录_02_渲染管线(一)顶点输入

    现在前面的废话:最近好事不断!十分开心!生活真美好! 好了今天要梳理一下,顶点输入的具体过程,同样也是渲染管线中的第一个阶段的详细过程的介绍.之前介绍过,OpenGL操作的是一组3D坐标,所以我们的输 ...

  2. Opengl_入门学习分享和记录_03_渲染管线(二)再谈顶点着色器以及顶点属性以及属性链接

    ---恢复内容开始--- 写在前面的废话:岂可修!感觉最近好忙啊,本来今天还有同学约我出去玩的.(小声bb) 正文开始:之前已经编译好的着色器中还有一些问题,比如 layout(location=0) ...

  3. Opengl_入门学习分享和记录_03_渲染管线(三)借助顶点数组对象VAO提高绑定属性效率

    目前我们已经知道了,如果想要顶点着色器解释理解我们的输入数据,就必须要按照以下繁琐的步骤:第一步:将输入的数据复制一份到缓冲区,供OpenGL使用.而这块新出现的区域由VBO管理和表示.(若有多个输入 ...

  4. Opengl_入门学习分享和记录_01_Graphics Pipeline(图形渲染管线)

    写在前面的废话: 这个系列拖更了很久,很大一定程度上是由于自己最近忙着高数学习和线代学习..感觉时间特别紧缺(其实就是我太懒了)好了不废话了,总结开始. 正文开始: 首先Graphics Pipeli ...

  5. Opengl_入门学习分享和记录_00

    2019.7.4 本着对游戏创作的热情,本人初步了解了一部分的unity引擎的使用,也学习了一点C#可是越学习unity我就反而对引擎内部感兴趣(不知道有没有一样的朋友=,=). 接着了解到了open ...

  6. Opengl_入门学习分享和记录_番外篇01(MacOS上如何在Xcode 开始编辑OpenGL)

    写在前面的废话: 哈哈 ,我可真是勤勉呢,今天又来更新了,这篇文章需要大家接着昨天的番外篇00一起食用! 正文开始: 话不多说,先看代码. 这里主要全是使用的glfwwindowhint 这个函数,他 ...

  7. Opengl_入门学习分享和记录_番外篇00(MacOS上如何给Xcode 适配openGL)

    现在前面的废话:哇这次没有鸽太久,突然想起来还没有介绍如何适配opengl的衍生库.今天一并介绍下,同样看时间允不允许,让我再把之前学到的一些东西再次总结一遍. 正文开始: 首先大家要知道我们的Ope ...

  8. Redis入门学习(学习过程记录)

    Redis(入门笔记) 学习一个大的技术点,然后顺带着就把这个技术点的面试题给学习了. 学习完一个技术后,如果面试题还不能够解答的话,只能说明学的不精,需要查漏补缺. 下一个学习的方向:Redis-非 ...

  9. Bootstrap入门学习笔记(只记录了效果)

    基本头文件 <!DOCTYPE html> <html> <head> <title>Bootstrap 实例</title> <me ...

随机推荐

  1. Innovus教程 - Flow系列 - MMMC分析环境的配置概述(理论+实践+命令)

    本文转自:自己的微信公众号<集成电路设计及EDA教程> <Innovus教程 - Flow系列 - MMMC分析环境的配置概述(理论+实践+命令)>   轻轻走过,悄悄看过,无 ...

  2. Windows下GIT的使用方法

    文章引用自:Git使用教程    https://www.cnblogs.com/tugenhua0707/p/4050072.html 本文章只限用于Windows,敬请参考 注意:操作命令纯属手敲 ...

  3. 利用jenkins实现自动构建、部署,提升团队开发效率

    一大早就被群里的同学刷银川下雪的消息,看着我都发冷,突觉一阵凉风裹身,是不是该考虑秋裤了. 偏离主题,正文走起...... 使用jenkins目标:利用其结合maven完成自动构建,并部署到tomca ...

  4. 手写 Spring

    手写 Spring 不多说,简历装 X 必备.不过练好还是需要求一定的思维能力. 一.整体思路 思路要熟练背下来 1)配置阶段 配置 web.xml: XDispatchServlet 设定 init ...

  5. NOIP2018普及T4暨洛谷P5018 对称二叉树题解

    题目链接:https://www.luogu.org/problemnew/show/P5018 花絮:这道题真的比历年的t4都简单的多呀,而且本蒟蒻做得出t4做不出t3呜呜呜... 这道题可以是一只 ...

  6. 比赛:小奔的方案 solution

    题目 题目背景 有一个著名的题目: 五个海盗抢到了100个金币,每一颗都一样的大小和价值连城. 他们决定这么分: 1.抽签决定自己的号码 ------ [1.2.3.4.5] 2.首先,由1号提出分配 ...

  7. 一个测试文件与源文件位于不同模块时Jacoco覆盖率配置的例子

    问题描述: 我们有个多模块项目,由于种种原因(更常见的可能是需要集成测试)测试文件和源文件不在一个模块,Jacoco的覆盖率无法正确显示,查询了一些资料,发现中文的例子比较少,就把我自己的Demo贴一 ...

  8. webService 的使用

    webService Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些 ...

  9. python检测是否是质数

    python检测是否是质数 编写python脚本,使得实现以下功能: 输入一个整数,通过脚本判断出输入的这个数是否是质数,然后输出是否是质数. 脚本如下图所示: Num = input("P ...

  10. Intellij IDEA 出现“Usage of API documented as @since 1.8+”的解决办法

    转自 https://blog.csdn.net/qq_27093465/article/details/69372028 具体报错内容如下: This inspection finds all us ...