用户:  密码: 记住我     找回密码 
| 文章 >> 编程语言 >> C / C++

MFCD3D中的应用-Direct3D的教程第三部分

日期 | 作者彼得巴斯:非常有帮助 | 浏览86 | 评分100 | 标签C / C++ 评论

{S0}简介
最后,自定义的Direct3D框架和3D教程期待已久的第三部分,封装在类CXD3D中。 中,我们涵盖了从枚举对象和渲染循环的3D设置的选择。在这个问题上,我们将涉及从一个到另一个坐标空间和转换,以及与实际的几何数据的占位符或缓冲区。转换
转换用于转换对象geoemtry,从一个坐标空间到另一个。最常见的变化是使用矩阵。矩阵是改造值,他们的数据和应用的一个必不可少的工具。
所以我们是处理矩阵代数来执行3D几何转换,最终移动,旋转和缩放对象,来表达一个对象到另一个对象相对位置,并改变观看的位置,方向,和/或透视。
改造世界(或世界矩阵)基本上地方在现场到一个单一的参考坐标系中的所有对象。图片以原点为中心的一个单位立方体,如果世界矩阵持有翻译(5,5,5),立方体得到​​5个单位推到右侧,5个单位和5个单位。形式上,对象已经从对象的空间转换到世界空间。
在对象空间(又名模型空间或局部空间),所有的0the对象顶点定义一个共同的起源。在这个例子中,单位立方体的定义是(0,0,0)为中心,使上层的右前角(0.5,0.5,-0.5);在世界空间中,实际上是在那个角落(5.5,5.5 ,4.5)。
世界的改造,可以包括任何翻译,旋转和换算比例的组合,只要你按照矩阵代数规则构建。然而,大多数的应用程序应避免过于频繁,性能方面的原因,改变世界的改造。
想在一个房间里的椅子,你可以定义一个单人椅模型(即,一个顶点缓冲区资源),设置世界矩阵放置的第一把交椅,改变世界矩阵来放置第二个椅子等等;当你完成所有的椅子,你恢复到其原始状态的世界矩阵,使现场的其余部分正确呈现。
这是很好的说,6把椅子,但如果它是我们谈论的,或者是椅子被踢出周围千主席,您的应用程序将采取一个显着的性能命中时有太多的转换发生,所以你可能需要考虑不同的方法。顺便说一下,模拟单个对象可以移动(或踢)周围一定程度的保真现实,invloves的物理规律,实时和很多很多的转换。
你可以妥协的定义组的椅子,每个椅子或组保持单独的转换矩阵,通过手动改变顶点,通过使用索引缓冲区或顶点着色器,不管他们是由前改造到位的每个椅子和方向,或通过合并两个或多个这些方法。它最终取决于它是什么,你想要做的椅子在现场,所以要尽量设计在您的应用程序中的一个潜在的瓶颈提前转型的变化,并保持到最低限度,因为他们可能是昂贵的操作。
后,您将在世界中的对象,你放到观众,因此,转化的观点改造对象世界坐标。
视图变换(或视图矩阵)将在世界空间浏览器,眼或摄像机空间的顶点。让观众在原点开始,寻找到积极的Z,在世界空间:视图矩阵为单位矩阵,观众可以看到挂出那里的单位立方体(5,5,5)。现在观众向上移动10个单位;多维数据集的下降(5,-5,5)在相机的空间,可能是不再可见。现在观众打开,直到他向下俯视;立方体沿x轴逆时针90度旋转,直到它停止在摄像机空间(5,5,5);如果现在观众向前(积极到世界空间Z),立方体将向下移动摄像机空间。从某种意义上说,就像是一个猫捉老鼠的游戏,与对象的移动和旋转观众做什么,相反的确切金额。
我知道的例子是不容易的可视化,所以要尽量想作为的模拟视频摄像头,通过移动周围的世界转换的,它不是是移动的对象,它是相机(或浏览器,也就是说,你有没有勺子),但在3D图形模拟摄像机的运动,所有的对象必须转化为一个独特的参考坐标系,在该相机始终在原点,在积极寻找ž方向,即相机的空间。
在大多数3D游戏,相机是不断走动,寻找到不同的方向,即观点是不断变化的,即视图矩阵必须不断更新的平移和旋转沿每个轴,因此,3D应用程序的组合如果有太多的改造的对象,将再次表现出相当的滞后。
D3DXMatrixLookAtLH的Direct3D扩展功能使得它可以很方便地设置一个视图矩阵观众的"眼球"看,在世界空间位置和方向。它也需要"?哪个方向是向上"在方向,典型。 (0,1,0)。顺便说一下,如果"向上"是(0,-1,0),你实际上是在一些第一人称射击和飞行模拟器使用y轴反转功能,流行的,如果你推一个杠杆或一根棍子向上或前面,你实际上是鼻子潜水。
有一个D3DXMatrixLookAtRH功能,右手坐标系统,但Direct3D使用左手坐标系,左手拇指点在正z方向。使用右手坐标系(或移植)是不容易的,在Direct3D,它影响的数据排列和转换,所以请务必阅读SDK帮助,如果你没有选择,但使用RH坐标系,因为它本文的范围。
有但另一种转换对象经过投影变换。这是最复杂的,把它作为相机的内部,类似于选择相机镜头开始。
相机具有某一领域的视角(FOV),简单来说,最大的传播,他们可以覆盖。只是相机的水平视野的人,不会使之成为家庭图片,和他们背后的树梢是垂直FOV。如果放大,少人到的图片,如果你缩小,将更多,所以视野放大倍率,或变焦水平的影响。
在拍摄之前,你也希望自己定位使一切的重点,无关的图片,没有什么阻碍,喜欢你,站在你和人群之间有点白痴表弟。
无论最终使得进入拍摄它是内明确定义的卷:一个摄像机的位置尖金字塔切割一个近剪裁的最接近的对象,这一个第三个表弟热金发定义平面,和远最远的对象定义的裁剪平面,在后台的山脉。实际上,这样的卷都有一个名字,它是一个视锥。
在3D图形中,你定义的视锥,这样,即使您的白痴表弟是正确的站在镜头前,他可以"裁剪"离视锥完全由近裁剪平面到右前的金发。此外,如果你推多一点,你会削减她的鼻子,顺便她唯一的​​缺陷。问题是,只有对象的视锥内(或对象部分)呈现,远离世界的其余部分被裁剪视图。
此设置允许3D引擎来呈现世界的一部分,在给定的时间,IO整个世界在任何时候,相应的效率的提高,也负有不可推卸的额外的复杂性。
我必须坚持的观点是一个人工建造的圆台,你不能定义近裁剪平面的比喻,它虽然是3D场景渲染,务实的态度。顺便说一下,在3D游戏中的一个典型的缺陷是看透墙,你如此接近,它得到远裁剪,让你看到它背后的一切。
OK,视锥参数,即水平/垂直FOVs,和近/远剪切平面,用于建设规模和透视矩阵,这是典型的大多数3D应用程序使用的投影矩阵,为了使物体附近的相机出现大于对象的距离。
形式上,投影变换将视锥(在摄像机空间)内的一切投影空间。在实践中,投影矩阵进行平移和缩放的基础上视锥参数。我不会去到这种结构的数学细节,你可以阅读更多关于它的SDK文档; D3DXMatrixPerspective *函数集包装投影矩阵建设,但我们会得到解决的最后几何变换后有下!
预计的3D场景,最终提出一个二维(平面)的渲染目标,又名,视口矩形内的矩形部分。这是最终的坐标系统转换,从投影空间到屏幕平面,或者如果你喜欢,从投影空间视口矩形。
像素寻址指定的左上角为原点的屏幕,因此,正y方向实际上是完全相反的是它在投影空间。此外,视口矩形可能会评估整个渲染目标区域,但未必如此,在这种情况下额外的缩放视口尺寸是必需的。这个转变是由Direct3D在内部进行,但它可以通过改变视口的参数和SetViewport设备方法调整了。
D3DVIEWPORT9结构的X,Y,宽度,和高度的成员描述渲染目标表面上的视口矩形的位置和尺寸(像素)。当应用程序渲染到整个目标面,说640的表面,这些成员应设置为0,0,640,和480,分别。结构也持有MinZ和MaxZ成员的深度范围内,但不要混淆这些裁剪平面;这些成员通常设置为0.0和1.0,表明我们要呈现的投影空间的深度值的整个范围,但可以设置为其他值,以达到特定的效果。例如,您可能他们都设置为0.0强制系统渲染对象的一个​​场景的前景,像一个平视显示器,或两者兼而有之1.0背景迫使其他对象,如天空,。
确定,所以这里是设置投影变换和视口矩形之间的连接。它实际上是一个切实可行的解决方法来计算X - Y -缩放系数和投影矩阵。
,而不是提供水平和垂直FOVs,进行复杂的三角函数来确定缩放参数,我们可以使用视口的宽度和高度的因素,近裁剪平面,并达到相同的结果。这只是来自视锥三角的Direct3D需要利用它来保存至少一个昂贵1/tan的操作(0.5 *视场)。事实上,有没有D3DXMatrixPerspective *功能都FOVs,他们要么没有,或者只是垂直FOV,与视口,宽度高度关系的宽高比。
在一个框架为基础,典型应用视口尺寸,内部设置相匹配的演示参数BackBufferWidth和BackBufferHeight,所以,最后,投影矩阵可以很容易地安装在下面的例子一样:
// setup the projection matrix

