第二章灯光材质贴图
在上一章里,看到的白色茶壶就是没有任何材质贴图的物体,我们要让它好看,就必须加入材质贴图和灯光。
首先加入贴图吧,就以这张名为pic.jpg贴图为例,大家可以把图片保存到程序目录并改名。
首先我们要添加一个tv3d的贴图库
Dim TF As New TVTextureFactory '添加一个贴图库
然后要指定图片的读取目录
Tv.SetSearchDirectory App.Path'设定贴图读取目录为当前目录
把贴图读取到贴图库
TF.LoadTexture "pic.jpg", "pic" '读取名为pic.jpg的贴图,并命名为pic
为了能更好的展示贴图,我们把模型换为球体,其他相关代码如下:
Mesh.CreateSphere 1'建立一个半径为1的球
Mesh.SetTexture GetTex("pic") '赋予物体pic贴图
运行一下
这样就ok了,很简答吧,一共也就4-5行代码。
有光照效果才能更真实,我们要给它加上光照,而要让光照的效果发生作用就必须要有材质。
同理,和添加贴图一样,先添加库。
Dim MF As New TVMaterialFactory ''添加一个材质库
Dim LE As New TVLightEngine '添加一个灯光库
然后设置材质,相关代码:
MF.CreateMaterial "solid" '建立名为solid的材质
MF.SetAmbient GetMat("solid"), 0, 0, 0, 1'环境光
MF.SetDiffuse GetMat("solid"), 1, 1, 1, 1'扩散光,即物体的固有颜色
MF.SetEmissive GetMat("solid"), 0, 0, 0, 0'自发光
MF.SetOpacity GetMat("solid"), 1 '不透明度
MF.SetSpecular GetMat("solid"), 1, 1, 1, 1'高光色
MF.SetPower GetMat("solid"), 60 '散射强度
然后把材质赋予物体
Mesh.SetMaterial GetMat("solid") '赋予物体solid材质
这样材质就完成了
添加灯光就更简单了
灯光有三种,分别是平行光、点光源、聚光灯。
平行光就是全场景只有一个方向的光,如果我们的游戏是在室外场景,就应该采用平行光。
建立平行光:LE.CreateDirectionalLight Vector(平行光的方向向量), r, g, b,灯的名字, 高光范围
其中向量不懂的话可以百度,也可以等高中学习了立体几何自然就懂了。Rgb是灯光的红绿蓝三色的比例,可以取0-1的值。
点光源,就像我们室内的白炽灯,光线是从一个点向外扩散出去的,用在室内效果比较好。
建立点光源:LE.CreatePointLight vector(光源位置坐标),r,g,b, 半径,名字,高光
聚光灯:就像探照灯那样,光线路径是一个圆锥,cs中的手电筒就是用聚光灯做的。
建立聚光灯:LE.CreateSpotLightVector(位置), Vector(方向), r, g, b, 半径, 光锥衰减外角,光锥衰减内角,名字, 高光
我们一般做游戏就用平行光好了,所以这里只建立一个平行光,名字如果不需要调用是可以空着的。
LE.CreateDirectionalLight Vector(1, -1, 1), 1, 1, 1, ,1'添加一个平行光
同时,我们可以把灯光的高光打开。
LE.SetSpecularLighting True '高光开关
然后让光对物体起作用
Mesh.SetLightingMode TV_LIGHTING_NORMAL’这个最常用的灯光模式
还有另外两种常用的灯光模式
Mesh.SetLightingMode TV_LIGHTING_NONE’就是灯光对物体不起作用
Mesh.SetLightingModeTV_LIGHTING_BUMPMAPPING_TANGENTSPACE’这种模式是为法线贴图准备的效果更精细些,但是速度较慢。
好了一切完成,全部代码如下,我们测试一下。为了能让大家看得更清楚,我加了一个垂直同步的语句,目的是为了把刷新频率降下来,和屏幕的刷新频率一致。不然在我的电脑上,每秒钟刷新的频率是8000帧,太浪费cpu了。
Option Explicit
Dim Tv As New TVEngine '调用tv3d所必需的
Dim Scene As New TVScene '调用tv3d所必需的
Dim Mesh As TVMesh '添加一个网格物体
Dim TF As New TVTextureFactory '添加一个贴图库
Dim MF As New TVMaterialFactory ''添加一个材质库
Dim LE As New TVLightEngine '添加一个灯光库
Private Sub Form_Load()
Me.Show '显示当前窗口,每次都加上错不了
Tv.SetSearchDirectory App.Path '设定贴图读取目录为当前目录
Tv.SetVSync True '垂直同步开关
Tv.Init3DWindowed Form1.hWnd '用窗口模式启动tv3d
TF.LoadTexture"pic.jpg", "pic" '读取名为pic.jpg的贴图,并命名为pic
MF.CreateMaterial "solid" '建立名为solid的材质
MF.SetAmbient GetMat("solid"), 0, 0, 0, 1'环境光
MF.SetDiffuse GetMat("solid"), 1, 1, 1, 1'扩散光,即物体的固有颜色
MF.SetEmissive GetMat("solid"), 0, 0, 0, 1 '自发光
MF.SetOpacity GetMat("solid"), 1 '不透明度
MF.SetSpecular GetMat("solid"), 1, 1, 1, 1'高光色
MF.SetPower GetMat("solid"), 60 '散射强度
LE.CreateDirectionalLight Vector(1, -1, 1), 1, 1, 1, ,1'添加一个平行光
LE.SetSpecularLightingTrue '高光开关
Set Mesh = Scene.CreateMeshBuilder '网格物体初始化,必加
Mesh.CreateSphere 1'建立一个半径为1的球
Mesh.SetTexture GetTex("pic") '赋予物体pic贴图
Mesh.SetPosition 0, 0, 3 '设定物体的位置坐标
Mesh.SetMaterial GetMat("solid") '赋予物体solid材质
Mesh.SetLightingMode TV_LIGHTING_NORMAL'这个最常用的灯光模式
Do'主循环
Tv.Clear'清屏
Mesh.RotateY 0.01'沿y轴以0.01每帧的速度转动
Mesh.Render'渲染茶壶
Tv.RenderToScreen'把所得最终结果渲染到屏幕
DoEvents '这句是把线程空出来,使其他的的程序能运行,必加
Loop
End Sub
接下来我们可以自己做一些调试,我会先领着大家做一些简单的调试,但是以后就需要大家自己去调试了。拿到一段代码,你可能不了解它具体的原理,但是你可以修改修改里面的数据,看看什么发生了变化,自然就知道它究竟是干什么的了。要想自学编程就需要这种探究精神,不然你绝对学不好。
比如光照模式改为TV_LIGHTING_BUMPMAPPING_TANGENTSPACE
MF.SetPower GetMat("solid"), 5'散射强度设为5
MF.SetEmissive GetMat("solid"), 1, 0, 0, 1'自发光设为红色
LE.CreateDirectionalLight Vector(1, -1, 1),0, 0, 1, , 1'将光源的颜色变为蓝色
另外修改不透明度不会起作用,这个等我们学习高阶教程,渲染半透明物体时,我再详细给大家讲。