当前位置:首页 » 硬盘大全 » d3d顶点缓存个数
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

d3d顶点缓存个数

发布时间: 2022-04-29 03:41:37

1. 请教c++写得D3D透视

直接上个例子,参考一下吧,版权归原作者,我只是数据搬运工。
1:d3d的初始化
LPDIRECT3D9 g_pD3D=NULL;//d3d对象
LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;//d3d设备对象
LPDIRECT3DVERTEXBUFFER9 g_pVB=NULL;//顶点缓冲
//初始化D3D
HRESULT InitD3D(HWND hWnd)
{
//创建D3D
g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);
//填充D3DDevice结构
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
//创建D3DDevice
g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,&g_pd3dDevice);
//初始化几何数据
HRESULT InitGeometry()
{
//初始化顶点数据
CUSTOMVERTEX g_Vertices[]= { {-1.0f,-1.0f,0.0f,0xffff0000,}, {1.0f,-1.0f,0.0f,0xff0000ff,}, {0.0f,1.0f,0.0f,0xffffffff,}, };
//创建顶点缓冲区
g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX), 0,D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,&g_pVB,NULL)
//填入顶点数据
VOID*pVertices;
g_pVB->Lock(0,sizeof(g_Vertices),(void**)&pVertices,0)
returnE_FAIL;
memcpy(pVertices,g_Vertices,sizeof(g_Vertices));
g_pVB->Unlock();
//渲染函数
VOID Render()
{
pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER);//更改这两个渲染状态就可以实现透视功能
//清空缓冲
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
g_pd3dDevice->BeginScene()
//在BeginScene后台缓存绘制图形
//开始绘制图形
g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX)); g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,1);
g_pd3dDevice->EndScene();
//在EndScene结束后台缓存渲染图形
//在这可以得到我们的颜色,画准心。
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);//将后台缓存绘制的图形提交到前台缓存显示
}
//清理资源
VOID Cleanup()
{
g_pVB->Release();//释放顶点缓存对象
g_pd3dDevice->Release();//释放设备对象
g_pD3D->Release();//释放d3d对象
}
下面是一篇网上的透视源码作简要注释
bool StartDll=1;
bool WallHack=1;//定义布尔变量用来判断是否开启透视功能
typedef HRESULT(WINAPI* DrawIndexedPrimitive_)(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount);//从这开始是detours hook com接口需要的参数,后面有如何用detours hook com接口的方法,这里定义了一个类型
DrawIndexedPrimitive_ pDrawIndexedPrimitive;
HRESULT WINAPI nDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinIndex,UINT NumVertices, UINT StartIndex, UINT PrimitiveCount)//我们的hack函数。
{
IDirect3DVertexBuffer9* pStreamData = NULL;
UINT iOffsetInBytes,iStride;
pDevice->GetStreamSource(0,&pStreamData,&iOffsetInBytes,&iStride); //用来获取stride,前面是定义这个函数的三个参数
if ( iStride == 40 &&WallHack==1)//这里进行透视判断,当stride=40,WallHack=1时开启透视,如果我们不知道游戏人物的stride,可以增加一个变量把40替换掉,用自加来判断人物st
{
pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);//这里是更改渲染状态,禁用z轴,实现透视的方法,这应该都知道吧。
pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER);
//再给一种写法,两种效果是不一样,下面的人物自身不会透视,看不到自身的结构。
pDevice->SetRenderState(D3DRS_ZENABLE,false);
pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
pDrawIndexedPrimitive(pDevice,Type,BaseVertexIndex, MinIndex, NumVertices, StartIndex,
PrimitiveCount);
pDevice->SetRenderState(D3DRS_ZENABLE,true);
pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
}

