1.着色器

  着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上说,着色器

只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能互相通信;

 着色器之间唯一的沟通只有通过输入和输出;

2.GLSL

  着色器是用一种叫GLSL(OpenGL Shader Luanguage) 的类C语言写成的。

  典型的着色器结构如下

    #version version_numberin type in_variable_name;in type in_variable_name;out type out_variable_name;uniform type uniform_name;int main(){// 处理输入并进行一些图形操作...// 输出处理过的结果到输出变量out_variable_name = weird_stuff_we_processed;}

   特别对于顶点着色器,每个输入变量也叫顶点属性(Vertex Attribute)。我们能声明的顶点属性是有上限的,一般由硬件决定。

   OpenGL确保至少有16个包含4分量的顶点属性可用,有些硬件或许允许更多的顶点属性,可以查询GL_MAX_VERTEX_ATTRIBS来获取具体上限:

    int nrAttributes;glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes);std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes << std::endl;

3.数据类型

  GLSL有数据类型可以来指定变量的种类。

  数据类型: int、float、double、uin(unsigned int )t、bool;

  容器类型: Vector、Matrix;

4.向量

  GLSL中的向量是一个可以包含有1、2、3或者4个分量的容器,分量的类型可以是前面默认基础类型的任意一个。它们可以是下面的形式(n代表分量的数量):

类型 含义
vecn 包含n个float分量的默认向量
bvecn 包含n个bool分量的向量
ivecn 包含n个int分量的向量
uvecn 包含n个unsigned int分量的向量
dvecn 包含n个double分量的向量

  大多数时候我们使用vecn,因为float足够满足大多数要求了。

5.输入输出

  我们希望每个着色器都有输入和输出,这样才能进行数据交流和传递。

  GLSL定义了inout关键字专门来实现这个目的。每个着色器使用这两个关键字设定输入和输出,只要一个输出变量与下一个着色器阶段的输入匹配,它就会传递下去。

  但在顶点和片段着色器中会有点不同。

  顶点着色器应该接收的是一种特殊形式的输入,否则就会效率低下。顶点着色器的输入特殊在,它从顶点数据中直接接收输入。

  为了定义顶点数据该如何管理,我们使用location这一元数据指定输入变量,这样我们才可以在CPU上配置顶点属性。

  我们已经在前面的教程看过这个了,layout (location = 0)顶点着色器需要为它的输入提供一个额外的layout标识,这样我们才能把它链接到顶点数据。

你也可以忽略layout (location = 0)标识符,通过在OpenGL代码中使用glGetAttribLocation查询属性位置值(Location),但是我更喜欢在着色器中设置它们,这样会更容易理解而且节省你(和OpenGL)的工作量。

  另一个例外是片段着色器,它需要一个vec4颜色输出变量,因为片段着色器需要生成一个最终输出的颜色。

  如果你在片段着色器没有定义输出颜色,OpenGL会把你的物体渲染为黑色(或白色)。

6.Uniform

  Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,但uniform和顶点属性有些不同。

  首先,uniform是全局的(Global)。全局意味着uniform变量必须在每个着色器程序对象中都是独一无二的而且它可以被着色器程序的任意着色器在任意阶段访问

  第二无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新。

  顶点着色器中不需要这个uniform,所以我们不用在那里定义它。

  

如果你声明了一个uniform却在GLSL代码中没用过,编译器会静默移除这个变量,导致最后编译出的版本中并不会包含它,这可能导致几个非常麻烦的错误,记住这点!

  当我们在着色器中定义了Uniform后,我们还没有给它添加任何数据,所以下面我们就做这件事。

  我们首先需要找到着色器中uniform属性的索引/位置值。当我们得到uniform的索引/位置值后,我们就可以更新它的值了。

  这次我们不去给像素传递单独一个颜色,而是让它随着时间改变颜色:

  

  float timeValue = glfwGetTime();float greenValue = (sin(timeValue) / 2.0f) + 0.5f;int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");glUseProgram(shaderProgram);glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);

  

转载于:https://www.cnblogs.com/Ziyo/p/9900245.html

