D3D学习笔记(光照+反射白光的旋转金字塔)

在d3dUtility.h中添加了全局常用颜色常量。

const D3DXCOLOR WHITE(D3DCOLOR_XRGB(255, 255, 255));
	const D3DXCOLOR BLACK(D3DCOLOR_XRGB(0, 0, 0));
	const D3DXCOLOR RED(D3DCOLOR_XRGB(255, 0, 0));
	const D3DXCOLOR GREEN(D3DCOLOR_XRGB(0, 255, 0));
	const D3DXCOLOR BLUE(D3DCOLOR_XRGB(0, 0, 255));
	const D3DXCOLOR YELLOW(D3DCOLOR_XRGB(255, 255, 0));
	const D3DXCOLOR CYAN(D3DCOLOR_XRGB(0, 255, 255));//青蓝
	const D3DXCOLOR MAGENTA(D3DCOLOR_XRGB(255,0,255));//品红

为减轻手动初始化材质结构,在d3dUtility.h/cpp中添加了初始化材质函数和一些常用的全局材质常量。

D3DMATERIAL9 InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e ,float p);
	
//常用材质
const D3DMATERIAL9 WHITE_MTRL = InitMtrl(WHITE, WHITE, WHITE, BLACK, 8.0f);
	
const D3DMATERIAL9 RED_MTRL = InitMtrl(RED, RED, RED, BLACK, 8.0f);

const D3DMATERIAL9 GREEN_MTRL = InitMtrl(GREEN, GREEN, GREEN,BLACK, 8.0f);

const D3DMATERIAL9 BLUE_MTRL = InitMtrl(BLUE, BLUE, BLUE, BLACK, 8.0f);

const D3DMATERIAL9 YELLOW_MTRL = InitMtrl(YELLOW, YELLOW, YELLOW, BLACK, 8.0f);
D3DMATERIAL9 d3d::InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e, float p)
{
	D3DMATERIAL9 mtrl;
	mtrl.Ambient = a;//环境光的反射率
	mtrl.Diffuse = d;//漫射光的反射率
	mtrl.Emissive = e;//增强物体的亮度(黑色代表不增强)
	mtrl.Power = p;//镜面高光点的锐度,值越大锐度越大
	mtrl.Specular = s;//镜面光的反射率
	return mtrl;
}

对于光源的初始化处理
方向光

创建一个方向确定,发射较强漫射光,中等的环境光,较弱的镜面光

D3DLIGHT9 d3d::InitDirectionLight(D3DXVECTOR3* direction, D3DXCOLOR* color)
{
	D3DLIGHT9 light;
	::ZeroMemory(&light, sizeof(light));
	light.Type = D3DLIGHT_DIRECTIONAL;
	light.Ambient = *color * 0.6f;
	light.Diffuse = *color;
	light.Specular = *color * 0.3f;
	light.Direction = *direction;
	return light;
}

点光源

中等的环境光和镜面光,较强的漫射光,起点,衰减系数确定的点光源,

D3DLIGHT9 d3d::InitPointLight(D3DXVECTOR3* position, D3DXCOLOR* color)
{
	D3DLIGHT9 light;
	::ZeroMemory(&light, sizeof(light));
	
	light.Type = D3DLIGHT_POINT;
	light.Ambient = *color * 0.6f;
	light.Diffuse = *color;
	light.Specular = *color * 0.6f;
	light.Position =  *position;
	//衰减系数
	light.Attenuation0 = 1.0f;
	light.Attenuation1 = 0.0f;
	light.Attenuation2 = 0.0f;
	return light;
}

聚光灯

中等环境光与镜面光, 较强的漫射光,起点,延伸方向与距离,内锥形和外锥形的圆锥角,衰减系数确定

D3DLIGHT9 d3d::InitSpotLight(D3DXVECTOR3* position,D3DXVECTOR3* spot,D3DXCOLOR* color)
{
	D3DLIGHT9 light;
	::ZeroMemory(&light, sizeof(light));

	light.Type = D3DLIGHT_SPOT;
	light.Ambient = *color * 0.0f;
	light.Diffuse = *color;
	light.Specular = *color * 0.6f;
	light.Direction = *spot;
	light.Position =  *position;
	light.Falloff    = 1.0f;
	//衰减系数
	light.Attenuation0 = 1.0f;
	light.Attenuation1 = 0.0f;
	light.Attenuation2 = 0.0f;
	//内锥形圆锥角
	light.Theta = 0.4f;
	//外锥形圆锥角
	light.Phi 	=0.9f;
	
	return light;
}
在D3D中,需要知道顶点的法线向量,光照的入射角才能够确定,

为此我们需要求出每个顶点的法线向量,在三角形图元中,每个顶点的法线向量,我们可以看成其表面对应的面法向量

便可以通过三角形2边向量叉乘得到面法向量。(顺时针输入顶点可获得朝上的面法向量,逆时针则是反方向)

void ComputerNormal(D3DXVECTOR3*p0,D3DXVECTOR3*p1,D3DXVECTOR3*p2,D3DXVECTOR3*out){
D3DXVECTOR3 u = *p1-*p0;
D3DXVECTOR3 v = *p2-*p0;
D3DXVec3Cross(out,&u,&v);
D3DXVec3Normalize(out,out);
}

将所新建的点的位置信息以及法线信息存放到顶点缓存中。

(若只是中间的辅助顶点(不需要绘制出来的),可用数组保存即可)

D3DXVECTOR3 *m;
m = new D3DXVECTOR3[16];
m[0] = D3DXVECTOR3(-1.0f, 0.0f, -1.0f);
m[1] = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
m[2] = D3DXVECTOR3(1.0f, 0.0f, -1.0f);
ComputerNormal(m, m + 1, m + 2, m + 3);
m[4] = D3DXVECTOR3(-1.0f, 0.0f, 1.0f);
m[5] = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
m[6] = D3DXVECTOR3(-1.0f, 0.0f, -1.0f);
ComputerNormal(m + 4, m + 5, m + 6, m + 7);
m[8] = D3DXVECTOR3(1.0f, 0.0f, -1.0f);
m[9] = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
m[10] = D3DXVECTOR3(1.0f, 0.0f, 1.0f);
ComputerNormal(m + 8, m + 9, m + 10, m + 11);
m[12] = D3DXVECTOR3(1.0f, 0.0f, 1.0f);
m[13] = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
m[14] = D3DXVECTOR3(-1.0f, 0.0f, 1.0f);
ComputerNormal(m + 12, m + 13, m + 14, m + 15);
Vertex* v;
Pyramid->Lock(0, 0, (void**)&v, 0);
// front face
	v[0] = Vertex(m, m + 3);
	v[1] = Vertex(m + 1, m + 3);
	v[2] = Vertex(m + 2, m + 3);
// left face
	v[3] = Vertex(m + 4, m + 7);
	v[4] = Vertex(m + 5, m + 7);
	v[5] = Vertex(m + 6, m + 7);
// right face
	v[6] = Vertex(m + 8, m + 11);
	v[7] = Vertex(m + 9, m + 11);
	v[8] = Vertex(m + 10, m + 11);
// back face
	v[9] = Vertex(m + 12, m + 15);
	v[10] = Vertex(m + 13, m + 15);
	v[11] = Vertex(m + 14, m + 15);
Pyramid->Unlock();

其余基本也跟其他的demo差别不是很多在这里就略过了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在d3d中,要实现纹理渲染并旋转,可以通过以下步骤来实现。 首先,需要加载纹理图像并创建一个纹理对象。通过使用d3d提供的函数,可以加载某个图像文件作为纹理,并创建一个纹理对象来保存它。例如,使用D3DXCreateTextureFromFile()函数可以从文件加载纹理,并创建一个纹理对象。 然后,需要定义一个图形对象并将纹理绑定到它上面。可以通过定义一个顶点缓冲区来定义图形对象的形状,并将纹理绑定到这个顶点缓冲区上。在顶点缓冲区中,每个顶点都包含了位置和纹理坐标信息。可以使用d3d的函数来定义顶点缓冲区,并填充相应的数据。 接下来,需要使用着色器来对图形对象进行渲染。使用着色器可以实现对图形对象的变换和渲染效果的添加。在着色器中,可以使用转换矩阵来实现旋转操作。通过改变转换矩阵中的旋转参数,可以实现对图形对象的旋转。可以使用d3d提供的函数来加载和设置着色器,并将其应用到图形对象上。 最后,需要在渲染循环中,对图形对象进行绘制和渲染操作。通过使用d3d的函数来开始渲染,绑定纹理和着色器,并调用绘制函数来绘制图形对象。在每次循环中,可以通过改变旋转参数来实现对图形对象的旋转效果。 综上所述,要实现d3d的纹理渲染和旋转,需要加载纹理图像并创建纹理对象,定义一个图形对象并将纹理绑定到它上面,使用着色器实现渲染效果和旋转操作,最后在渲染循环中进行绘制和渲染操作。这样就可以实现d3d纹理渲染和旋转了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值