OpenGL 着色器
在顶点着色器中,输入变量又叫顶点属性
以uniform申明的变量,是全局的,为任何着色器公用,可在非着色器文件中用glGetUniformLocation查询uniform的位置值而设置之
查询uniform地址不要求你之前使用过着色器程序,但是更新一个uniform之前你必须先使用程序(调用glUseProgram),因为它是在当前激活的着色器程序中设置uniform的。
能完成的功能:依据时间变化颜色
void * :A pointer to void is a “generic” pointer type. A void * can be converted to any other pointer type without an explicit cast. You cannot dereference a void * or do pointer arithmetic with it; you must convert it to a pointer to a complete data type first.
纹理
纹理坐标:左下角为(0,0),范围是0~1
如果将纹理坐标设置为范围之外,默认是重复这个纹理图片,也可设置其他的效果
在片元着色器中:FragColor = texture(ourTexture, TexCoord) // FragColor是传给片段着色器的颜色值,texture是内建函数,ourTextrue是采样器,TexCoord是从顶点着色器传来的纹理坐标
变换
先缩放再旋转最后位移
实际的变换顺序应该与阅读顺序相反:尽管在代码中我们先位移再旋转,实际的变换却是先应用旋转再是位移的。
坐标系统
我们之所以将顶点变换到各个不同的空间的原因是有些操作在特定的坐标系统中才有意义且更方便。
局部坐标通过model matrix变为世界坐标(物体的缩放、旋转、位移都在model matrix中)
世界坐标通过view matrix变为观察坐标(camera)(在我们的简单例子中,我们仅仅是将camera沿着z轴正方向前移一点,或者将世界坐标沿着z轴负方向后退一点,所以view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));)
观察坐标通过projection matrix变为裁剪空间(在裁剪空间范围外的看不见,并且坐标都标准化了在负一到一之间,将坐标变为标准化设备坐标系称为投影)
一旦所有顶点被变换到裁剪空间,最终的操作——透视除法(Perspective Division)将会执行,在这个过程中我们将位置向量的x,y,z分量分别除以向量的齐次w分量;透视除法是将4D裁剪空间坐标变换为3D标准化设备坐标的过程。这一步会在每一个顶点着色器运行的最后被自动执行。
将观察坐标变换为裁剪坐标的投影矩阵可以为两种不同的形式,每种形式都定义了不同的平截头体。我们可以选择创建一个正射投影矩阵(Orthographic Projection Matrix)或一个透视投影矩阵(Perspective Projection Matrix)