OpenGL学习整理------着色器相关推荐

  1. OpenGL学习之着色器详解

    OpenGL着色器语言(GLSL)看上去很像C语言,它由OpenGL实现进行编译和连接,并且(经常是)完全在图形硬件中运行. 我们有顶点着色器.片段着色器和几何着色器,前两种是必需的,后一种是可选的. ...

  2. 第二十二章 opengl之高级OpenGL(几何着色器)

    OpenGL 使用几何着色器 用点造物体 爆破物体 法向量可视化 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader), 几何着色器的输入是一个图元(如点或三角形)的一组顶点 ...

  3. OpenGL ES _ 着色器_片断着色器详解

    OpenGL ES _ 入门_01 OpenGL ES _ 入门_02 OpenGL ES _ 入门_03 OpenGL ES _ 入门_04 OpenGL ES _ 入门_05 OpenGL ES ...

  4. OpenGL ES像素着色器

    OpenGL ES像素着色器 原文   http://www.tairan.com/archives/7509 目 录 准备开始 像素着色器 vs 顶点/片段着色器 像素着色器101:渐变 像素着色器 ...

  5. OpenGL ES像素着色器教程

    OpenGL ES像素着色器教程 时间 2014-08-27 09:54:51   泰然 原文   http://www.tairan.com/archives/7509 主题  OpenGL ES ...

  6. Opengl ES之着色器

    前言 在前面我们介绍了 OpenglEs之EGL环境搭建 ,在后面的例子中,我们将无可避免地需要使用到着色器.而着色器才是Opengl的灵魂所在,有了着色器才有了Opengl天马行空的世界. 图形渲染 ...

  7. 从头开始学习Unity着色器

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确)|时长:56节课(4h 26m) |大小解压后:2.89 GB ...

  8. OpenGL在frag着色器中模拟手电筒效果

    在[OpenGL在frag着色器中模拟点光源]的基础上进行修改,得到手电筒效果(https://blog.csdn.net/qq_37340753/article/details/105029079) ...

  9. OpenGL使用计算着色器进行布料模拟

    OpenGL使用计算着色器进行布料模拟 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include &quo ...

  10. OpenGL使用计算着色器进行GPU光线跟踪

    OpenGL使用计算着色器进行GPU光线跟踪 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include & ...

最新文章

  1. ubuntu18.04 -- 创建第一个Django项目
  2. 新上线的APP怎样推广才更获客呢?
  3. 红米note7html5测试,红米Note 7 Pro评测:千元王者名副其实
  4. GCC vector 叠加示例
  5. AUTOCAD输出打印图片格式时空白
  6. CSS字体和文本相关
  7. html flv swf,支持SWF和FLV视频格式的焦点图代码
  8. 8个PNG素材网站,每一个都让你觉得人生发亮
  9. 专访SOSO街景地图:寻找工具性产品突破的机遇
  10. 如何理解js中的this
  11. Anaconda3\Scripts\activate.bat 不是内部或外部命令,也不是可运行的程序的问题处理方法
  12. Python杀死Excel?众多模块哪家强
  13. 淘宝购物折扣秒杀分享群淘宝红包怎么抢
  14. 中国故事 张亚勤 访谈
  15. 我拿到了北京户口!却是跌落的开始....
  16. 地图叠加图切片:使用配准点使叠加图片精确匹配到地图
  17. YMIR-从源代码部署到页面实操
  18. SQL中的DECIMAL()函数
  19. Vue element 下拉框 可输入可选择(无bug)
  20. 2023 Data数据分析岗前景如何?0基础学习数据分析成功上岸,3个月掌握令人惊叹的sql能力!...

热门文章

  1. QT调用WIN32 API代码,遇到无法解析
  2. YouTube广告 || 一次性让你了解个够
  3. SAP中通过历史记录查询追溯BOM工程变更处理物料升级未生效问题实例
  4. IDM 6.40.11.2 弹窗的解决思路
  5. Android Studio报错Error:java.lang.RuntimeException: Crunching Cruncher xx.png failed, see logs
  6. 计算机研究计划怎么写,课题研究计划书范文
  7. 超简单的动图制作、利用ps制作简单的动图、把动图导入我们的博客中;
  8. 怎样修改用户的计算机配置文件,用户配置文件
  9. CSS 的相对单位 em 与 ex
  10. 金融资产收益率计算中百分比收益率和对数收益率有什么区别?