LearnOpenGL笔记7材质、光照贴图、投光


材质颜色(material color)
环境光照(ambient lighting)
漫反射光照(diffuse lighting)
镜面光照(specular lighting)通过每个分量指定一个颜色
再加上反光度(shiniess)

材质

片段着色器中,结构体储存物体材质,可以把它们储存为独立的uniform,定义结构体的布局(layout),使用刚创建的结构体为类型,简单声明一个uniform变量。
ambient材质向量定义了在环境光照下物体反射颜色,通常和物体颜色相同。diffuse材质向量定义了漫反射光照下物体颜色。specular材质设置的镜面光照。
shiniess镜面高光散射半径。

光照贴图

一个物体可能不会只要一种材质,漫反射贴图,镜面光贴图,对物体的漫反射分量和镜面光分量有着更精确的控制,

漫反射贴图

其实就是和纹理差不多,只不过在光照场景名字叫做,漫反射贴图,表现物体所有漫反射颜色纹理图像。
sampler2D是不透明类型,只能够通过uniform定义。

投光物

光投射到物体的光源叫做投光物(lighter caster),

平行光

光源处于无限远,称为 定向光(directional light),所有光线相同方向,和光源位置无关。
所有光线平行,物体和光源相对位置不重要。
定义一个光线方向向量模拟定向光。首先对light.direction向量取反。我们目前使用的光照计算需求一个从片段至光源的光线方向,但人们更习惯定义定向光为一个从光源出发的全局方向。所以要对全局光照方向向量取反改变方向,现在是一个指向光源的方向向量了。为了展示定向光对多个物体有相同的影响,再次使用坐标系统。

点光源

朝着所有方向发光,光线随距离衰减(attenuation)。
随着距离减少光强度,
在这里插入图片描述
计算衰减值。
d是片段距光源的距离,
设置参数值的时候考虑因素:
环境、希望光覆盖的距离、光的类型;一般是经验值

聚光

位于环境中的某个位置,只朝一个特定的方向而不是所有的方向照射光线,相当于路灯,手电筒,
表示因素:世界空间位置、一个方向、一个切光角;切光角制定了聚光的半径。

平滑、软化边缘

为了创建一种边缘平滑的聚光,需要模拟聚光有一个内圆锥和一个外圆锥。
让光从内圆锥逐渐减暗直到外圆锥边界。

多光源

不同光源封装到GLSL函数,每一种光源计算方法不同,
在场景中使用多个光源:一个单独的颜色向量代表片段输出颜色。对每一个光源,对片段的贡献颜色将会加到片段的输出颜色向量上。场景中每个光源都会计算对各自片段的影响。

void main()
{
    // 属性
    vec3 norm = normalize(Normal);
    vec3 viewDir = normalize(viewPos - FragPos);

    // 第一阶段:定向光照
    vec3 result = CalcDirLight(dirLight, norm, viewDir);
    // 第二阶段:点光源
    for(int i = 0; i < NR_POINT_LIGHTS; i++)
        result += CalcPointLight(pointLights[i], norm, FragPos, viewDir);    
    // 第三阶段:聚光
    //result += CalcSpotLight(spotLight, norm, FragPos, viewDir);    

    FragColor = vec4(result, 1.0);
}

GLSL uniform数组(GLSL Uniform Array):一个uniform值数组。它的工作原理和C语言数组大致一样,只是不能动态分配内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值