第一部分:ios下的红宝书的第一个程序修改办法:
参照地址:http://leohope.com/解问题/2017/04/19/OpenGLon-macOS/
第二部分:着色器基础(红宝书第二版第八章)
总结一下自己看的内容:
(1)OpenGL的可编程管线的四个处理阶段
A. Vertex shading stage
B. tessellation shading stage
C. geometry shading stage
D. Fragment shading stage
E. Compute shading stage
(2)变量(声明、初始化、构造函数、聚合类型、结构体、数组)
(3)存储限制符 需注意的点:
(4)语句
算术符操作:注意操作符与优先级
操作符重载:GLSL中的操作符大部分都是经过重载的,也就是说他们可以应用于多种类型的数据操作
流控制:if-else;switch
循环语句:支持C语言形式的for、while、do……while
流控制语句:除与C语言相同的break、continue、return之外,注意discard是丢弃当前的片元,终止着色器的执行,用于当前的着色器中
函数:变量名需要加访问修饰符
参数限制符:
in:将数据拷贝到函数中
const in:将只读数据拷贝到函数中
out:从函数中获取数值
inout将数据拷贝到函数中,并且返回函数中修改数据
(5)计算不变性:
有两种方法来确保着色器之间的计算不变性
A.invariant:可以设置任何着色器的输出变量。可以确保如果两个着色器的输出变量使用了同样的数值,最终输出的数值相同
eg:invariant gl_Position;
invariant centroid out vec3 Color;
B.precise:可设置计算中任何变量或者函数的值
(6)着色器的预处理
宏定义:不支持字符串的替换以及预编译链接符
#ifdef
#endif
(7)数据块接口:着色器各阶段之间的共享变量可以组织为变量块的形式
uniform:
如果要对uniform块总的uniform变量进行初始化,第一步就是要找到块所在的索引位置
GLuint glGetUniformBlockIndex(GLuint Program,const char *UniformBlockname )
之后需要一个缓存对象与这个块进行关联,最常见的就是调用void glBindBufferRange()如果uniform块全是使用缓存来存储的,n那么可以使用glBindBufferBase()
Buffer块:着色器的存储缓存对象:着色器可以写入buffer块,修改其中的内容并且呈现给其他的着色器或者调用应用程序本身
可以在渲染之前决定他的大小,而不是编译和链接的时候。
in/out块
(7)着色器编译:
创建编译器:glCreatShader()
将着色器的源码关联到这个对象上glShaderSource()
编译着色器对象的源代码 glCompileShader()
返回shader的编译结果:void glShaderInfoLog()
当创建并链接了所有必要的着色器对象之后,
下一步就是链接他们已创建一个可执行的着色器程序 GLuinx glCreatProgram()
下一步关联的必要的着色器上glAttachShader()移除的着色器glDetachShader()
下一步就可以链接对象生成可执行的程序,要调用函数glLinkProgram()
查询链接操作的结果:glGetProgramiv(),获取链接日志信息并且判断错误原因:glGetProgramInfoLog()
如果我们成功地完成了程序的链接,那么就可以调用函数glUseProgram(),并且参数设置为程序对象的句柄来启用顶点或者片元程序
最后,当着色器任务完成之后,通过glDeleteShader()将它删除