float fAspect = (float)m_d3dpp.BackBufferWidth /

                (float)m_d3dpp.BackBufferHeight;



D3DXMatrixPerspectiveFovLH(&m_matProj,  // output

                           D3DX_PI / 4, // vertical FOV

                           fAspect,     // viewport aspect ratio<

/span>

                           1.0e-1f,     // near clipping plane z

                           1.0e+3f);    // far clipping  plane z



m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &m_matProj);

最后,我会证明这些典型参数值。
人类的眼睛是180吗??(PI)的视野,但我们通常要注意的45??在中间,所以45??(PI / 4)是一个典型的价值视野。顺便说一下,好车司机inadvertedly训练他的眼睛,以120??或更多的视野,覆盖的道路,每一个后视镜,和快速的读者使用同样的伎俩。这就是说,有鸟类360当然??但我希望他们不会玩3D游戏。为了达到某种"现实主义",在您的场景,使用PI / 3和PI之间的东西。 acieve鱼眼镜头(广角)镜头失真效果,请使用100至东西??,仅低于180?? Direct3D将不承认它上面的有价证券或任何一个有效的FOV。
典型的全屏显示的宽高比为4:3,或1.33:1,768分之1024,六百分之八百480分之640甚至,或一个广泛的第三次,因为他们身材高大,顺带,使用相同的标准电视。高清晰度电视功能的宽高比为16:9,和常见的运动画面比例是1.85:1和2.35:1,周围的一切,因为他们身材高大两倍宽。你总是更好匹配视口尺寸,再次实现一些现实主义的,但话又说回来,你可以调整拉伸或压缩的形象,以达到某种特殊效果。
裁剪平面,啊,裁剪平面!只要它们之间的比例重要值。在上面的例子中,尽可能接近0.1个单位和1000个单位尽可能的对象,将被渲染,但飞机之间的比例是10000,这是周围最大的典型应用。事情是该比率强烈影响整个深度缓冲区范围的深度值(理想情况下甚至)分布,特别是为16位Z缓冲,最常用的支持的情况下,。这可能会导致渲染之间的密切对象(被称为Z -缓冲战斗),和隐藏在远处的物体表面文物的文物。有一个伟大史蒂夫贝克解释所有你需要知道在的,所以我只会建议保持不久的飞机,至于你能容忍,像他那样,保持1000到10000的比例,作为SDK帮助的建议。提示
有太多的图像帮助你掌握这些概念,在网页或SDK帮助任,但我故意包括没有,他们是最终在纸上预测的网页和这的三维在您的整个点电脑,是不是?尝试精神上来可视化这些口头的"图像",这将有助于改善您的三维可视化技能很多。这是一个我们可以说是智慧生物的主要特点,所以把你的大脑再次阅读,直到你得到一些很好的使用!好了,也许也是一个包括图像lazyness因素,但随后又是我的文章,我哭了,如果我想。3D转换的最后一句话
还有什么我可以说他们呢?嗯,首先,你可以不逃避他们;第二,他们是渲染状态的一部分,因此抑制改变他们过于频繁的自己;第三,投影矩阵没有在所有的变化在大多数应用中,所以你可以通常设置它最多在RestoreDeviceObjects和息事宁人整个渲染循环的其余部分;第四,在某些情况下,你可能能够结合成一个单一的世界观矩阵的世界和视图矩阵和使用它作为世界矩阵,获得了一些性能;第五,选择裁剪平面仔细,并最终发挥/调整矩阵看个究竟!
最后,使用CD3DArcBall类(d3dutil.h)设置鼠标输入的世界(或视图)矩阵; SDK示例做,让您旋转,转换和缩放整个场景用鼠标。顺便说一下,我微薄的贡献类是WM_MOUSEWHEEL消息的处理程序,但作为功课,我将让你实现它。
(真正),最后,请记住,3D转换的顶点数据,空间中的点的集合,定义我们的模型或对象,从而导致下一个主题,顶点缓冲区。顶点缓冲区
顶点缓冲区是Direct3D资源,生活在内存中,通过自己IDirect3DVertexBuffer9接口的代表,可以通过使用设备的方法呈现。
顶点缓冲区的格式是由设计flexible0。这允许应用程序扩展,从简单的位置(X,Y,Z)位置数据,加上正常的,点的大小,漫反射颜色,镜面反射颜色,8个纹理坐标数据集,三个顶点混合权重的数据定义一个顶点或预转化点燃使用固定的顶点管线或可编程顶点管线顶点,又名TL顶点。
OK,所以我们这个在我们头上的方式。让我们先从一个简单灵活的顶点格式(FVF),包括未转换的位置数据,并漫反射颜色。{C}
如果你想添加一对夫妇(U,V)纹理坐标集,同时FVF和自定义的顶点结构必须accomdate从一些D3DFVFmacros额外的帮助,为他们:
#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZ | \

        D3D_FVF_DIFFUSE         | \

        D3DFVF_TEX2             | \ // 2 set of texture coordinates

        D3DFVF_TEXCOORDSIZE2(0) | \ // the 1st set (at index 0) has size 2

        D3DFVF_TEXCOORDSIZE2(1)     // the 2nd set (at index 1) has size 2