return pDrawIndexedPrimitive(pDevice, Type, BaseVertexIndex, MinIndex, NumVertices, StartIndex, PrimitiveCount);//返回值

}
int StartHack ();
BOOL APIENTRY DllMain( HANDLE hMole,DWORD ul_reason_for_call, LPVOID lpReserved )//这是默认的 DLL格式
{
if (StartDll)
{
StartDll=0;
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)StartHack, NULL, NULL, NULL);
}
return TRUE;
}
int StartHack ()//取tb,方法不止一种,我们也可以通过d3d对象来取tb数组,取hook函数位置,自己可以打开d3d头文件数数是在第几个~~
{
char s[1000];
DWORD offsetBase=0x4FE571A0;
for(;; Sleep(500))
{
offsetBase=(DWORD)GetMoleHandle ("d3d9.dll");
if (offsetBase)
break;
}
DWORD a[2];
a[0]=offsetBase+0x88840;
sprintf (s,"[Noobshooter] Mole d3d9 =%08X,Offset FuncHook =%08X",offsetBase,a[0]);
OutputDebugString (s);
pDrawIndexedPrimitive = (DrawIndexedPrimitive_)DetourFunction((PBYTE)a[0],(PBYTE)nDrawIndexedPrimitive);//进行绕到我们的函数,参数,地址,我们的函数
for (;;Sleep (500))//按键的判断
{
if (GetAsyncKeyState (VK_F9)!=0)
{
Beep (2000,200);
Wallhack=1;
}
if (GetAsyncKeyState (VK_F10)!=0)
{
Beep (3000,200);
WallHack=0;
}
}
return 1;
这是detours1.5用来hook com接口的格式
HRESULT STDCALL (*pfSeekTrampoline)(
IStream * This,
LARGE_INTEGER dlibMove,
DWORD dwOrigin,
ULARGE_INTEGER *plibNewPos);
HRESULT STDCALL SeekDetour(
IStream * This,
LARGE_INTEGER dlibMove,
DWORD dwOrigin,
ULARGE_INTEGER *plibNewPos)
{
return pfSeekTrampoline(This, dlibMove, dwOrgin, plibNewPos);
}
void detour_member_function(IStream *pi)
{
(*(PBYTE*)pfSeekTrampoline) = DetourFunction(
(PBYTE)pi->lpVtbl->Seek,
(PBYTE)SeekDetour);
};

2. D3D是什么设备

一个D3D设备接口可以简单的认为是本机一块显卡的抽象,它包含了显卡所有的硬件参数及状态值,比如 说,显卡显存的数量和起始的线性地址,是否支持深度缓冲(Depth Buffer),雾化(Fog),纹理(Texture) 及MipMap等。

在DirectX8.0中,你可以用如下代码建立一个D3D对象:
#include // 必须包含的头文件
#include
LPDIRECT3D8 g_lpD3D = NULL; // D3D对象指针,以后经常用到
if( NULL == (g_lpD3D=Direct3Dcreate8(D3D_SDK_VERSION) ) ) // D3D_SDK_VERSION确保该对象建立正确的头文件上,目前只能用该值。
return E_FAIL;

建立D3D设备
在DirectX 8.0中,建立一个D3D设备需要到用IDirect3D8 接口中的CreateDevice函数,该函数原型如下
HRESULT CreateDevice(
UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS* pPresentationParameters,
IDirect3DDevice8** ppReturnedDeviceInterface
);

函数参数说明可以查询DirectX 8.0 SDK 的文档,不过是英文的,下面给出一段代码说明:
// 该段代码建立一个基于Window窗口程序的D3D硬件抽象层设备,采用软件的顶点数据处理,并使用16Bits 的深度缓冲区。
D3DDISPLAYMODE d3ddm;
HRESULT hr = 0;
hr = g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm );
if( FAILED(hr) )
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE; // 指明是窗口模式,而非全局独占模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 无需交换链
d3dpp.BackBufferFormat = d3ddm.Format; // 后备缓冲区颜色格式
d3dpp.EnableAutoDepthStencil = TRUE; // 使深度缓冲区有效
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 深度缓冲区颜色格式
// Create the D3D Device
hr = g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT, // 使用当前显卡作注设备
D3DDEVTYPE_HEL, // 设备类型
hWnd, // 该程序所在的窗口句柄
D3DCREATE_SOFTWARE_VERTEXPROCESSING, // 用软件的方法处理顶点数据
&d3dpp, // 指向上面的结构
&g_pd3dDevice ) ) ) // 指向3D设备的指针
if( FAILED(hr) )
{
return E_FAIL;
}

3. 500分!关于MFC使用Direct3D直接写屏的问题

我看DirectX一些时间了 找了一个例子应该能帮助你

direct3D中初始化的时候 要用到一个窗口的句柄 比如你所提到的 图片控件
GetDlgItem(控件ID)->GetSafeHwnd();
建立一个对话框工程在DIALOG类里添了3个成员变量:LPDIRECT3D9 m_pd3d; LPDIRECT3DDEVICE9 m_pDevice; HWND m_hwndRender;和3个成员函数InitD3D(),Render(),Cleanup()。然后再适当位置执行他们
这几个函数的放的位置如下
void CMy3dDlg::InitD3D()

{

m_hwndRender =GetDlgItem(IDC_RENDERVIEW)->GetSafeHwnd();

m_pd3d=::Direct3DCreate9(D3D_SDK_VERSION);

D3DPRESENT_PARAMETERS d3dpp;

//The ZeroMemory function fills a block of memory with zeros

::ZeroMemory(&d3dpp,sizeof(d3dpp));

d3dpp.Windowed=TRUE;//window or full screen

d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;//Surface format is unknown

d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;

d3dpp.hDeviceWindow= m_hwndRender;//The handle of the Windows window attached to //this CWnd. The m_hWnd data member is a public variable of type HWND.

m_pd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, m_hwndRender,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&m_pDevice);

}

void CMy3dDlg::Render()

{

m_pDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,255,0),1.0f,0);

m_pDevice->BeginScene();

//

m_pDevice->EndScene();

m_pDevice->Present(NULL,NULL,NULL,NULL);

void CMy3dDlg::Cleanup()

{

m_pDevice->Release();

m_pd3d->Release();

}

void CMy3dDlg::OnPaint()

{

……

InitD3D();//可以放到构造函数里

Render();

}

