opengl学习笔记(五)

本文深入探讨了计算机图形学中的纹理贴图技术,解释了如何通过纹理坐标将花纹应用到匕首模型上,实现图案变换。同时,介绍了环境光、漫反射光和镜面反射三种光照模型,详细阐述了它们在创建逼真游戏界面中的作用。通过理解这些概念,可以更好地控制物体表面的光照效果,增强视觉体验。

贴图

比如我们有一个匕首的模型,但是效果不是很炫酷。我们希望匕首上有很多好看的花纹。

我们称这种花纹为纹理(我自己的理解),并保存在一些png等文件中,那么贴图的工作就是告诉片段处理器如何让几何图形对象相对的纹理像素。就好比我们的纹理像缓冲区的数据一样存在那里,可以反复用,你只需要定义好如何取就可以。

纹理中的每个像素叫纹素,和顶点对应的是纹理坐标。纹理坐标不是像素的个数,而是将像素缩放到单位范围内,比如[0,1]。纹理坐标其实是一个比例,不如(0.5,0.5)的纹理坐标对应长700,宽1000的纹理就是第(350,500)像素。当然我们可能计算出小数,可以通过计算距离选四邻域等方法去选择。

那么我们这样做,比如我匕首的位置是龙头,现在换了一张贴纸,龙头和凤首的位置在原来的图片里大概位置相似,那么匕首的图案变成了凤首,不用去管贴图的尺寸而去改变顶点和纹理坐标的映射关系。

光照

光照包含环境光,漫反射光和镜面反射,包含这三种光让游戏的界面产生更加真实的感觉。

环境光:
环境光是不考虑光源,不考虑观察者角度,对于任何物体都产生相同效果的光照。就是我们在室外,阳光下,看到的物体的颜色,在没有反射光和点光源的情况下,光的强度大致都是一样的。

struct DirectionalLight
{
        Vector3f Color;
        float AmbientIntensity;
};

环境光的强度与点光源和角度都无关,其实就是我们定义一个亮度而已。对于像素的RGB值添加一个0到1的系数。

Color是控制三个通道的比例,比如我们想只反射物体的红光,那就是[1,0,0],当我们想让它仅仅是模拟太阳的白光,反射物体原本的颜色,就都设置为1。那么AmbientIntensity是光照强度。晴天看到的东西感觉发亮,阴天的都是有些阴沉沉的感觉,发灰色,但物体本身的颜色并没有变。我们同时对三个通道设置一个比例的时候,就可以调整它的亮度,而不改变颜色。范围同样是0到1

漫发射光:
漫反射光要加入点光源和光的角度的概念。比如黑暗环境下,我们拿出手电筒,垂直照射桌子。我们会发现桌子中间最亮,逐渐两边会变暗,直到什么也看不见。桌子底下也是看不见的。因为漫反射光和角度有关系,当光照方向和物体表面垂直时,漫反射光最大,当角度从0变到90时,逐渐变小,当角度大于等于90,环境光为0,和余弦值成正比,所以会呈现这样的现象。手电筒相当于点光源。

struct DirectionalLight
{
    Vector3f Color;
    float AmbientIntensity;
    Vector3f Direction;
    float DiffuseIntensity;
};

Direction是顶点法向量,我们希望光照有层次感,所以一般对三角形内部的像素进行插值计算向量。DiffuseIntensity同样是一个系数,漫反射光的系数。计算出的结果和之前的环境光相加,计算出out,传送给几何处理器。

镜面反射:
我们平时会看到某一金属表面非常的刺眼,当我们的视线稍微偏过一点,就没有那么刺眼了。这个现象在游戏中由镜面反射来模拟。

镜面反射主要取决于物体表面的材质,像金属反射会强烈一些,木头基本不会有镜面反射。镜面反射的音素除了表面的材质,还需要在漫反射光的基础上考虑观察者和反射光之间的角度,当视线与表面的方向和反射光方向重合时,镜面反射达到最大。

和我们之前说的漫反射光很相似,是和夹角的余弦值成正比的,当夹角大于等于90度,将不计算镜面反射光。

vec3 VertexToEye = normalize(gEyeWorldPos - WorldPos0);//观察者位置到反射的表面的位置的方向矢量
        vec3 LightReflect = normalize(reflect(gDirectionalLight.Direction, Normal));//反射光角度,由入射光和发现两个矢量合成
        float SpecularFactor = dot(VertexToEye, LightReflect);观察方向和反射方向的夹角的余弦值
        SpecularFactor = pow(SpecularFactor, gSpecularPower);
    if (SpecularFactor > 0) {
        SpecularColor = vec4(gDirectionalLight.Color, 1.0f) * gMatSpecularIntensity * SpecularFactor;
        }//和漫反射光一样,判断余弦值大小,然后由入射光颜色的RGB值乘以强度,乘以余弦值因子。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值