struct CUSTOMVERTEX

{

    FLOAT x, y, z;   // position

    DWORD color;     // diffuse ARGB color

    FLOAT tu1, tv1;  // 1st set of u,v texture coords

    FLOAT tu2, tv2;  // 2nd set of u,v texture coords

};



static CUSTOMVERTEX s_Vertices[] =

{

 // x      y     z     ARGB color  u1    v1    u2    v2

 { -1.0f, -1.0f, 0.0f, 0xFF0000FF, 1.0f, 1.0f, 1.0f, 1.0f },

 { +1.0f, -1.0f, 0.0f, 0xFFFF0000, 0.0f, 1.0f, 0.0f, 1.0f },

 { +1.0f, +1.0f, 0.0f, 0xFFFFFF00, 0.0f, 0.0f, 0.0f, 0.0f },

 { -1.0f, +1.0f, 0.0f, 0xFFFFFFFF, 1.0f, 0.0f, 1.0f, 0.0f },

};

我们将得到讨论纹理坐标稍后。现在我只是想让你考虑下一段代码,这两个例子FVFs:
// create a vertex buffer

LPDIRECT3DVERTEXBUFFER9 pVB;



m_pd3dDevice->CreateVertexBuffer(4 * sizeof(CUSTOMVERTEX),

            D3DUSAGE_WRITEONLY,

            D3DFVF_CUSTOMVERTEX,

            D3DPOOL_DEFAULT,

            &pVB,

            NULL);



// lock its vertices and transfer data to them

void* pVerts;



pVB->Lock(0, 0, &pVerts, 0);

memcpy(pVerts, s_Vertices, 4 * sizeof(CUSTOMVERTEX));



// done transferring, unlock it

pVB->Unlock();



...



// render the vertex buffer

m_pd3dDevice->SetStreamSource(0, pVB, sizeof(CUSTOMVERTEX));

m_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);

m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);

所依赖的FVFs功率:只要我们(a)使用标志的有效组合来定义它,(b)宣布与正确的类型,并以正确的顺序的顶点元素,及(c)使用顶点顶点组件的大小和设备方法正确的号码,该设备将知道如何呈现。
的顶点格式SDK的主题是有点易消化,所以我鼓励您尝试;不理会任何与混合权,definetely一个高级主题,也许纹理坐标,我们将最终覆盖。
CreateVertexBuffer设备方法需要一个字节大小,总是顶点倍的顶点组件的大小,它在FVF定义。 PVB是实际的缓冲区返回,我们希望在默认池最高的性能,这是实现"只写"用法相结合,这意味着我们将无法从顶点​​缓冲区读取数据,但我们通常不需要,至少不会在这个例子。顺便说一下,这池/用法相结合,以便在效率方面的关键,在Direct3D SDK帮助中指出,"不指定D3DUAGE_WRITEONLY D3DPOOL_DEFAULT创建的缓冲区可能会遭受严重的性能损失",所以我宁愿不相抵触,一旦微软,始终用它来建立我的顶点缓冲区。
我提到了顶点组件和顶点元素有些松散,让我解释一下。
顶点缓冲区是一个数据流。甲流是一个统一的数据组件阵列。每个组件是由不同的数据元素。流的步幅是一个组件的大小,以字节为单位。
前的DirectX 8,安装在一个单一的来源;时下,顶点缓冲区可容纳的顶点位置和正常的顶点元素的组件,而另一个顶点缓冲区不断的颜色和纹理坐标的顶点元素,所以做出的顶点完整的顶点组成部分,你给每个数据流的设备,它"组成"每个顶点。
这种方法的主要好处是,他们删除了以前使用多纹理的顶点数据的成本。流之前,用户不得不重复的顶点数据集处理的单一和多纹理的情况下,没有未使用的数据元素,或将用于在多纹理的情况下只进行数据元素。这本来就是浪费带宽。为了说明这一点,考虑以下多个流的例子:
// stream 0, pos, diffuse, specular