void CMy3dDlg::OnDestroy()

{……

Cleanup();

}

你想要绘制的东西就放在Render()里面 在绘制以前还要创建 世界矩阵 投影矩阵 观察矩阵 这几个矩阵一版的创建方法 如下
void CMy3dDlg::SetupMatrices()

{

float angle = m_nRotateY * D3DX_PI / 180; //把旋转角换算成弧度

D3DXMATRIX matWorld;

::D3DXMatrixRotationY( &matWorld, angle );

//把世界变换矩阵设置到渲染环境

m_pDevice->SetTransform( D3DTS_WORLD, &matWorld );

D3DXVECTOR3 eye( 0.0f, 3.0f,-5.0f ); //观察点

D3DXVECTOR3 lookat( 0.0f, 0.0f, 0.0f ); //视线目标点

D3DXVECTOR3 up( 0.0f, 1.0f, 0.0f ); //上方向

D3DXMATRIX matView;

//计算视角变换矩阵

::D3DXMatrixLookAtLH( &matView, &eye, &lookat, &up );

//把视角变换矩阵设置到渲染环境

m_pDevice->SetTransform( D3DTS_VIEW, &matView );

D3DXMATRIXA16 matProj;

//计算透视投影变换矩阵

::D3DXMatrixPerspectiveFovLH(

&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );

//把投影变换矩阵设置到渲染环境

m_pDevice->SetTransform( D3DTS_PROJECTION, &matProj );

}

direct3D画图 需要填充定点缓冲区 而定点是按照一定格式定义的 比如说一个三角形
void CMy3dDlg::InitGeometry()

{

//三角形实体的数学模型

CUSTOMVERTEX vertices[] =

{{ -1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(0,0,255) },

{ 0.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(0,0,0) },

{ 1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(0,0,255) }};

//创建顶点缓存区,并获取接口IDirect3DVertexBuffer9的指针

m_pDevice->CreateVertexBuffer(

sizeof(vertices),0, D3DFVF_XYZ | D3DFVF_DIFFUSE,D3DPOOL_DEFAULT,

&m_pVB, NULL );

void* pVertices;

m_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 );

memcpy( pVertices, vertices, sizeof(vertices) );

m_pVB->Unlock();

}
然后就可以在Render里面绘制了

4. 为什么创建了顶点缓存后还要锁住重新创建给另一个指针

要创建一个顶点缓存,需要首先定义一个...
1

缓存描述结构 D3D11_BUFFER_DESC 的说...
2

子资源数据结构用来初始化子资源数据,...
3

它的成员说明如图所示。
4

定义好缓存描述结构和子资源数据之后,...
5

D3D设备对象的成员函数说明如图所示。
6

下图所示的代码将创建一个简单三

5. D3D中邻接数组的值是怎么定义的啊看不懂

邻接数组是一个DWORD数组,记录了mesh中的三角形的相邻关系。邻接数组中的值就是三角形的索引值。
所谓三角形相邻,就是有一条边相同(即有两个顶点相同)。一个三角形有三条边,所以一个三角形有0~3个相邻的三角形。用 (DWORD)-1 表示没有。
Triangle's adjacent to triangle 0: 1 7 11

与三角形0相同的三角形有:1 7 11
从索引缓存中可以知道,三角形0的三个顶点:0 1 2
三角形1的三个顶点:0 3 1
可以看出 三角形0 和 三角形1 有两个相同的顶点
但是 0号三角形 与 7 和 11 没有相同的顶点,为什么也是邻接三角形呢?
看一下D3D接口:
HRESULT ID3DXMESH::GenerateAdjacency( FLOAT fEpsilon, DWORD* pAdjacency );//生成链接数组
参数fEpsilon表示 两个点距离小于fEpsilon时,可以看做一个点。
所以靠得很近的三角形,虽然顶点不同,也可当做邻接三角形。

楼主为什么要纠结于这个问题?生成邻接数组是为了网格优化。会使用就可以了。还是你想实现自己的网格优化算法?

6. DirectX 宏定义的意义

