opengles3.0 学习(四)着色器:

opengles3.0 学习(四)着色器:
#version 300 es指明着色器的版本号:
变量声明:
float specularAtten;
vec4 vPosition;
mat4 mViewProjection;
ivec2 vOffset;



变量构造器:
float:myFloat = 1.0;

vec4 myVec4 = vec4(1.0); //myVec4 = {1.0,1.0,1.0,1.0}
vec3 myVec3 = vec3(1.0,0,0,0.5); //myVec3 = {1.0,0.0,0.5}
mat3 myMat3 = mat3(
1.0,0.0,0.0,
0.0,1.0,0.0,
0.0,0.0,1.0
)

mat4 myMat4 = mat4(1.0) 单位矩阵
vec4 col0 = myMat4[0];
float ml_1= myMat4[1][1];
float ml_2 = myMat4[2].z;

常量:

const float zero = 0.0
const vec4 red = vec4(1.0,0.0,0.0,1.0);
const vec4 indentity = mat4(1.0)


结构:
struct fogStruct {
vec4 clolor;
float start;
float end;

} fogVar;


fogVar = fogStruct(vec4(0.0,1.0,0.0,0.0), 0.5,2.0);


运算:
opengles着色器语言对运算符有严格的类型要求,运算符只能出现再有有相同的基本类型的变量之间。

函数:
函数不支持递归。


统一变量:

统一变量存储应用程序通过OPENGL API 传入着色器的只读值。对于 保存着色器所需的由所有的数据类型(如变换矩阵,照明参数和颜色);
uniform mat4 viewProjMatrix;
uniform mat4 viewMatrix;
uniform vec3 lightPositiong;

统一变量通常保存再硬件中,这个区域被称作常量存储,是硬件中为存储变量值二分配的特殊空间。因为常量存储的大小一般是固定的,所以程序中可以使用的统一变量数量受到限制。可以通过读取gl_MaxVertexUniformVectors和gl_MaxFragmentUniformVectors的值来确定。opengles实现必须提供至少256个顶点统一比昂了和224片段的统一向量。但是也可以提供更多。

uniform TransformBlock {
mat4 matViewProj;
mat3 matNormal;
mat3 matTexGen;

};
layout(location=0) in vec4 a_position;
void main() {
gl_Position = matViewProj*a_position;
}

顶点和片段着色器输入输出:
#version 300 es
uniform mat4 u_matViewProjection;
layout(location = 0)in vec4 a_position;
layout(location = 1) in vec3 a_color;
out vec3 v_color;
void main() {
gl_Position = u_matViewProjection*a_position
v_color = a_color;
}

每个顶点的输入用关键字in, a_position和a_color是由应用加载。底层硬件通常再可输入顶点着色器的属性变量数目上有限制。最大属性数量由内建变量
gl_MaxVertexAttribs 给出。

输出变量由out关键字,v_color被声明为输出变量,其内容从 a_color输入变量中复制而来,每个顶点着色器将在一个或则多个输出变量中输出所需要传递给片段着色器的数据。然后这些变量也会再片段着色器中声明为变量,再光珊化阶段中对图元进行线性插值。
顶点着色器输出/片段着色器输入变量不能有布局限定符。

//Fragment shader
precisiton mediump float;
in vec3 v_color;
layout(location=0) out vec4 o_fragColor;
void main() {

o_fragcolor = vec4(v_color,1.0) ;
}

layout(location=0) out vec4 o_fragColor;
片段着色器将输出一个或者多个颜色。再典型的情况下,我们只渲染到颜色缓冲区。再这种情况下,布局限定符是可选的,但是,当渲染到多个渲染目标时候,
我么可以使用布局限定符指定每个输出前往的渲染目标。


统一变量和插值器打包:
主要是为了节省变量空间


不变性:
【opengles3.0 学习(四)着色器:】invariant.

    推荐阅读