#define D3DFVF_POSCOLORVERTEX D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR



struct POSCOLORVERTEX

{

    FLOAT x, y, z;

    DWORD diffColor, specColor;

};



// stream 1, tex coord 0

#define D3DFVF_TEXCOORDS0 D3DFVF_TEX0



struct TEXCOORDS0VERTEX

{

    FLOAT tu1, tv1;

};



// stream 2, tex coord 1

#define D3DFVF_TEXCOORDS1 D3DFVF_TEX1



struct TEXCOORDS1VERTEX

{

    FLOAT tu2, tv2;

};

...

// assuming we created and initialised buffers for each FVF...

m_pd3dDevice->SetStreamSource(0, m_pVBPosColor,   0, sizeof(POSCOLORVERTEX));

m_pd3dDevice->SetStreamSource(1, m_pVBTexCoords0, 0, sizeof(TEXCOORDS0VERTEX));

m_pd3dDevice->SetStreamSource(2, m_pVBTexCoords1, 0, sizeof(TEXCOORDS1VERTEX));



// a single DrawPrimitive invocation suffices for 3 streams of 42 triangles

m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 42);

设备的功能结构MaxStreams成员告诉你的最大并发流数目,并应当在从1到16的范围内。我可怜的S3 SuperSavage只支持一个,所以这是我不得不说对多个流!
我们在初始化顶点缓冲区,采用锁定/解锁机制跳下,让我们得到它用。
锁定资源,就是给予其存储CPU访问,因此应用程序必须放弃这种访问释放资源后,用它做。每个resorce接口有其自身的锁定和解锁方法,顶点和索引缓冲区到顶点数据的偏移字节,锁定,锁定的顶点数据的大小,也以字节为单位,当两个参数都设置0(如在显示的例子),整个缓冲区被锁定,作为第三个参数提供的内存缓冲区返回。
最后一个参数描述要执行的锁定类型,同一个价值为0或D3DLOCK标志的组合。标志是,只是一个提示锁定数据的预期用途;例如,D3DLOCK_NOOVERWRITE说,应用程序的"承诺"不覆盖返回的缓冲区,允许司机继续渲染顶点缓冲区,即使锁定。然而,你可能会发现自己意想不到的效果,性能处罚和最有可能的是,在未来的Direct3D版本没有支持,所以对这些标志,如果我是你,我会离开它单独与一个0值,除非你真的知道你在做什么。
顺便说一句,抵消锁定,锁定的大小,将让您锁定顶点缓冲区subportions,但请记住,这并不意味着锁定一个模型的几何部分,如果你仔细设计你的直升机模型,你可能能够锁定第42顶点组件,以动画的主要转子,在随后的锁,顶点358到400尾桨的动画,但是,这绝不是最好的办法做到这一点!你最好每一块你的模型保持独立的缓冲区。
的IDirect3DDevice9::DrawPrimitive方法呈现非索引,从当前数据输入流的指定类型的几何图元的序列。它需要一个以前的IDirect3DDevice9:SetFVF如果您使用一个自定义的FVF(D3DFVF_XYZ除外)。你不应该调用它来呈现一个三角形,并会告诉你多少原语,它可以在一个单一的呼叫处理设备功能MaxPrimitiveCount成员,但在实际应用中,太多的原语将导致中说,0.55的FPS。原语是点,线或三角形,后者在任一列表,条状或风扇的安排之一列出。这种类型的选择dependes完全在您的应用程序,但请记住,每种类型以不同的方式解释数据。
您也可以指定索引的第一个顶点负载和借鉴,加载整个缓冲区0;这可能是有用的,吸取一定的效果或渲染状态,并与另一半缓冲区上半年的,但再次与位置数据无关;它复制到缓冲区,这并不一定反映实际模型的几何顶点的顺序。索引缓冲区
索引缓冲区,由IDirect3DIndexBuffer9接口为代表,包含索引数据的内存缓冲区。指数数据,或指数,到顶点缓冲区的整数偏移,用于呈现原语使用的的IDirect3DDevice9::DrawIndexedPrimitive方法。
由于本身的资源,索引缓冲区的格式,用法,和一个游泳池。格式是有限D3DFMT_INDEX16或D3DFMT_INDEX32,说明缓冲区的位深度。首选池D3DPOOL_DEFAULT,除了一些配置使用AGP内存。用法最好与D3DUSAGE_WRITEONLY单独留在家中,除非你需要读取索引缓冲区(在这种情况下,最好的池将系统内存)。使用混合副总裁时的用法,也可以执行软件索引处理(指数,就像顶点,可以在硬件处理),但必须有一个很好的理由这样做。
指数本身的数据收集到"所有"其他并发流的指数。让我说清楚:如果您使用多个顶点流,所有流的索引索引缓冲区传递给了的IDirect3DDevice9::SetIndices方法。
索引缓冲区允许你获得一些顶点缓冲区中的数据压缩的数据存储效率。比方说,你要呈现一个正方形由两个三角形(有没有"广场"的原始类型,所以你别无选择)。三角形共享两个顶点,每两次出现在顶点缓冲区,以便绘制一个正方形,你需要6个顶点缓冲区中的,甚至当几何,只需要4!
1---3