编辑本段概述
DirectX是一种应用程序接口(API),它可让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。这样说是不是有点不太明白,其实从字面意义上说,Direct就是直接的意思,而后边的X则代表了很多的意思,从这一点上我们就可以看出DirectX的出现就是为了为众多软件提供直接服务的。
举个例子吧,骨灰级玩家(玩游戏比较长的)以前在DOS下玩游戏时,可不像我们现在,安装上就可以玩了,他们往往首先要先设置声卡的品牌和型号,然后还要设置IRQ(中断)、I/O(输入于输出)、DMA(存取模式),如果哪项设置的不对,那么游戏声音就发不出来。这部分的设置不仅让玩家伤透脑筋,而且对游戏开发者来说就更头痛了,因为为了让游戏能够在众多电脑中正确运行,开发者必须在游戏制作之初,便需要把市面上所有声卡硬件数据都收集过来,然后根据不同的 API(应用编程接口)来写不同的驱动程序,这对于游戏制作公司来说,是很难完成的,所以说在当时多媒体游戏很少。微软正是看到了这个问题,为众厂家推出了一个共同的应用程序接口——DirectX,只要这个游戏是依照Directx来开发的,不管你是什么显卡、声卡、统统都能玩,而且还能发挥更佳的效果。当然,前提是你的显卡、声卡的驱动程序也必须支持DirectX才行。
编辑本段组成
DirectX是由很多API组成的,按照性质分类,可以分为四大部分,显示部分、声音部分、输入部分和网络部分。
显示部分担任图形处理的关键,分为DirectDraw(DDraw)和Direct3D(D3D),前者主要负责2D图像加速。它包括很多方面:我们播放mpg、DVD电影、看图、玩小游戏等等都是用的DDraw,你可以把它理解成所有划线的部分都是用的DDraw。后者则主要负责3D效果的显示,比如CS中的场景和人物、FIFA中的人物等等,都是使用了DirectX的Direct3D。
声音部分中最主要的API是DirectSound,除了播放声音和处理混音之外,还加强了3d音效,并提供了录音功能。我们前面所举的声卡兼容的例子,就是利用了DirectSound来解决的。
输入部分DirectInput可以支持很多的游戏输入设备,它能够让这些设备充分发挥最佳状态和全部功能。除了键盘和鼠标之外还可以连接手柄、摇杆、模拟器等。
网络部分DirectPlay主要就是为了具有网络功能游戏而开发的,提供了多种连接方式,TPC/IP,IPX,Modem,串口等等,让玩家可以用各种连网方式来进行对战,此外也提供网络对话功能及保密措施。
编辑本段分类
DirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现,让它的其它方面显得暗淡无光。DirectX开发之初是为了弥补Windows 3.1系统对图形、声音处理能力的不足,而今已发展成为对整个多媒体系统的各个方面都有决定性影响的接口。 DirectX 是一组低级“应用程序编程接口 (API)”,可为 Windows 程序提供高性能的硬件加速多媒体支持。Windows 支持 DirectX 8.0,它能增强计算机的多媒体功能。使用 DirectX 可访问显卡与声卡的功能,从而使程序可提供逼真的三维 (3D) 图形与令人如醉如痴的音乐与声音效果。 DirectX 使程序能够轻松确定计算机的硬件性能,然后设置与之匹配的程序参数。该程序使得多媒体软件程序能够在基于 Windows 的具有 DirectX 兼容硬件与驱动程序的计算机上运行,同时可确保多媒体程序能够充分利用高性能硬件。 DirectX 包含一组 API,通过它能访问高性能硬件的高级功能,如三维图形加速芯片和声卡。这些 API 控制低级功能(其中包括二维 (2D) 图形加速)、支持输入设备(如游戏杆、键盘和鼠标)并控制着混音及声音输出。构成 DirectX 的下列组件支持低级功能: Microsoft DirectDraw Microsoft DirectDraw API 支持快速访问计算机视频适配器的加速硬件功能。它支持在所有视频适配器上显示图形的标准方法,并且使用加速驱动程序时可以更快更直接地访问。DirectDraw 为程序(如游戏和二维图形程序包)以及 Windows 系统组件(如数字视频编解码器)提供了一种独立于设备之外的方法来访问特定显示设备的功能,而不要求用户提供设备功能的其它信息。 -------------------------------------------------------------------------------- Microsoft Direct3D Microsoft Direct3D API (Direct3D) 为大多数新视频适配器内置的 3-D 调色功能提供界面。Direct3D 是一种低级的 3-D API,它为软件程序提供一种独立于设备之外的方法以便与加速器硬件进行有效而强大的通信。Direct3D 包含专用 CPU 指令集支持,从而可为新型计算机提供进一步加速支持。 -------------------------------------------------------------------------------- Microsoft DirectSound Microsoft DirectSound API 为程序和音频适配器的混音、声音播放和声音捕获功能之间提供了链接。DirectSound 为多媒体软件程序提供低延迟混合、硬件加速以及直接访问声音设备等功能。维护与现有设备驱动程序的兼容性时提供该功能。 -------------------------------------------------------------------------------- Microsoft DirectMusic Microsoft DirectMusic API 是 DirectX 的交互式音频组件。与捕获和播放数字声音样本的 DirectSound API 不同,DirectMusic 处理数字音频以及基于消息的音乐数据,这些数据是通过声卡或其内置的软件合成器转换成数字音频的。DirectMusic API 支持以“乐器数字界面 (MIDI)”格式进行输入,也支持压缩与未压缩的数字音频格式。DirectMusic 为软件开发人员提供了创建令人陶醉的动态音轨的能力,以响应软件环境中的各种更改,而不只是用户直接输入更改。 -------------------------------------------------------------------------------- Microsoft DirectInput Microsoft DirectInput API 为游戏提供高级输入功能并能处理游戏杆以及包括鼠标、键盘和强力反馈游戏控制器在内的其它相关设备的输入。 -------------------------------------------------------------------------------- Microsoft DirectPlay Microsoft DirectPlay API 支持通过调制解调器、Internet 或局域网连接游戏。DirectPlay 简化了对通信服务的访问,并提供了一种能够使游戏彼此通信的方法而不受协议或联机服务的限制。DirectPlay 提供了多种游说服务,可简化多媒体播放器游戏的初始化,同时还支持可靠的通信协议以确保重要游戏数据在网络上不会丢失。DirectPlay 8.0 的新功能即支持通过网络进行语音通信,从而可大大提高基于多媒体播放器小组的游戏的娱乐性,同时该组件还通过提供与玩游戏的其他人对话的功能而使团体游戏更具魅力。 -------------------------------------------------------------------------------- Microsoft DirectShow Microsoft DirectShow API 提供了可在您的计算机与 Internet 服务器上进行高品质捕获与回放多媒体文件的功能。DirectShow 支持各种音频与视频格式,包括“高级流式格式 (ASF)”、“音频-视频交错 (AVI)”、“数字视频 (DV)”、“动画专家组 (MPEG)”、“MPEG 音频层 3 (MP3)”、 “Windows 媒体音频/视频 (WMA/WMV)”以及 WAV 文件。DirectShow 还具有视频捕获、DVD 回放、视频编辑与混合、硬件加速视频解码以及调谐广播模拟与数字电视信号等功能。 ------------------------------------------------------------------------------------------------------------------------------------------------------
编辑本段DirectX 的历史
DirectX 1.0
第一代的DirectX很不成功,推出时众多的硬件均不支持,当时基本都采用专业图形API-OpenGL,缺乏硬件的支持成了其流行的最大障碍。
DirectX 1.0版本是第一个可以直接对硬件信息进行读取的程序。它提供了更为直接的读取图形硬件的性能(比如:显示卡上的块移动功能)以及基本的声音和输入设备功能(函数),使开发的游戏能实现对二维(2D)图像进行加速。这时候的DirectX不包括现在所有的3D功能,还处于一个初级阶段。
DirectX 2.0
DirectX 2.0在二维图形方面做了些改进,增加了一些动态效果,采用了Direct 3D的技术。这样DirectX 2.0与DirectX 1.0有了相当大的不同。在DirectX 2.0中,采用了“平滑模拟和RGB模拟”两种模拟方式对三维(3D)图像进行加速计算的。DirectX 2.0同时也采用了更加友好的用户设置程序并更正了应用程序接口的许多问题。从DirectX 2.0开始,整个DirectX的设计架构雏形就已基本完成。
DirectX 3.0
DirectX 3.0的推出是在1997年最后一个版本的Windows95发布后不久,此时3D游戏开始深入人心,DirectX也逐渐得到软硬件厂商的认可。97年时应用程序接口标准共有三个,分别是专业的OpenGL接口,微软的DirectX D接口和3DFX公司的Glide接口。而那时的3DFX公司是最为强大的显卡制造商,它的Glide接口自然也受到最广泛的应用,但随着3DFX公司的没落,Voodoo显卡的衰败,Glide接口才逐渐消失了。
DirectX 3.0是DirectX 2.0的简单升级版,它对DirectX 2.0的改动并不多。包括对DirectSound(针对3D声音功能)和DirectPlay(针对游戏/网络)的一些修改和升级。DirectX 3.0集成了较简单的3D效果,还不是很成熟。
DirectX 5.0
微软公司并没有推出DirectX 4.0,而是直接推出了DirectX 5.0。此版本对Direct3D做出了很大的改动,加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,还加入了S3的纹理压缩技术。
同时,DirectX 5.0在其它各组件方面也有加强,在声卡、游戏控制器方面均做了改进,支持了更多的设备。因此,DirectX发展到DirectX 5.0才真正走向了成熟。此时的DirectX性能完全不逊色于其它3D API,而且大有后来居上之势。
DirectX 6.0
DirectX 6.0推出时,其最大的竞争对手之一Glide,已逐步走向了没落,而DirectX则得到了大多数厂商的认可。DirectX 6.0中加入了双线性过滤、三线性过滤等优化3D图像质量的技术,游戏中的3D技术逐渐走入成熟阶段。
DirectX 7.0
DirectX 7.0最大的特色就是支持T&L,中文名称是“坐标转换和光源”。3D游戏中的任何一个物体都有一个坐标,当此物体运动时,它的坐标发生变化,这指的就是坐标转换;3D游戏中除了场景+物体还需要灯光,没有灯光就没有3D物体的表现,无论是实时3D游戏还是3D影像渲染,加上灯光的3D渲染是最消耗资源的。虽然OpenGL中已有相关技术,但此前从未在民用级硬件中出现。
在T&L问世之前,位置转换和灯光都需要CPU来计算,CPU速度越快,游戏表现越流畅。使用了T&L功能后,这两种效果的计算用显示卡的GPU来计算,这样就可以把CPU从繁忙的劳动中解脱出来。换句话说,拥有T&L显示卡,使用DirectX 7.0,即使没有高速的CPU,同样能流畅的跑3D游戏。
DirectX 8.0
DirectX 8.0的推出引发了一场显卡革命,它首次引入了“像素渲染”概念,同时具备像素渲染引擎(Pixel Shader)与顶点渲染引擎(Vertex Shader),反映在特效上就是动态光影效果。同硬件T&L仅仅实现的固定光影转换相比,VS和PS单元的灵活性更大,它使GPU真正成为了可编程的处理器。这意味着程序员可通过它们实现3D场景构建的难度大大降低。通过VS和PS的渲染,可以很容易的营造出真实的水面动态波纹光影效果。此时DirectX的权威地位终于建成。
DirectX 9.0
2002年底,微软发布DirectX9.0。DirectX 9中PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的VertexShader(顶点着色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,每个程序的着色指令增加到了1024条。
PS 2.0具备完全可编程的架构,能对纹理效果即时演算、动态纹理贴图,还不占用显存,理论上对材质贴图的分辨率的精度提高无限多;另外PS1.4只能支持28个硬件指令,同时操作6个材质,而PS2.0却可以支持160个硬件指令,同时操作16个材质数量,新的高精度浮点数据规格可以使用多重纹理贴图,可操作的指令数可以任意长,电影级别的显示效果轻而易举的实现。
VS 2.0通过增加Vertex程序的灵活性,显着的提高了老版本(DirectX8)的VS性能,新的控制指令,可以用通用的程序代替以前专用的单独着色程序,效率提高许多倍;增加循环操作指令,减少工作时间,提高处理效率;扩展着色指令个数,从128个提升到256个。
增加对浮点数据的处理功能,以前只能对整数进行处理,这样提高渲染精度,使最终处理的色彩格式达到电影级别。突破了以前限制PC图形图象质量在数学上的精度障碍,它的每条渲染流水线都升级为128位浮点颜色,让游戏程序设计师们更容易更轻松的创造出更漂亮的效果,让程序员编程更容易。
DirectX 9.0c
与过去的DirectX 9.0b和Shader Model 2.0相比较,DirectX 9.0c最大的改进,便是引入了对Shader Model 3.0(包括Pixel Shader 3.0 和Vertex Shader 3.0两个着色语言规范)的全面支持。举例来说,DirectX 9.0b的Shader Model 2.0所支持的Vertex Shader最大指令数仅为256个,Pixel Shader最大指令数更是只有96个。而在最新的Shader Model 3.0中,Vertex Shader和Pixel Shader的最大指令数都大幅上升至65535个,全新的动态程序流控制、 位移贴图、多渲染目标(MRT)、次表面散射 Subsurface scattering、柔和阴影 Soft shadows、环境和地面阴影 Environmental and ground shadows、全局照明 (Global illumination)等新技术特性,使得GeForce 6、GeForce7系列以及Radeon X1000系列立刻为新一代游戏以及具备无比真实感、幻想般的复杂的数字世界和逼真的角色在影视品质的环境中活动提供强大动力。
因此DirectX 9.0c和Shader Model 3.0标准的推出,可以说是DirectX发展历程中的重要转折点。在DirectX 9.0c中,Shader Model 3.0除了取消指令数限制和加入位移贴图等新特性之外,更多的特性都是在解决游戏的执行效率和品质上下功夫,Shader Model 3.0诞生之后,人们对待游戏的态度也开始从过去单纯地追求速度,转变到游戏画质和运行速度两者兼顾。因此Shader Model 3.0对游戏产业的影响可谓深远。
Directx 10.0
已经包含在Windows Vista操作系统中,目前无法单独下载使用
新的DirectX使你获得更好的图像显示质量,使多人游戏具可伸缩性,以及包括更棒的音频效果。它强化了针对DirectDraw和Direct3D的接口,简化了应用扩展,提升性能;改善了图形创作工具,更易于做出最佳的3-D角色和环境;点光源式光影和像素式光影使图象更逼真;强化了DirectSound和DirectMusic,简化了其应用扩展;DLS2音频合成功能提高了乐器音频的真实感; DirectInput的设备影射功能令对设备的支持更简单;DirectPlay使多人游戏的性能和可扩展性得到了提高; DirectPlay提供了IP声音通讯;DirectShow的应用编程接口提供了音频/视频的实时合成和即时编辑; DirectShow支持Windows媒体音频和视频(WMA和WMV)的读写; Microsoft TV技术可以支持数字电视节目。当然,最重要的是一些新游戏需要它。 DirectX Redist通常每两个月更新一次,包含了DirectX Runtimes的所有更新,可以替代此前发布的旧版本,适合Windows XP、Server 2003、Vista等操作系统,不支持Windows 9x/2000。一般最新的3D游戏等应用程序都需要新的DirectX接口,因此强烈推荐更新,
Vista DX10用户也同样需要。
显卡所支持的DirectX版本已成为评价显卡性能的标准,从显卡支持什么版本的DirectX,用户就可以分辨出显卡的性能高低,从而选择出适合于自己的显卡产品。
现在不下载DirectX的最新版本后果很严重!可以点击下面的链接可以连接到目前最新的DirectX下载页(2008年6月更新)
http://www.microsoft.com/downloads/details.aspx?familyid=822640AB-0983-4C41-9C70-632F6F42C557&displaylang=zh-cn
[font size=4]DirectX 10.1[/font]
正如以前的DX版本一样,DX10.1也是DX10的超集,因此它将支持DirectX 10的所有功能,同时它将支持更多的功能,提供更高的性能。
DX10.1的一个主要提高是改善的shader资源存取功能,在多样本AA时,在读取样本时有更好的控制能力。除此之外,DX10.1还将可以创建定制的下行采样滤波器。
DX10.1还将有更新的浮点混合功能,对于渲染目标更有针对性,对于渲染目标混合将有新的格式,渲染目标可以实现独立的各自混合。阴影功能一直是游戏的重要特效,Direct3D 10.1 的阴影滤波功能也将有所提高,从而可望进一步提高画质。
在性能方面,DirectX 10.1将支持多核系统有更高的性能。而在渲染,反射和散射时,Direct3D 10.1将减少对API的调用次数,从而将获得不错的性能提升。
其他方面,DX10.1的提高也不少,包括32bit浮点滤波,可以提高渲染精确度,改善HDR渲染的画质。完全的抗锯齿应用程序控制也将是DX10.1的亮点,应用程序将可以控制多重采样和超级采样的使用,并选择在特定场景出现的采样模板。DX10.1将至少需要单像素四采样。
DX10.1还将引入更新的驱动模型,WDDM 2.1。与DX10的WDDM2.0相比,2.1有一些显着的提高。
首先是更多的内容转换功能,WDDM2.0支持处理一个命令或三角形后进行内容转换,而WDDM2.1则可以让内容转换即时进行。由于GPU同时要并行处理多个线程,因此内容转换的即时性不仅可以保证转换质量,还可以提升GPU效率,减少等待时间。另外,由于WDDM 2.1支持基于过程的虚拟内存分配,处理GPU和驱动页面错误的方式也更为成熟。
微软预计将在两周之内(2008年7月中旬)宣布新一代API:DirectX 11。消息来源指出,微软将在7月22日举办的Gamefest 2008上宣布新一代API,此前我们得到有关DirectX 11的最新消息是NVIDIA将在八月末的“NVISION 08”会议上讲解DirectX 11。
由微软举办的Gamefest 2008大会将于7月22-23日在西雅图召开,Gamefest 2008大会是微软每年一度的游戏技术探讨盛会,所以有关下一代游戏技术接口API的消息自然也是少不了的话题。
DirectX 11引入最大新技术特征无疑是Tessellation/Displacement,我们还听说了多线程渲染、Compute Shaders也将是DirectX 11中重要环节,另外据说DirectX 11还将引入Shader Model 5.0,具体细节信息目前基本上还是一无所知,Ray Tracing(光线跟踪)与Rasterization(光栅化)技术的支持也还没有提及。
至于DirectX 11何时正式推出,微软一直没有给出确切的消息,此前的传言声称会在今年底明年初完成,可能会随着Windows Vista SP2或Windows 7一同登场,而在DX11之前,DX10.1将成为最后一次小幅更新。

7. 谁有D3D示例程序代码(带说明的)

下面是我自己做的D3D的三角程序你看看吧
环境是VC.NET 2008
首先建一个WIN32的项目,选择WINDOWS应用程序就行了
项目名和cpp文件名都使用myD3D
DX环境是DIRECTX SDK 9.0的环境,具体配置不用我说了吧..
如果运行不了可以加我HI_BAIDU发你原程序.

直接复制粘贴到同名文件里就行
1.******************************************************
//此处是CPP的文件

// myD3D.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "myD3D.h"
#include "d3d9.h"

#define MAX_LOADSTRING 100
#pragma comment(lib,"d3d9.lib")

//声明自定义函数或方法,让他们可见
void InitD3D(HWND hwnd);
void InitVB();
void Render();
void CleanUp();

// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名

//定义D3D指针
//1.顶层指针
LPDIRECT3D9 g_pD3D=NULL;
//2.设备指针
LPDIRECT3DDEVICE9 g_pDev=NULL;
//3.顶点缓冲区指针
LPDIRECT3DVERTEXBUFFER9 g_pVB=NULL;
//4.定义顶点结构体
struct Vertex
{
float x,y,z,rhw;//顶点坐标(RHW代表已经转化为屏幕坐标)
DWORD color;//顶点颜色
};
//5.定义顶点格式的宏
#define D3DFVF_CUSTOM (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;

// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_MYD3D, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{

return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MYD3D));

