1、在OpenGL3.0(包含3.0)前,或者使用兼容模式(compatibility profile)环境,OpenGL还包含一个固定功能管线(fixed-function pipeline),这时可以在不编写着色器的情况下处理几何与图像数据。但是从OpenGL 3.1开始,固定功能管线从核心模式中去除,这时处理几何与像素数据就需要编写着色器。

2、4.3版本的图形管线有4个处理阶段,1个通用计算阶段,每个阶段由一个专门的着色器进行控制。

1)顶点着色器(vertex shader)将接受从CPU发送到GPU的顶点数据(顶点坐标、纹理坐标、法线等),独立处理一个顶点,也就是画一个三角新有三个顶点,那么顶点着色器就需要执行,画一条线两个顶点那么只需要执行两次。这个阶段对于OpenGL程序是必须的。

2)细分着色器(tessellation shader)是一个可选阶段,它的作用主要是接受vertex shader的输出经过给定的算法生成新的图元,可用于实现LOD。

3)几何着色器(geometry shader)是一个可选的阶段,它的输入是一个图元,指定 points 就是点、lines 就是这个线的两个端点,这些图元是vertex shader 、tessellation shader的处理结果。初学者可能会有这样的疑惑,只有一个顶点数据是如何画出一个三角形的,这种功能都可以通过tessellation shader、geometry shader完成。

4)片元着色器(fragment shader)处理的是光栅化后的独立片元,也就是像素,这也是OpenGL程序必须的阶段。这个阶段之后会进行各种片元测试混合,经过各种计算得出最后需要显示在电子屏幕上的信息。

5)计算着色器(compute shader)在程序中相对独立,它处理的是程序给定的范围内容,能够处理其它着色器创建或使用的缓存数据,并不是图形管线中的一部分。

3、OpenGL shader 编写语言为 OpenGL Shading Language(GLSL),它与 C 非常相似。

4、计算的不变性:GLSL无法保证不同的着色器之间,相同的计算式相同的输入能够得到完全相同的输出,因为不同的优化方式可能导致非常细微的差异。为此,GLSL使用两种方式确保着色器之间的计算不变性,invariant与precise,但是这种方法无法解决CPU 端与GPU端之间这种差异。如下:

unifrom float ten; //由应用程序传入的10.0f

const float sten = sin(10.0f);

void main()

{

float aten = sin(ten);

  if (aten == sten) // 这里因为经过了各自的优化,可能导致不相等

}

1)invariant 限定符可以设置任何着色器的输出变量来确保计算的不变性,当然代价是去除一些GLSL编译器会执行的优化。在调试过程中,可能需要将所有的变量都声明为invariant,可以通过#pragma STDGL invaraint(all) 完成。

2)precise 限定符可以修饰任何计算中的变量或者返回值,通过它增加计算的可复用性,通常在tessellation shader中使用来避免几何体间的裂缝。precise修饰后不能使用两种不同的乘法命令来同时参加计算,但是混合乘加运算对于性能提升非常重要,所以GLSL提供了一个内置函数fma()来代替。

pre:float f = a * b + c * d;(float x = a * b; float f = c * d + x;后面这个算是就是所谓的混合乘加算式)

cur: precise float f; float temp = a * b; f = fma(c, d, temp);

5、uniform 块只能包含透明类型变量与在全局作用域声明,uniform 块的写法:

1)uniform block

{

vec4 v1;

bool v2;

};//访问成员使用的是v1、v2

2)uniform block

{

vec4 v1;

bool v2;

}name;//访问成员使用name.v1、name.v2

6、GLSL中的buffer块,SSBO(shader storage buffer object)的行为类似于uniform块,但 SSBO 对于着色器是可读可写的,再者,它可以在渲染前决定大小而不需要在编译与链接的时候。着色器可以通过length()方法获取渲染是的数组大小。

eg:buffer BufferObject

{

int a;

vec4 points[];//后面这个成员没有给出数组长度,类似于 C 结构体的那个零长数组

};

7、GL_INFO_LOG_LENGTH  glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &length);

8、GLSL的子程序有点像函数指针,是4.0新增的内容,需要支持扩展 ARB_shader_subroutine

1)定义 subroutine returnType subrotineType(paramType......),returnType可以是任何类型的函数返回值,subroutineType是一个子程序名称,像用 typedef 定义了一种类型

2)定义内容 subroutine (subroutineType) returnType functionName(paramType......)

