OGRE+CG学习日记[1]-简单的3D程序
终于有时间开始研究OGRE和CG这些3D技术方面的东西了
先对今天的成果进行一下简单介绍
创建一个OGRE窗口,在里面放入一个怪兽头模型
写一个输出顶点为红色的CG代码
在OGRE材质脚本里声明这段代码
将这段代码用在一个模型上,让他变成一个纯红色的 ,没有光照明暗效果的东西
先来看代码
(因为是根据OGRE的演示程序” Demo_EnvMapping”修改而来,不涉及窗口的创建以及摄像机等等的内容)
//为3D世界创建一个环境光
// ColourValue(0.5, 0.5, 0.5)这个就是环境光的颜色啦
mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
// 创建一个光源,并设定它的坐标
Light* l = mSceneMgr->createLight("MainLight");
l->setPosition(20,80,50);
//创建一个实体(这是创建了一个OGRE的怪兽头模型)
Entity *ent = mSceneMgr->createEntity("head", "ogrehead.mesh");
//设置怪兽头模型的材质(重点部分)
ent->setMaterialName("Examples/kkTest");
//DEMO中设置的原配材质脚本
// ent->setMaterialName("Examples/EnvMappedRustySteel");
//创建一个新的子节点,把上面创建的模型绑定在节点上
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
接下来是“重点部分”
涉及到GPU编程,采用CG语言
我也刚开始学CG,先来个简单点的
要求就是把模型设成一个红色的怪兽头
第一步创建一个CG程序
为了方便,直接在OGRE现成的CG文件里添加就是了
X:/ogre/Samples/Media/materials/programs/ Example_Basic.cg 这是我用来添加的文件
void kkTestTexture_vp(float4 position : POSITION,
float3 normal : NORMAL,
float2 uv : TEXCOORD0,
// 加 out 表示为这段代码要输出的值
out float4 oPosition : POSITION, //: 号后面的部分表示当作什么来用 点
out float2 oUv : TEXCOORD0, //这个当作“纹理坐标”(我这么叫的)
out float4 ocolour : COLOR, //很明了,颜色
// uniform 表示在外部进行赋值的
uniform float4x4 worldViewProj)//这是一个 世界视图投影的混合矩阵
{
//对当前的点进行转换
oPosition = mul(worldViewProj, position);
oUv = uv; //这个不变
//唯一有能看出点效果的代码 ,这里是把要输出的点的颜色调为红色(RGBA值)
ocolour=float4(1,0,0,1);
}
CG代码完成后就要开始为这段程序进行一个我认为是类似声明的过程
同代码,直接在OGRE提供的现成文件脚本里添加
X:/ogre/Samples/Media/materials/scripts/ Examples.program
vertex_program Ogre/BasicVertexPrograms/kkTest cg
{
source Example_basic.cg //CG程序的文件名
entry_point kkTestTexture_vp //渲染过程中CG程序的入口函数名,类似于C的MAIN()
profiles vs_1_1 arbvp1 //应该是对段程序的描述,好像是表示渲染过程中硬件//采用的技术方式
}
声明完成,就可以在材质脚本中使用了
X:/ogre/Samples/Media/materials/scripts/ Example.material
很简单
material Examples/kkTest //先为这段脚本命名
{
Technique // 使用的技术方案,虽然只有一种
{
Pass //传说中的通道
{ //表示使用上面写的顶点渲染程序
vertex_program_ref Ogre/BasicVertexPrograms/kkTest
{
//那段程序有一个需要外部赋值的变量
// param_named_auto 表示这个参数采用名称 自动赋值的方法
param_named_auto worldViewProj worldviewproj_matrix
// worldviewproj_matrix 并不是一个值,而是一个描述
//OGRE会根据描述自动赋值(描述有很多种,可查看相关资料)
}
}
}
}
现在生成代码,运行下看看
![](https://i-blog.csdnimg.cn/blog_migrate/fc4b37d072a3c8dafd72e49ccf7a7df2.png)
由于CG代码对顶点的操作只是简单地输出了红色,没有进行其它运算,所以模型看起来没有任何的立体效果
下面是我用来修改的DEMO的原装效果