// 主消息循环:
ZeroMemory(&msg,sizeof(msg));
//while (GetMessage(&msg, NULL, 0, 0))
while(msg.message!=WM_QUIT)
{
//if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();

}
}

return (int) msg.wParam;
}

//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望
// 此代码与添加到 Windows 95 中的“RegisterClassEx”
// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
// 这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYD3D));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MYD3D);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);
}

//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // 将实例句柄存储在全局变量中

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}
//D3D初始化
InitD3D(hWnd);
InitVB();

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
CleanUp();
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}

//D3D初始化:
//1、顶层指针的创建
//2、通过顶层指针创建设备指针
//3、设置设备中的渲染状态
void InitD3D(HWND hwnd)
{
//一、创建顶层指针
g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);
//二、得到当前显卡的显示模式
D3DDISPLAYMODE d3dmm;//显示模式的结构体
//第一个参数是显卡的序号
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3dmm);
//三、通过结构体来设置相关的设备属性
D3DPRESENT_PARAMETERS d3ddp;//设备结构体
ZeroMemory(&d3ddp,sizeof(d3ddp));
d3ddp.Windowed=true;//设置全屏(false)窗口(true);
//设置前台与后台缓冲区的交换模式
//当前台与后台交换后清空后台缓冲区
d3ddp.SwapEffect=D3DSWAPEFFECT_DISCARD;
//设置后台缓冲区的格式与前台一致
d3ddp.BackBufferFormat=d3dmm.Format;
//四、创建设备
g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,//显卡序号,设置当前显卡为主显卡
D3DDEVTYPE_HAL,//使用硬件抽象层
hwnd,//当前窗口句柄
D3DCREATE_SOFTWARE_VERTEXPROCESSING,//顶点处理方式(选择软件)
&d3ddp,//设置相关结构体
&g_pDev);//设备指针
//设置着色状态
g_pDev->SetRenderState(
D3DRS_SHADEMODE,//着色状态
D3DSHADE_GOURAUD);//值为1
}

//绘制3D信息的函数
void Render()
{
//1.绘制图形前需要先清空缓冲区
if(NULL==g_pDev)//如果设备为空则退出
return;

g_pDev->Clear(0,//缓冲区个数0代表清空所有缓冲区
NULL,//代表清空缓冲区的所有区域
D3DCLEAR_TARGET,//颜色缓冲区标志
D3DCOLOR_XRGB(0,0,255),//清空颜色
1.0f,//用来清空深度缓冲区
0);//用来清空模版
//2.通知D3D开始绘制
g_pDev->BeginScene();
//3.绘制图形所有的代码
//3.1设置数据源
g_pDev->SetStreamSource(
0,//数据流的标号
g_pVB,//顶点缓冲区
0,//起始点的开始坐标位置
sizeof(Vertex));//一个顶点所占据的字节数
//3.2设置顶点格式
g_pDev->SetFVF(D3DFVF_CUSTOM);
//3.3进行绘制图形,在3D后台绘制
g_pDev->DrawPrimitive(D3DPT_TRIANGLELIST,//画的形式
0,//开始位置的索引号,顶点位置对应顶点数组)
1);//代表绘制图元的个数

//4.绘制结束
g_pDev->EndScene();
g_pDev->Present(NULL,NULL,NULL,NULL);
}
//释放设备
void CleanUp()
{
if(g_pDev!=NULL)
{
g_pDev->Release();
g_pDev=NULL;
}
if(g_pD3D!=NULL)
{
g_pD3D->Release();
g_pD3D=NULL;
}
}
//初始化顶点缓冲区
void InitVB()
{
//给三角形顶点进行赋值,存在系统中
Vertex ver[]=
{
{150.0f,50.0f,0.0f,1.0f,0xff00ff00},
{250.0f,250.0f,0.0f,1.0f,0xffff00ff},
{50.0f,250.0f,0.0f,1.0f,0xff0000ff}
};
//1.创建应用程序顶点缓冲区指针
g_pDev->CreateVertexBuffer(
sizeof(ver),//分配所有顶点缓冲区的大小
0,//顶点缓冲区的标志
D3DFVF_CUSTOM,//顶点缓冲区的格式
D3DPOOL_DEFAULT,//当前显存池
&g_pVB,//顶点缓冲区的指针
NULL);
//2.对顶点缓冲区加锁与解锁
//2.1目的:数据拷贝的安全性.
//2.2得到一个临时指向顶点缓冲区空间指针,用该指针去
//操作这段显存的空间
Vertex *pVer=NULL;
//2.3.对顶点缓冲区进行加锁
g_pVB->Lock(0,
sizeof(ver),//控制加锁的空间大小
(void**)&pVer,//得到临时指向顶点缓冲区的指针
0);//标志
//2.4内存之间的拷贝
memcpy(pVer,ver,sizeof(ver));
//2.5解锁
g_pVB->Unlock();
}
********************************************************************

8. 请教d3d中SetStreamSource中的流序号问题

*设置资源流
HRESULT SetStreamSource(

UINT StreamNumber, //渲染数据流序号

IDirect3DVertexBuffer9 *pStreamData, //进行绑定的顶点缓冲区指针

UINT OffsetInBytes, //进行绑定连接的渲染数据流的起始位置

UINT Stride //渲染数据流中一个顶点所占的内存的大小

9. DX创建顶点缓冲区的问题--超过64K个点怎么会这样...

最近也在学DX,关注一下。
缓冲区应该是和显存内存有关吧,LZ能提供一下网格的生成代码么?