目录
理解GLSL代码
下面是对老师课上举的一个GLSL(OpenGL-shader-language)的shader例子做一个简单的注释,便于理解:
uniform变量
GLSL shader中的全局变量,类似于C++里的static/extern(这里先不考虑static和extern的不同),可以在任意shader(vertex/geometry/fragment shader)中访问,一旦初始化就不能随意修改,不然会引起编译错误。
关于uniform的定义和使用后续再进行探讨,这里主要是为了理解老师代码里uniform的含义。
//GLSL是一个简单的像素着色器的小程序,告诉一个像素的颜色是什么
//uniform变量是GLSL shader中的全局变量,可以随意在任意shader
uniform sample2D myTexture;//纹理全局变量
uniform vec3 lightDir;//光照方向,认为每个像素有个固定的光照方向
varying vec2 uv;
varying vec3 norm;//插值出来每个像素的法线是norm,插值这个步骤OpenGL来做
void diffuseShader()
//对每一个像素都执行一次,因此不需要循环
{
vec3 kd;
kd = texture2d(myTexture, uv);//漫反射系数(与纹理相关)
//dot表示向量点乘;clamp函数限制了值在[0,1]
kd *= clamp(dot(-lightDir, norm), 0.0, 1.0);//最最简单的Phong模型的漫反射步骤,这里的光的方向是朝向shading point的,是负数,跟games101学到的“light朝着光源”不一样
gl_FragColor = vec4(kd, 1.0);//表示该像素的颜色是什么
}
课程的末尾部分,老师还提到去了解一下OpenGL和Direct的运作:
OpenGL&Direct API的运作
什么是API
该部分参考:什么叫做API?看完你就理解了
全称Application Progarmming Interface,即应用程序编程接口。程序员在开发应用程序时,通过API来编写程序就可以避免编写一些无用程序。API大多数由后端编写,前端开发人员进行直接调用。用户提出某项请求,开端开发人员将请求传递传递给后端,后端再根据请求地址返回结果。
比如在用C语言编程时,我们(程序员)可以直接调用sort()函数实现排序,十分简单。这段过程其实很复杂,要先扫描硬盘查找文件->读取文件数据->将数据放入内存->翻译数据->显示在屏幕上,这些复杂的操作都被放在了函数sort(),附带在了操作系统里,程序员只需调用函数即可。
这些封装好的函数就叫做API。
我们用的各种编程语言自带的标准库就是API(文件后缀为.lib的一些文件),这些库由开发者们编写,完善,便于我们使用。
C语言API以函数形式呈现:例如printf();
Java API主要以类形式呈现:String;
C++是C的扩展,C++ API既包含函数也包含类;
games101作业1用到的OpenCV(开源图像库)是第三方库。
什么是OpenGL
OpenGL是一个关于图形的API的详述定义,并没有提供几何实体图形直接用以描述场景,只是规定了很多函数和其参数的返回类型,以及要实现的行为和管线的操作过程。OpenGL本身并非API,是一个规范,需要用驱动(硬件厂商生产的)来实现OpenGL这一规范。
OpenGL的库函数采用大量的函数来进行图形的处理和显示。
什么是DirectX
该部分参考:微软DirectX和OpenGL的区别(比较详细)
DirectX是一种API,即程序应用接口。DirectX不只是一个单纯的图形API,它由很多的API组成(显示部分、声音部分、输入部分、网络部分,在3D图形方面的表现最为优秀),能让windows游戏得到更高的执行效率,加强声音和3D图形效果,为游戏开发者们提供一个共同的硬件驱动标准,让游戏开发者不必为每一个品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。简单来说:只要某一种游戏是依据DirectX来开发的,不管用的什么样的显卡、声卡设备,用户都能体验到最佳的效果(驱动要支持DirectX)。
shadertoy网站
Shadertoy BETA网址: Shadertoy BETA
根据自己想要的材质,搜索就可以得到
例如我想找大理石材质,输入marble
具体这个网站还没有仔细去看,之后到了真正开始写shader的时候探索一下这个网站再来更新。