3)指定一个子程序uniform变量,subroutine uniform subroutineType variableName;

eg:使用子程序实现一个漫反射与环境光照方式动态选择

subroutine vec4 LightFunc(vec3);

subroutine (LightFunc) vec4 ambientCalc(vec3 n) { return Material.ambient; }

subroutine (LightFunc) vec4 diffuseCalc(vec3 n) { return Material.diffuse; }

subroutine uniform LightFunc lightShader;

一个子程序可以同时属于多个类型

在应用程序中,使用GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const char* name)来获取子程序的索引位置,

接下来就要查找子程序实例的索引GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const char* name),

使用GLuint glUniformSubroutinesuiv(GLenum shadertype, GLsizei count,const GLuint* indices)来激活子程序的这些实例,count是子程序实例的个数,indices是子程序实例的索引数组,

最后使用glUniformSubroutinesuiv指定执行哪一个子程序实例。

需要注意的是,每一次调用glUseProgram后,都会重新设置所有子程序uniform的值。

OpenGL 编程指南 (1)的更多相关文章

  1. OpenGL编程指南(第七版)

    OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...

  2. 编译opengl编程指南第八版示例代码通过

    最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...

  3. VS15 openGL 编程指南 配置库 triangle例子

    最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...

  4. [转]OpenGL编程指南(第9版)环境搭建--使用VS2017

    1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...

  5. opengl编程指南

    第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口.        1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(m ...

  6. OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)

    1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> ...

  7. OpenGl编程指南第7版(红宝书)环境配制

    环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...

  8. OpenGL编程指南(第九版) Tiangles 学习笔记

    ////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...

  9. 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法

    解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...

  10. Opengl编程指南第二章:状态管理、几何绘图

    //http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...

随机推荐

  1. warning: LF will be replaced by CRLF in

    warning: LF will be replaced by CRLF in analysis/Result.csv. The file will have its original line en ...

  2. WebStorm 2019.3.1 永久破解

    PS:动手能力强的来,手残的去淘宝买吧,大概15块钱1年.建议看完后在动手,有一个全局观,浪费不了多少时间 一. 下载破解补丁文件 链接:https://pan.baidu.com/s/16-rPPH ...

  3. MySql优化之存储引擎和sql优化

    存储引擎 使用的存储引擎 myisam / innodb/ memory myisam 存储: 如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用myisam存储引擎. ,比如 bbs 中的 ...

  4. .Net 程序代码混淆加密工具 ILProtector

    我的项目中某一部分信息比较敏感,但是.Net程序反编译之后连注释都看得到.需要把exe保护起来,如:代码混淆之后再加壳. Bing到一款.Net混淆工具  ILProtector   作为资深工具党, ...

  5. Bash脚本编程学习笔记05:用户交互与脚本调试

    用户交互 在<学习笔记04>中我们有提到位置参数,位置参数是用来向脚本传递参数的一种方式.还有一种方式,是read命令. [root@c7-server ~]# read name alo ...

  6. word中模板的使用

    新建一个word文档,修改样式库中的样式,比如各章节的标题正式格式.设计好后,将文件保存为word模板. 一般自定义的模板默认保存在”C:\Users\lizhe\Documents\自定义 Offi ...

  7. AcWing1296. 聪明的燕姿

    聪明的燕姿 解题思路: 首先我们肯定要用到约数之和定理 但是有个问题就是要怎么用 根据经验得知,约数最多也就六七个左右,不然直接就超了s的范围.所以我们考虑用爆搜来做 但是用爆搜的话还是要优化一下思路 ...

  8. python 3.6 安装 opencv 3.4

    一种说法是,到opencv官网下载相应的版本opencv,解压,把cv2.pyd放到 python安装文件夹下的\Lib\site-packages里即可, 此时import cv2即可成功 我的没有 ...

  9. JS 数组常见操作汇总,数组去重、降维、排序、多数组合并实现思路整理

    壹 ❀ 引 JavaScript开发中数组加工极为常见,其次在面试中被问及的概率也特别高,一直想整理一篇关于数组常见操作的文章,本文也算了却心愿了. 说在前面,文中的实现并非最佳,实现虽然有很多种,但 ...

  10. ECMAScript基本对象——RegExp 正则表达式对象

    含义:定义字符串的组成规则 使用: 1.定义单个字符:[ ] [a] 表示有一个字符是  小写的a [ab] 表示有一个字符是  小写的a或者b [a-z] 表示有一个字符是  小写的a到z [a-z ...