GLSL基本类型
float: 32位
double: 64位
int: 有符号二进制补码的32位整数
uint:无符号的32位整数
bool: 布尔值
存储限制符
const:必须在声明时就初始化,只读类型,编译时常量
in:着色器阶段的输入变量
out:输出变量
uniform:必须定义为全局变量,不会在图元处理过程中发生变化,在所有可用的着色器阶段是共享的
buffer:设置应用程序共享的一块可读写内存,也可作为存储缓存
shared:只能用于计算着色器中,设置变量在本地工作组中是共享的
参数限制符
in:将数据拷贝到函数中(默认)
const in:将只读数据拷贝到函数中
out:从函数中获取
inout:将数据拷贝到函数中,并返回函数中修改的数据
着色器的编译过程
对于每个着色器对象: 1)创建着色器对象
2)将着色器源码编译为对象
3)验证编译是否成功
对于每个着色器程序:1)创建着色器程序
2)将对象和程序关联
3)链接着色器程序
4)判断是否链接成功
5)使用着色器来处理顶点和片元
glCreateShader();
glShaderSource();
glCompileShader();
glGetShaderInfoLog();
glCreateProgram();
glAttachShader();
glLinkProgram();
glGetProgramInfoLog();
glUseProgram();
载入Shader
ShaderInfo shaders[] =
{
{ GL_VERTEX_SHADER, "media/shaders/triangles/triangles.vert" },
{ GL_FRAGMENT_SHADER, "media/shaders/triangles/triangles.frag" },
{ GL_NONE, NULL }
};
GLuint program = LoadShaders( shaders );
glUseProgram( program );
着色器子程序
....
glUseProgram(pro);
myShaderLoc = glGetSubroutineUniformLocation(pro, GL_VERTEX_SHADER, "C:\") //获得子程序位置
myIndex = glGetSubroutineIndex(pro, GL_VERTEX_SHADER); //获取子程序在着色器中的索引号
glUniformSubroutinesuiv(GL_VERTEX_SHAER,n,a); //指定执行哪一个子程序