DIRECT3D基础知识 ---- 渲染与纹理 及位图,顶点缓存释义

什么是渲染:

渲染—采集下的数字影片进行了剪接、加效果、加字幕、音乐等操作,当生成影片时需要将后加入的素材融合到影片中并压缩成为影片最终格式,这个过程就是渲染。


什么是纹理?

早期的计算机生成的3-D图象,它们的表面看起来就象是一个发亮的塑料表面。它们总是缺少一些能使物体看起来更加真实的东西,如表面的磨损、裂纹、人手的印记或是一些污点等等。近几年来,纹理的使用使得计算机三维图象具有了更好的真实感。

一个纹理实际上就是一个位图。从这个意义上来讲,当纹理一词被用于计算机图形学时,它就有了一个明确的定义。从语义学角度来讲,纹理一词既是指一个物体上颜色的模式,又是指物体表面是粗糙的还是光滑的。Direct3D的纹理不会使物体表面真的变得“崎岖不平”,而只是使它的表面看起来是“崎岖不平”的。

由于Direct3D的纹理就是简单的位图,因此任何纹理都可以被用在Direct3D图元上。例如,我们可以创建一些具有木头和谷物图案的对象;也可以将一些青草、泥土和岩石用于一些三维图元,并将它们堆成一座小山,这样就有了一个山坡的背景;或者搞一些路标、悬崖等等。

另外,Direct3D还支持一些高级的纹理技术,如纹理融合(透明或不透明)、光线映射(light mapping)等。

如果程序创建了一个HAL设备、MMX设备或RGB设备,它就可以使用8-、16-、24-或32-bit纹理。使用单色设备的程序可以使用8-bit纹理。

 

位图是一个二维的位数组,此数组的每一个元素与图像的像素一一对应。现实世界的图像被捕获以后,图像被分割成网格,并以像素作为取样单位。位图中的每个像素值指明了一个单位网格内图像的平均颜色。

位图代表了Windows程序中存储图像信息的两种方法之一,另一种形式是元文件。

位图也有两种:GDI位图对象和设备无关的位图(DIB: device-independent bitmap)。

位图基础
位图常用来表示来自真实世界的复杂图像,元文件更适合于描述由人或者机器生成的图像。它们都能存于内存或作为文件存于磁盘上,且能通过剪贴板在Windows应用程序间传输。

位图和元文件的区别在于光栅图像和矢量图像间的差别。光栅图像用离散的像素来处理输出设备;矢量图像用笛卡尔坐标系统来处理输出设备,可在其中绘制线和填充对象。

位图的缺点:1、容易受设备依赖性的影响。2、位图常暗示了特定的显示分辨率和图像纵横比,在缩放后容易出现失真。3、存储空间大。

但位图具有处理速度快的优点。

位图可以手工创建,也可计算机代码生成,还可由硬件设备把现实世界输入到计算机,如数码相机,它们通常是使用接触到光就释放电荷的电荷耦合装置(CCD: charge-coupled device)将光的强度转换为电荷,再用模数转换装置(ADC: Analog-to-digital)转换为数字再排列为位图。

位图尺寸
位图呈矩形,具有空间尺寸,以像素为单位度量位图的高度和宽度。以位于图像左上角为位图原点,从0开始计数。

位图的空间尺寸也指定了其分辨率,但此词具有争议,分辨率也指单位长度内的像素数。

位图是矩形的,但内存是线性的。大多数位图按行存储在内存中,且从顶行像素开始从左到右直到底行结束。

位图还有颜色度量单位:指每个像素所需要的位数,也称颜色深度(color depth)、位数(bit-count)、或位/每像素(bpp: bits per pixel)。每个像素用1位来描述的位图称为二级(bilevel)、二色(bicolor)或单色(monochrome)位图。每个像素也可用多位来描述,可以表示的颜色数等于2的i次方(i为位数)。

如何将颜色位的组合与人们所熟识的颜色相对应是处理位图时经常出现的问题。

顶点缓存:

在游戏中,物体模型是用多边形网格来描述的,一般的是三角形,顶点缓存就是来存储用来描述物体模型的所有多面形的顶点的信息,这些信息有顶点的三维坐标,顶点颜色,顶点法向量,纹理坐标等。

 

使用顶点缓存分为四步

1 设计顶点缓存

就是用来说明你的顶点中有哪些信息

比如: 

struct MYVERTEX

{

float x,y,z;//顶点的三维坐标 x,y,z

DWORD color;//顶点的颜色值

}

然后用一个宏来描述顶点所包含的信息,以便随后设置到环境中

#deifne D3DFVF_MYVERTEX  (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

2 创建顶点缓存

函数 CreateVertexBuffer

比如:

LPDIRECT3DVERTEXBUFFER9g_pVertexBuffer = NULL;

if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL ) ) )
{
return E_FAIL;
}

3 访问顶点缓存

函数 访问之前需要先把顶点缓存的内存锁住,然后读写数据,然后解锁,直接贴出代码

//顶点数据,
CUSTOMVERTEX vertices[] =
{
{ 300.0f, 100.0f, 0.0f, 1.0f,  D3DCOLOR_XRGB(255,0,0), },
{ 500.0f, 100.0f, 0.0f, 1.0f,  D3DCOLOR_XRGB(255,0,0), }, 
{ 300.0f, 300.0f, 0.0f, 1.0f,  D3DCOLOR_XRGB(255,0,0), },

};


//填充顶点缓冲区
VOID* pVertices;
if( FAILED( g_pVertexBuffer->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, vertices, sizeof(vertices) );
g_pVertexBuffer->Unlock();

4 绘制图形

这里就是绘制三角形

这里要分三小步

(1)设置数据源 

函数 SetStreamSource

(2)设置定点格式

函数 SetFVF

(3)绘制图形

函数 DrawPrimitive

贴代码

g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);//设置渲染状态
g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );
--------------------- 

转载地址:

https://zhidao.baidu.com/question/15585106.html

http://blog.sina.com.cn/s/blog_69f141290100oa34.html

https://blog.csdn.net/jddchina/article/details/40022725 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值