title: OpenGL(4)之着色器初探
date: 2020-06-30 18:10
category: 图形学
tags: opengl
OpenGL(4)之着色器初探
前言
着色器(Shader)是运行在GPU上的小程序,服务于OpenGL渲染管线的各个着色阶段【处理阶段(顶点着色阶段,细分着色阶段,几何着色阶段,片元着色阶段)和一个计算着色阶段】,是一种将输入转换为输出的程序,他们之间不能相互通信,
唯一的沟通就是通过输入in和输出out;
1.GLSL是什么?
GLSL是一种类C语言写成的,被GPU识别,因此是为图形计算量声定制的,包含对向量和矩阵操作的特性;
着色器的开头必须要声明版本,然后输入和输出变量,uniform(全局共享变量)和main函数;
每个着色器的入口点都是main函数,在这个函数中处理所有的输入变量,并将结果输出到输出变量中,通过输入输出,即可完成不同着色器语言之间的通信。
#version version_numner core
in type in_variable_name;
in type in_variable_name;
out type out_variable_name;
uniform type unform_name;
int main(){
//... 处理输入并进行一些图形操作
//...
// 输出处理过的结果到输出变量
out_variable_name = fun;
}
每个输入变量也叫顶点属性(Vertex Attribute),能声明的顶点属性是有上限的,
一般由硬件来决定,OpenGL确保至少有16个包含4分量(x,y,z,w)的顶点属性可用;可以查询GL_MAX_VERTEX_ATTRIBS来获取具体的上限值。
#define GL_MAX_VERTEX_ATTRIBS 0x8869=34921
int nAttributes;
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS,&nAttributes);
std::cout<<"Maximum nAttributes of vertex attributes supported:"<<nAttributes<<std::endl;
2.GLSL中的数据类型
-
基础类型:int、float、double、uint、bool
-
容器类型:Vector(向量)、Matrix(矩阵)
3.向量介绍
GLSL向量是一个可以包含1、2、3或者4个分量的容器,分量的类型可以是前面默认基础类型的任意一个,默认的是float类型分量
类型 | 含义 |
---|---|
vecn | 包含n个float分量的默认向量 |
bvecn | 包含n个bool分量的向量 |
ivecn | 包含n个int分量的向量 |
uvecn | 包含n个unsigned int分量的向量 |
dvecn | 包含n个double分量的向量 |
一个向量的分量可以通过vec.x方式获取,x指的是向量的第一个分量,
也可以通过vec.xy取出第一个第二个分量,vec.yz取出第二个第三个分量。
向量的重组: