Direct3D光照

2023-11-19

光照的组成

环境光:这种类型的光经其他表面反射到达物体表面,并照亮整个场景,要想以较低代价粗略模拟这类反射光,环境光是一个很好的选择

漫射光:这种类型光沿着特定的方向传播。当它到达某一表面时,将沿着各个方向均匀反射,无论从哪个方位观察,表面亮度均相同,所以采用该模型时无须考虑观察者的位置,这样,漫射光方程中仅需考虑光传播的方向以及表面朝向,从一个光源发出的光一般都是这种类型的。

镜面光:这种类型的光沿特定方向传播,当此类光到达一个表面时,将严格地沿着另一个方向反射,从而形成只能在一定角度范围内才能观察到的高亮度照射,所以在镜面光照方程中不仅需要考虑光线的入射方向和图元的表面朝向,还需要考虑观察点的位置。镜面光可用于模拟物体上的高光点,例如当光线照射到一个抛光的表面所形成的高亮照射。

镜面光比其他类型光计算量大,因此Direct3D提供了开关选项,默认状态下Direct不进行镜面反射计算,如果想启用镜面光,必须调用接口进行设置

Device->SetRenderState(D3DRS_SPECULARENABLE, true);

每种类型的光都可用结构D3DCOLORVALUE或者D3DXCOLOR来表示,描述光线的颜色时,D3DXCOLOR类中的Alpha值都将被忽略

D3DXCOLOR redAmbient(1.0f, 0.0f, 0.0f, 1.0f);
D3DXCOLOR blueDiffuse(0.0f, 0.0f, 1.0f, 1.0f);
D3DXCOLOR whiteSpecular(1.0f, 1.0f, 1.0f, 1.0f);

材质

现实世界中,我们所观察到的物体的颜色是由该物体所反射的光的颜色决定的,例如一个纯红色的球体反射了全部的红色入射光,并吸收了所有非红色的光,所以呈现为红色。当一个物体吸收了所有的光时,便呈现为黑色,如果一个物体能够100%地反射红色光、绿色光、蓝色光,它将呈现为白色,Direct3D通过定义物体的材质来模拟同样的现象,材质允许我们定义物体表面对各种颜色光的反射比例,材质用结构D3DMATERIAL9来表示。

typedef struct D3DMATERIAL9 {
    D3DCOLORVALUE   Diffuse;  
    D3DCOLORVALUE   Ambient;  
    D3DCOLORVALUE   Specular; 
    D3DCOLORVALUE   Emissive; 
    float           Power;    
} D3DMATERIAL9;

Diffuse:指定材质对漫射光的反着率
Ambient:指定材质对环境光的反射率
Specular:指定材质对镜面光的反射率
Emissive:该分量用于增强物体的亮度,使之看起来好像可以自己发光
Power:指定镜面高光点的锐度,该值越大,高光点的锐度越大

//只反射红色光
D3DMATERIAL9 red;
::ZeroMemory(&red, sizeof(red));
red.Diffuse = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);
red.Ambient= D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);
red.Specular = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);
red.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f);
red.Power = 5.0f;

设置材质接口SetMaterial

D3DMATERIAL9 blueMaterial;
Device->SetMaterial(&blueMaterial);
//draw...

顶点法线

顶点法线描述的是构成多边形的各个顶点的法线,Direct3D需要知道顶点的法线方向,以确定光线到达表面时的入射角,由于光照计算是对每个顶点进行的,所以Direct3D需要知道表面在每个顶点处的局部朝向(法线方向),描述一个顶点法线需要修改顶点结构

struct Vertex
{
	float _x, _y, _z;
	float _nx, _ny, _nz;
	static const DWORD FVF;
};
const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL;

计算三角形三个顶点的法线,可由计算该面的法向量得到,首先计算位于三角形平面内的俩个向量

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

当用三角形单元逼近表示曲面时,将面片法向量作为构成该面片的顶点法向量不可能产生很平滑的效果,一种更好的求取顶点法向量的方法是计算法向量均值,我们需要求出共享点v的所有三角形的面法向量,然后将这些法向量相加后除以个数进行平均。

在变换过程中,顶点法线有可能不再是规范的所以最好的方法是在变换完成后,通过设置绘制状态来重新规范化

Device->SetRenderState(D3DRS_NORMALIZENORMALS, true);

光源

Direct3D支持3种类型的光源,分别是点光源、方向光、聚光灯

点光源:该光源在世界坐标系中有固定的位置,并向所有的方向发射光线(D3DLIGHT_POINT)
方向光:该光源没有位置信息,所发射的光线相互平行地沿某一特定方向传播(D3DLIGHT_DIRECTIONAL)
聚光灯:这种类型的光源与手电筒类似,该光源有位置信息,其发射的光线呈锥形沿着特定方向传播(D3DLIGHT_SPOT)

typedef struct D3DLIGHT9 {
    D3DLIGHTTYPE    Type;        
    D3DCOLORVALUE   Diffuse;     
    D3DCOLORVALUE   Specular;    
    D3DCOLORVALUE   Ambient;     
    D3DVECTOR       Position;    
    D3DVECTOR       Direction;   
    float           Range;       
    float           Falloff;     
    float           Attenuation0;
    float           Attenuation1;
    float           Attenuation2;
    float           Theta;       
    float           Phi;         
} D3DLIGHT9;

Type:定义创建的光源类型,可取以下3种枚举值,D3DLIGHT_POINTD3DLIGHT_SPOTD3DLIGHT_DIRECTIONAL
Diffuse:该光源所发出的漫射光的颜色
Specular:该光源所发出的镜面光的颜色
Ambient:该光源所发出的环境光的颜色
Position:用于描述光源在世界坐标系中位置的向量,对于方向光该参数无意义
Direction:一个描述光在世界坐标系中传播方向的向量,对于点光源该参数无意思
Range:光线"消亡"前,所能到达的最大光程,该值的最大取值为\sqrt{FLT\_MAX},对于方向光该参数无意义
Falloff:该值用于聚光灯,该参数定义了光强从内锥形到外锥形的衰减方式,该参数一版取为1.0f
Attenuation0Attenuation1Attenuation2这些衰减变量定义了光强随距离衰减的方式,这些变量仅用于点光源和聚光灯,分别表示光的常量、线性、2次距离衰减系数,衰减公式为attenuation=\frac{1}{A_{0}+A_{1}\cdot D+A_{2}\cdot D^{2}},其中D为光源到顶点的距离。
Theta:仅用于聚光灯,指定了内部锥形的圆锥角,单位为弧度
Phi:仅用于聚光灯,指定了外部锥形的圆锥角,单位为弧度

与D3DMATERIAL9结构初始化类似,当需要一个简单的光源时,D3DLIGHT9结构的初始化也很繁琐

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

D3DXVECTOR3 dir(1.0f, 0.0f, 0.0f);
D3DXCOLOR c = d3d::WHITE;
D3DLIGHT9 dirLight = d3d::InitDirectionalLight(&dir, &c);

D3DLIGHT9实例初始化完毕之后,我们需要在Direct3D所维护的一个光源内部列表中对所要使用的光源进行注册,注册成功后就可以对其开关状态进行控制

Device->SetLight(0, &light);
Device->LightEnable(0, true);

光照例程

bool SetUpPyramid()
{
	//启用光照(默认是启用的)
	Device->SetRenderState(D3DRS_LIGHTING, true);

	Device->CreateVertexBuffer(12 * sizeof(PyramidVertex), D3DUSAGE_WRITEONLY, PyramidVertex::FVF, D3DPOOL_MANAGED, &Pyramid, 0);

	PyramidVertex* v;
	Pyramid->Lock(0, 0, (void**)&v, 0);

	v[0] = PyramidVertex(-1.0f, 0.0f, -1.0f, 0.0f, 0.707f, -0.707f);
	v[1] = PyramidVertex(0.0f, 1.0f, 0.0f, 0.0f, 0.707f, -0.707f);
	v[2] = PyramidVertex(1.0f, 0.0f, -1.0f, 0.0f, 0.707f, -0.707f);

	v[3] = PyramidVertex(-1.0f, 0.0f, 1.0f, -0.707f, 0.707f, 0.0f);
	v[4] = PyramidVertex(0.0f, 1.0f, 0.0f, -0.707f, 0.707f, 0.0f);
	v[5] = PyramidVertex(-1.0f, 0.0f, -1.0f, -0.707f, 0.707f, 0.0f);

	v[6] = PyramidVertex(1.0f, 0.0f, -1.0f, 0.707f, 0.707f, 0.0f);
	v[7] = PyramidVertex(0.0f, 1.0f, 0.0f, 0.707f, 0.707f, 0.0f);
	v[8] = PyramidVertex(1.0f, 0.0f, 1.0f, 0.707f, 0.707f, 0.0f);

	v[9] = PyramidVertex(1.0f, 0.0f, 1.0f, 0.0f, 0.707f, 0.707f);
	v[10] = PyramidVertex(0.0f, 1.0f, 0.0f, 0.0f, 0.707f, 0.707f);
	v[11] = PyramidVertex(-1.0f, 0.0f, 1.0f, 0.0f, 0.707f, 0.707f);
	Pyramid->Unlock();

	D3DMATERIAL9 mtrl;
	mtrl.Ambient = d3d::WHITE;
	mtrl.Diffuse = d3d::WHITE;
	mtrl.Specular= d3d::WHITE;
	mtrl.Emissive = d3d::BLACK;
	mtrl.Power = 5.0f;
	Device->SetMaterial(&mtrl);

	D3DLIGHT9 dir;
	::ZeroMemory(&dir, sizeof(dir));
	dir.Type = D3DLIGHT_DIRECTIONAL;
	dir.Diffuse = d3d::WHITE;
	dir.Specular = d3d::WHITE * 0.3f;
	dir.Ambient = d3d::WHITE * 0.6f;
	dir.Direction = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
	Device->SetLight(0, &dir);
	Device->LightEnable(0, true);

	//规范化法向量
	Device->SetRenderState(D3DRS_NORMALIZENORMALS, true);
	//启用镜面高光
	Device->SetRenderState(D3DRS_SPECULARENABLE, true);

	//取景变换(观察者坐标系)
	D3DXVECTOR3 position(3.0f, 2.0f, -3.0f);
	D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
	D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
	D3DXMATRIX V;
	D3DXMatrixLookAtLH(&V, &position, &target, &up);
	Device->SetTransform(D3DTS_VIEW, &V);
	
	//投影变换
	D3DXMATRIX proj;
	D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI*0.5f, (float)Width / (float)Height, 1.0f, 1000.0f);
	Device->SetTransform(D3DTS_PROJECTION, &proj);
	return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Direct3D光照 的相关文章

  • Java/LWJGL:OpenGL 中的 Z 轴表现得像左手坐标系

    最近 我寻求帮助 https stackoverflow com q 18836484 1530508关于 OpenGL 中的 3D 相机旋转 这个答案 https stackoverflow com a 18836618 1530508接
  • 使用 CSS 3D 变换从 DOM 对象接收变换后的鼠标事件数据

    目前 JavaScript 鼠标事件中是否有任何数据可以让我轻松查找或计算相对于转换元素的 3D 空间的鼠标位置 为了直观地说明 左边是没有 3d 矩阵的 div 右边是经过 3d 变换的 div o是鼠标事件的起源 o gt o 在下面的
  • 使用 DirectX 或 OpenGL 显示 100 个浮动立方体

    我想使用显示 100 个浮动立方体DirectX or OpenGL 我正在寻找一些示例源代码或该技术的描述 我无法正确显示多个立方体 我在网上搜索了一系列很好的教程 尽管他们谈论了如何做3D基元 我找不到有关如何进行大量操作的信息3D原语
  • Python在3D散点图中用线连接相邻点

    我有两组 x y z 坐标 我用 Matplotlib 将它们绘制在 3D 散点图中 现在 我想将每个生成的四边形与平面连接起来 我已经了解了如何在 3D 空间中绘制 2D 多边形在 python matplotlib 中绘制 3D 多边形
  • 用于平滑开放 3D 网格边缘的算法

    我有一个 3D 网格 它代表一个具有一些粗糙边界的表面 我想对其进行平滑处理 我使用半边数据结构来存储几何图形 因此我可以轻松地迭代边界边 顶点和面 我还可以使用点积和叉积轻松确定给定的一对边是否是凸 凹的 平滑边缘的最佳方法是什么 使它们
  • 如何在 JavaFX 中将 GUI 覆盖到 3D 场景上?

    我在 JavaFX 中有一个 3D 场景 需要在 3D 场景上覆盖 GUI 我尝试向场景添加按钮和文本 但它们始终作为 3D 对象出现在 3D 视图中 我环顾四周 没有找到该怎么做 唯一的解决方法是创建一个全新的窗口并将设置放在那里 但在这
  • CSS3“曲面”3D 变换/透视帮助

    我正在尝试为我的网站创建一种有观点的人群 它实际上是一个充满平面图像的 ul 我想创建一种 弯曲 的感觉 就像圆形的人群一样 它向内并且向内明显变小 并向末端弯曲 海报圈的例子是我能找到的最接近的http www webkit org bl
  • SceneKit 修改 3D 对象并导出文件

    在我的应用程序中 我使用 SceneKit Framework 在 SCNView 中显示 3D 对象 并导出修改后的文件 并进行一些小的更改 如颜色 温度等 但在将其导出到文档文件夹后 我得到了原始文件 在这里我可以显示 3D 对象并对其
  • DirectX Release 构建可以通过 VS2010 运行,但不能运行 exe

    我已经通过 Google 访问 Stack Overflow 几年了 但到目前为止还没有询问 回答任何问题 所以就到这里吧 基本上 我有一个在 DirectX 11 中设置绘图模型和地形的 3D 渲染框架 一切正常 通过 Visual St
  • 在 Unity 3D 中使用触摸输入在地形上移动相机

    我是 Unity 新手 我正在尝试弄清楚如何使用触摸输入在地图 地形上移动相机 摄像机将以 90 0 0 的旋转角度俯视地形 地形位于第 8 层 我用键盘移动它没有问题 现在我尝试移动到触摸 如果你想在 iOS 上保持预期的使用情况 那就非
  • 对一系列点重新采样

    我有一个 3d 点数组 想象一下球的轨迹 有 X 个样本 现在 我想对这些点重新采样 以便我有一个新数组 其中包含 y 个样本的位置 y 可以大于或小于 x 但不能小于 1 始终至少有 1 个样本 将原始数组重新采样为新数组的算法会是什么样
  • 如何在Android中渲染OBJ或FBX? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有几个 obj 和 fbx 格式的 3D 对象 其中包含 mtl 和纹理文件 我想知道哪个是在 An
  • 3D 游戏的 Libgdx 渲染层

    在我的第一个 3D 游戏中 我现在想要渲染地板 它实际上是一个平面 不是 libgdxPlane on y 0 我想添加一个Texture到它 这样我就可以在每个级别有不同的楼层 现在我的问题是 创建和渲染这种纹理地板的最佳方法是什么 我考
  • Direct3D 中的矩阵多阶

    关于在 Direct3D 中乘法矩阵以获得结果 我收到了两个相互矛盾的答案 教程确实规定从左到右相乘 这很好 但这不是我想象的方式 这是一个例子 OpenGL 从上到下阅读 GLRotatef 90 0f GLTranslatef 20 0
  • 点列表的 3D 轮廓(凹壳)

    我有一个 C 中的 Vector3 点列表 我需要计算这些点的凹轮廓 确实有很多参考资料 特别是对于 凸 分辨率 由于格雷厄姆算法 我已经成功实现了 然而 由于我现在需要有效地计算凹轮廓 所以我迷失了 维基百科确实列出了很多用于凸计算的资源
  • 自动适合衣服的算法?

    想象一下 客户要求您设计一款软件 以满足一些相当粗略的规格 如下所示 1 它将面向时尚行业营销 2 用户将是 设计衣服和东西 的人 可能有一个特定的术语 但我没有想到 3 由于各种原因 能够快速制作原型设计并查看它们在模型上的外观会很有用
  • 投影 3D 网格的 2D 轮廓算法

    给定 一个 3D 网格 由一组顶点和三角形定义 并用这些点构建网格 问题 找到任意平面上投影的任意旋转网格的二维轮廓 投影很容易 挑战在于找到平面中投影三角形边的 外壳 我需要一些有关研究该算法的输入 指针的帮助 为简单起见 我们可以假设
  • 将大块位图转换为 3 维位图

    Problem 我需要这个大量的数据作为输入 对于基于C的arduino 这是上面示例中所需格式的大量数据 const byte bitmap 8 8 0xFF 0x81 0x81 0x81 0x81 0x81 0x81 0xFF 0x81
  • IE9-11 检测变换样式:preserve-3d

    我为一个项目制作了一个 3d 类型的菜单 自然 IE 会引起问题 因为 IE10 即使 3d 变换工作 也不支持变换样式 preserve 3d 我尝试了解决方法 通过对 3d 菜单容器的每个子元素应用变换 但至少可以说 动画看起来很糟糕
  • Matlab:3D 堆积条形图

    我正在尝试创建一个 3D 堆积条形图 如这个问题所示 Matlab 中的 3D 堆叠条形图 https stackoverflow com questions 13156133 3d stacked bars in matlab 5D 然而

随机推荐

  • 交换机自学习和转发帧

    交换机自学习和转发帧 主机A给主机B发送帧 首先假设已经通过arp协议得到主机B的MAC地址 当交换机1收到该帧后将源MAC地址和接口登记 然后在帧交换表中查到目的MAC地址 没有找到就进行盲目转发 泛洪 交换机2收该帧后 做相同的动作 主
  • vue中常用的数组方法

    Vue中常用的数组方法 filter map forEach find findIndex some every filter map forEach find findIndex some every filter filter 方法创建
  • OpenMMLab AI实战营第一天笔记

    计算机视觉基础与openmmlab介绍 机器学习和神经网络简介 机器学习基础 机器学习是什么 从数据中学习经验 以解决特定问题 机器学习的典型范式 监督学习 有标签 无监督学习 无标签 强化学习 让智能体自己适应环境 机器学习中的分类问题
  • 联想小新笔记本,16G运行内存只能使用13.9G或14.9G的解决方案

    1 问题描述 我的电脑是联想小新Pro 16 一共有16G的运行内存 但实际情况只能使用13 9G 如下图所示 2 解决方案 这需要进入电脑BIOS 更改配置 1 电脑关机 在开机的时候一直点F2 进入到BIOS模式 并把语言设为中文 2
  • 缺陷管理与测试用例

    一 提交缺陷注意实现 可重现 发现缺陷可以在开发人员的电脑上实现 唯一性 每个缺陷有一个编号 也就是编号的ID 缺陷报告每行是一个缺陷 规范性 提交的缺陷需要符合公司制定的规范要求 缺陷报告的规范 ID 标题 重现步骤 期望结果 实际结果
  • 除了快手与抖音,“云想科技们”也在加速“出圈”

    在电商行业 大家可能听说过传统电商行业的 代运营 现在短视频赛道崛起 代企业运营 以效果为前提 做出符合企业品牌价值好的 新的内容的短视频营销服务商也受到更多关注 云想科技就是其中的代表 在行业新常态下 布局新业务依旧是企业寻求增长新动力的
  • Visual Grounding任务常用数据集介绍RefCOCO、RefCOCO+、RefCOCOg、ReferItGame和Flickr30K Entities

    Visual Grounding任务常用的数据集有五个 RefCOCO RefCOCO RefCOCOg ReferItGame和Flickr30K Entities RefCOCO RefCOCO RefCOCOg 是三个从MSCOCO中
  • linux服务器使用gustat指令查看gpu显卡的使用情况(比nvidia-smi好用)

    使用gpustat指令需要先安装gpustat 安装需要root权限 apt install gpustat 查看gpu使用情况 gpustat nvidia smi gpustat相比于nvidia smi查看的信息更加详细 可以看到使用
  • flex布局宽高度设置不成功

    flex布局中 会出现是在宽高 但是不起作用 那是因为flex布局当不够的时候自动压缩了 可以选择 让其不压缩 flex shrink 0 然后在设置宽高 或者利用复合属性 flex 0 0 83rpx 这篇博客是对flex布局的讲解 以及
  • 如何给证件照换一个背景颜色

    我们在考试报名的时候 经常是不同的考试需要不同的登记照尺寸和背景颜色 但是我们基本上不可能每种颜色的证件照都去拍一张吧 那样也太麻烦成本也太高 所以通过前端实现了一个改变证件照背景颜色的方法 他可以将证件照的背景颜色修改为任意的颜色 而不局
  • 微信小程序支付中的prepay_id获取方法,以及微信支付统一签名算法闭坑

    class Wechat 公众号的或者小程序支付参数 private appId private appSecret 商家的配置信息 private mch id private mch key 回调地址 public notify url
  • 前台与后台数据交互

    后台取到的数据在前台应该用EL表达式显示 xx xx 如果要给前台单选按钮赋值 需要用js进行判断 满足条件后 id attr checked true false 设置选中状态 设置单选按钮及下拉列表不可用是disabled disabl
  • for循环之斐波拉契数列

    题目大意 菲波那契数列是指这样的数列 数列的第一个和第二个数都为1 接下来每个数都等于前面2个数之和 给出一个正整数k 要求菲波那契数列中第k个数是多少 Input 输入一行 包含一个正整数k 1 lt k lt 46 Output 输出一
  • 在C++中调用OpenSSL库进行编程

    目录 OpenSSL简介 下载OpenSSL库并配置实验环境 OpenSSL库的加密函数的认识 使用 EVP 库实现 DES 和 AES 加密 EVP EncryptUpdate 函数参数详解 OpenSSL加密实践 RSA 密钥生成 RS
  • 第一次面试前端实习生心得

    今天第一次去面试前端岗位的实习生 公司规模不算大吧 不过也有好几个部门 说说我的面试心得吧 首先是hr面 如下是她问的问题 学这个多久了 大四还有没有课 是否只需完成毕业设计就行了不用上课 同学暑假都在干嘛 学校课程学了什么 同学们主要找哪
  • (转载)我们需要什么样的字段类型

    数据库定义到char类型的字段时 不知道大家是否会犹豫一下 到底选char nchar varchar nvarchar text ntext中哪一种呢 结果很可能是两种 一种是节俭人士的选择 最好是用定长的 感觉比变长能省些空间 而且处理
  • Java 两种zero-copy零拷贝技术mmap和sendfile的介绍

    详细介绍了两种zero copy零拷贝技术mmap和sendfile的概念和基本原理 目录 1 标准IO 2 零拷贝 2 1 sendfile调用 2 1 mmap调用 2 2 MQ中的应用 1 标准IO 很多软件是基于server cli
  • MES在流程和离散型制造企业的应用存在哪些差别?

    企业的生产方式 主要可以分为按定单生产 按库存生产或上述两者的组合 从生产类型上考虑 则可以分为批量生产和单件小批生产 从产品类型和生产工艺组织方式上 企业的行业类型可分为流程生产行业和离散制造行业 典型的流程生产行业有医药 石油化工 电力
  • C++ 拷贝构造函数和赋值运算符

    本文主要介绍了拷贝构造函数和赋值运算符的区别 以及在什么时候调用拷贝构造函数 什么情况下调用赋值运算符 最后 简单的分析了下深拷贝和浅拷贝的问题 拷贝构造函数和赋值运算符 在默认情况下 用户没有定义 但是也没有显式的删除 编译器会自动的隐式
  • Direct3D光照

    光照的组成 环境光 这种类型的光经其他表面反射到达物体表面 并照亮整个场景 要想以较低代价粗略模拟这类反射光 环境光是一个很好的选择 漫射光 这种类型光沿着特定的方向传播 当它到达某一表面时 将沿着各个方向均匀反射 无论从哪个方位观察 表面