|\  |

| \ |

|  \|

0---2

另一种方法是创建一个顶点缓冲区,只有四个不同的顶点,并设置索引缓冲,使第一个三角形的顶点(0,1,2)绘制,并与第二个顶点(1,3 ,2)。索引缓冲区的内容是0,1,2,1,3,2。
当然,你可能会觉得有冗余,和我们现在需要10个数据元素的绘制原来的4,你是对的,除了这两个部分的追赶(!):首先,索引缓冲区持有整数值,这需要较少的内存和处理许多倍的速度比浮点值,第二,索引顶点是一个从顶点1和2可以获取绘制第二个三角形的顶点缓存,存储适配器,因为他们最近用来绘制第一个。这样可以节省我们从顶点缓冲区再次从阅读,我们翻译成"感谢您使用仅4个顶点!",一个大的性能提升和奖励。
索引缓冲区仍然可以作出更有效的基本类型,显示的内容是一个三角形列表,假设三角形连接使用。如果我们用一个三角形风扇,其中一个顶点的所有三角形共享,缓冲区减少到1,3,2,0,因为系统的解释,你的意思是使用的第一个三角形(3,2,1) (2,0,1)第二。同样,如果我们用一个三角形地带,原有的索引缓冲区可减少为0,1,2,3,因为假设三角形连接带,并提请(0,1,2)和(1,3,2)。在这两种情况下,我们刚刚保存的两个指数,和系统使我们在后面拍拍说,"感谢您使用仅4指数!"。
原始的选择通常取决于你的模型的实际几何形状,但在任何情况下带和球迷将永远连接的三角形集更好。
有更多的方式来利用索引缓冲区的优势和DrawIndexedPrimitive方法,所以一定跳进他们在在DirectX编程指南,从这里。
我还没有找到一个索引缓冲区的缺点,但话又说回来,我敢肯定,有一个,我就结束这个话题说,仅仅因为他们是如此巨大,它并不意味着它们是适当的所有情况。我用行列出来呈现典型的独特的顶点的多边形(三角形除外),所以没有点在索引,该指数将完全它们在顶点缓冲区中出现的顺序;就是这样。
确定,所以我们覆盖不够。请继续调整,以了解灯光,材质和纹理,即将到来!| hector.j.rivas


中国
我是一名编程爱好者,
谢谢orcode.com为我们提供一个学习和分享的平台。
有什么问题。可以就本内容回复,我看到时。会尽量回复的。
评论会员:CelsoGui 时间:2011/12/07
感谢伟大的工作的{S1} 它给了我一个新的Direct3D SDK的东西方法。为记录:我调整,等待另一部分


塞尔索
评论会员:游客 时间:2011/12/07
艾伦​​布坎南
。是否有一个版本的源代码,本教程中的新exaples的

我下载后tuturialone源,它没有任何新的例子。

阿伦布坎南
评论会员:baloneyman 时间:2011/12/07
正好遇到这个第III部分。感谢伟大的文章!我要回到第1部分,所以我可以看到我错过了什么。再次感谢您抽出宝贵时间来写这个系列。它看起来非常
有用的。

罗伊
 0;
 文章分类
 桌面
 网页开发
 移动开发
 数据库
 多媒体
 编程语言
 平台,框架和库
 编程通用
 图形/设计
 开发周期
 一般阅读
 第三方产品
 作者资源
 其他
快速解答标签
c x 6850
VC x 7405