當前位置:首頁 » 編程軟體 » d3d編程

d3d編程

發布時間: 2022-04-01 10:10:47

㈠ DirectX編程函數問題

如果「取適配器顯示模式」失敗,它就返回「假」。

呵呵,我也是剛學DX,我Q:532739140
一起學習。

㈡ 誰有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();
}
********************************************************************

㈢ D3D游戲編程中音效怎麼加需要什麼頭文件和庫文件

音效卡的技術指標很多,以下是各種具體指標的具體含義。如果您是個專業級的音響發燒友,這些牽涉到聲音質量的具體指標可不能不看。

目錄 [隱藏]
1 S/PDIF
2 采樣位數與采樣頻率
3 復音數
4 動態范圍
5 API介面
6 HRTF
7 ASIO
8 AC-3
9 DLS技術
10 SB1394標准

[編輯] S/PDIF
S/PDIF是SONY、PHILIPS家用數字音頻介面的簡稱,可以傳輸PCM流和Dolby Digital、dts這類環繞聲壓縮音頻信號,所以在音效卡上添加S/PDIF功能的最重大意義就在於讓電腦音效卡具備更加強大的設備擴展能力。S/PDIF技術應用在音效卡上的表現即是音效卡提供了S/PDIF In、S/PDIF Out介面,如果有數字解碼器或者帶有數字音頻解碼的音箱,你就可以使用S/PDIF介面作為數碼音頻輸出,使用外置的DAC(Digital-Analog Converter:數字→模擬轉換器,簡稱數模轉換器)進行解碼,以達到更好的音質。

S/PDIF介面一般有兩種,一種是RCA同軸介面,另一種是TOSLINK光纜介面。其中RCA介面(是非標準的,它的優點是阻抗恆定、有較寬的傳輸帶寬。在國際標准中,S/PDIF需要BNC介面75歐姆電纜傳輸,然而很多廠商由於各種原因頻頻使用RCA介面甚至使用3.5mm的小型立體聲介面進行S/PDIF傳輸。

在多媒體音效卡上,S/PDIF分為輸出和輸入兩種形式,也就是通常所說的S/PDIF OUT和S/PDIF IN。音效卡的S/PDIF OUT主要功能是將來自電腦的數字音頻信號傳輸到各種外接設備。在目前的主流產品中,S/PDIF OUT功能已經非常普及,通常以同軸或者光纖介面的方式做在音效卡主卡或者數字子卡上。而S/PDIF IN在音效卡中主要功能則是接收來自其它設備的PCM信號,最典型的應用就是CD唱片的數字播放。雖然所有CD-ROM都具有CD播放能力,但效果有優劣之分。主要原因在於CD-ROM所採用的DAC品質不同,從而造成了效果上的差異。但如果你的音效卡上擁有一個兩針的S/PDIF IN插口,那麼就可以通過一條兩芯的數字CD信號傳輸線連接到CD-ROM的Audio Digital Out介面。這樣當播放CD唱片的時候,CD上的PCM信號就不經過DAC,而直接被輸出到音效卡上,隨後再由音效卡進行D/A轉換或者通過S/PDIF OUT輸出。一般音效卡CODEC晶元的D/A轉換品質總是好過CD-ROM上的DAC,因此通過S/PDIF技術,CD播放質量就被有效提高了。

[編輯] 采樣位數與采樣頻率
音頻信號是連續的模擬信號,而電腦處理的卻只能是數字信號。因此,電腦要對音頻信號進行處理,首先必須進行模/數(A/D)的轉換。這個轉換過程實際上就是對音頻信號的采樣和量化過程,即把時間上連續的模擬信號轉變為時間上不連續的數字信號,只要在連續量上等間隔的取足夠多的點,就能逼真地模擬出原來的連續量。這個「取點」的過程我們稱為采樣(sampling),采樣精度越高(「取點」越多)數字聲音越逼真。其中信號幅度(電壓值)方向采樣精度,我們稱之為采樣位數(sampling resolution),時間方向的采樣精度稱為采樣頻率(sampling frequency)。

采樣位數指的是每個采樣點所代表音頻信號的幅度。8bit的位數可以描述256種狀態,而16bit則可以表示65536種狀態。對於同一信號幅度而言,使用16bit的量化級來描述自然要比使用8bit來描述精確得多。其情形就尤如使用毫米為單位進行度量要比使用厘米為單位要精確一樣。一般來說采樣位數越高,聲音就越清析。

采樣頻率是指每秒鍾對音頻信號的采樣次數。單位時間內采樣次數越多,即采樣頻率越高,數字信號就越接近原聲。采樣頻率只要達到信號最高頻率的兩倍,就能精確描述被采樣的信號。一般來說,人耳的聽力范圍在20hz到20Khz之間,因此,只要采樣頻率達到20Khz×2=40Khz時,就可以滿足人們的要求。現時大多數音效卡的采樣頻率都已達到44.1或48Khz,即達到所謂的CD音質水平了。

[編輯] 復音數
在各類音效卡的命名中,我們經常會發現諸如64、128之類的數字。有些用戶乃至商家將它們誤認為是64位、128位音效卡,是代表采樣位數。其實64、128代表的只是此卡在MIDI合成時可以達到的最大復音數。所謂"復音"是指MIDI樂曲在一秒鍾內發出的最大聲音數目。波表支持的復音值如果太小,一些比較復雜的MIDI樂曲在合成時就會出現某些聲部被丟失的情況,直接影響到播放效果。復音越多,音效越逼真,但這與采樣位數無關,如今的波表音效卡可以提供128以上的復音值。

另外需要注意的是"硬體支持復音"和"軟體支持復音"之間的區別。所謂"硬體支持復音"是指其所有的復音數都由音效卡晶元所生成,而"軟體支持復音"則是在"硬體復音"的基礎上以軟體合成的方法,加大復音數,但這是需要CPU來帶動的。眼下主流音效卡所支持的最大硬體復音為64,而軟體復音則可高達1024。

[編輯] 動態范圍
動態范圍指當聲音的增益發生瞬間態突變,也就是當音量驟然或突然毫米波時,設備所有名承受的最大變化范圍。這個數值越大,則表示音效卡的動態范圍越廣,就越能表現出作品的情緒和起伏。一般音效卡的動態范圍在85dB左右,能夠做到90dB以上動態范圍的音效卡是非常好的音效卡了。

==Wave音效與MIDI音樂==

WAVE音效合成與MIDI音樂的合成是音效卡最主要的功能。其中WAVE音效合成是由音效卡的ADC模數轉換器和DAC數模轉換器來完成的。模擬音頻信號經ADC轉換後為數字音頻後,以文件形式存放在磁碟等介質上,就成為聲音文件。這類文件我們稱之為wave form文件,通常以.wav為擴展名,因此也稱為wav文件。WAVE音效可以逼真地模擬出自然界的各種聲音效果。可惜的是wav文件需要佔用很大的貯存空間,也正是這個缺點,造就了MP3的成長。

MIDI,即樂器數字化介面,是一種用於電腦與電子樂器之間進行數據交換的通信標准。MIDI文件(通常以.mid為文件擴展名)記錄了用於合成MIDI音樂的各種控制指令,包括發聲樂器、所用通道、音量大小等。由於MIDI文件本身不包含任何數字音頻信號,因而所佔的貯存空間比wav文件要小得多。MIDI文件回放需要通過音效卡的MIDI合成器合成為不同的聲音,而合成的方式有FM(調頻)與Wave table(波表)兩種。

大多數廉價的音效卡都採用的FM合成方式,FM合成是通過振盪器產生正弦波,然後再疊加成各種樂器的波形。由於振盪器成本較高,即使是OPL3這類高檔的FM合成器也只提供了4個振盪器,僅能產生20種復音,所以發出音樂聽起來生硬呆板,帶有明顯的人工合成色彩。與FM合成不同,波表合成是採用真實的聲音樣本進行回放。聲音樣本記錄了各種真實樂器的波形采樣,並保存在音效卡上的ROM或RAM中(要分辨一塊音效卡是否波表音效卡,只需看卡上有沒有ROM或RAM存儲器即可)。目前中高檔音效卡大都採用了波表合成技術。

==輸出信噪比==

「輸出信噪比」是衡量音效卡音質的一個重要因素,其概念為——輸出信號電壓與同時輸出的噪音電壓的比例,單位是分貝。這個數值越大,代表輸出時信號中被摻入的噪音越小,音質就越純凈。音效卡作為電腦的主要輸出音源,對信噪比要求是相對較高的。由於聲音通過音效卡輸出,需要通過一系列復雜的處理,所以決定一塊音效卡信噪比大小的因素也有很多。由於計算機內部的電磁輻射干擾很嚴重,所以集成音效卡的信噪比很難做到很高,一般其的信噪比在80dB左右。PCI音效卡一般擁有較高的信噪比(大多數可以輕易達到90dB),有的高達195dB以上。較高的信噪比保證了聲音輸出時的音色更純,可以將雜音減少到最低限度。而音色的好壞則取決於產品所選用的音效晶元和卡的做工。如果可能的話,購買音效卡前最好先進行試聽,如果實在沒有得試聽的話,可以多留意周圍媒體對它的評價,或許對你的選購有一些幫助。

[編輯] API介面
API就是是編程介面的意思,其中包含了許多關於聲音定位與處理的指令與規范。它的性能將直接影響三維音效的表現力,主要有下面幾種:

Direct Sound 3D
Direct Sound 3D,是微軟公司提出的3D效果定位技術,它最大特點就是硬體無關性,在音效卡出現初期,許多音效卡晶元沒有自己的硬體3D音效處理能力,都是使用這種Direct Sound 3D來模擬出立體聲。它所產生的效果均由CPU通過即時運算產生,比較耗費CPU資源,所以,此後推出的音效卡都擁有了一個所謂的「硬體支持DS3D」能力。如果你在選購音效卡時聽銷售商說音效卡支持D3D多麼好的話,千萬不要就輕信這是一塊好音效卡,其實際聽覺效果要看音效卡自身採用的HRTF演算法能力的強弱而定。
A3D
A3D是Aureal公司開發的一項專利技術。它是在Direct Sound 3D的API介面基礎上發展起來的。A3D最大特點是能以精確定位(Positional)的3D音效增加新一代游戲軟體交互的真實感,這就是通常所說的3D定位技術。A3D目前有1.0、2.0和A3D3.0三個版本。1.0版包括A3D Surround和A3D Interactive兩大應用領域,特別強調在立體聲硬體環境下就可以得到真實的聲場模擬,A3D 1.0中同時間內只能處理8個音源,取樣頻率是22kHz,AUREAL音效卡中的AU8820晶元使用的就是這種技術。2.0則是在1.0基礎上加入了聲波追蹤技術,進一步加強了性能,A3D 2.0同時則可以處理16個音源,取樣頻率已達48kHz,它是當今定位效果最好的3D音頻技術之一,AU8830晶元就支持這種技術。至於3.0版本早就被提出了,不過由於Aureal公司已經被創新收購,A3D3.0的前途還是個未知數。
由於Aureal的A3D技術在3D定位及交互性聲音處理(這是兩大關鍵部分)方面具有優勢,加之支持Direct Sound 3D硬體加速,因而很多游戲開發商都是基於A3D進行3D游戲開發的。不過由於實現起來成本頗高,因而並不是每塊PCI音效卡都支持該技術。

A3D Surround
A3D Surround吸收了A3D技術和環繞聲解碼技術(如Dolby的 ProLogic和AC-3)之精華,突出特點是只使用兩只普通音箱(或一副耳機)在環繞三維空間中,進行聲音的精確定位(也就是說可產生與五個「虛擬音箱」相同的效果)。當然,這五組音頻流並不像傳統的「家庭影院」那樣需要用5個實際的音箱進行回放,它實際上只是經過A3D Surround處理後用兩個音箱播放出來的。這一技術被杜比實驗室授予「Virtual Dolby」認證。
EAX
EAX是由創新公司在其SB LIVE!系列音效卡中提出的標准,全名為Environmental Audio Extension,即環境音效。EAX是建立在DS3D上的,只是在後者的基礎上增加了幾種獨有的聲音效果命令。EAX的特點是著重對各種聲音在不同環境條件下的變化和表現進行渲染,但對聲音的定位能力不如A3D,EAX建議用戶配備4聲道環繞音箱系統。現在支持EAX2的主要就是EMU10K1和MU10K2晶元,它們分別為創新著名的SB Live!和Audigy系列音效卡所採用,該晶元同時還支持A3D1、HRTF等技術,是目前流行兼容音效卡中的精品。
註:目前,A3D和EAX是API介面中的兩大流派,你在購買的時候,最好弄清楚選擇的音效卡支持哪些音效,所支持的版本是多少,是軟體模擬還是硬體支持,這些都是十分關鍵的。

[編輯] HRTF
HRTF是Head Related Transfer Function的縮寫,中文意思是「頭部對應傳輸功能」,它也是實現三維音效比較重要的一個因素。簡單講,HRTF是一種音效定位演算法,它的實際作用在於用數字和演算法欺騙我們的耳朵,使我們認為自己處了一個真實的聲音環境中。3D定位是通過音效卡晶元採用的HRTF演算法實現的,定位效果也是由HRTF演算法決定的。象Aureal和Creative這樣的大公司,他們既能夠開發出強大指令集規范,同時也可以開發出先進的HRTF演算法並集成在自己的晶元中。當然也有一些廠商專門出售或者為音效卡訂定各種各樣的HRTF演算法,比較有名的就要算Sensaura 3D和Qsound。Sensaura 3D是由CRT公司提供的。Sensaura,支持包括A3D 1.0和EAX、DS3D在內的大部分主流3D音頻API,此技術主要運用於ESS、YAMAHA和CMI的音效卡晶元上。而QSound開發的Q3D,主要包括三個部分,第一部分是3D音效和聽覺環境模型,第二部分是立體音樂加強,第三個部分是虛擬的環境音效,可以提供一個與EAX相仿的環境模擬功能,但效果還比較單一,與Sensaura大而全的性能指標相比稍遜一籌。此外C-MEDIA在CMI8738上則使用自己的HRTF演算法,稱為C3DX,支持EAX和DS3D,實際效果很一般。

==IAS== IAS是Interactive Around-Sound的縮寫,它是 EAR(Extreme Audio Reality)公司在開發者和硬體廠商的協助下開發出來的專利音頻技術,該技術可以滿足測試系統硬體、管理所有的音效平台的需求。開發者只需寫一套音效代碼,所有基於Windows 95/98/2000的音頻硬體將通過同樣的編程介面來獲得支持。IAS為音效設計者管理所有的音效資源,提供了DS3D(Direct Sound 3D)支持。此外,它的音效輸出引擎會自動配置最佳的3D音頻解決方案,其中有四信道模式的音效卡將是首要的目標。而DS3D 可以在現有的雙喇叭平台上獲得支持。

[編輯] ASIO
ASIO是Audio Stream Input Output的縮寫,可翻譯為「音頻流輸入/輸出」的意思。通常這是專業音效卡或高檔音頻工作站才會具備的性能。採用ASIO技術可以減少系統對音頻流信號的延遲,增強音效卡硬體的音頻處理能力。同樣一塊音效卡,假設使用 MME 驅動時的延遲時間為750毫秒,那麼當換成ASIO驅動後延遲量就有可能會降低到40毫秒以下。

但是並非所有的音效卡都能夠支持ASIO。ASIO不僅定義驅動標准,還必須要求音效卡主晶元的硬體支持才能夠得以實現。只有那些價格高貴的專業音效卡,在設計中才會考慮到對ASIO的支持。我們常所用的音效卡,包括創新過去的SB Live!系列都屬於民用卡的范疇,沒有配備了ASIO驅動的。不過創新SoundBlaster Audigy已經開始全面支持ASIO技術。

註:SB Live!的主晶元EMU10K1本身支持ASIO,只是這一性能並未在創新自帶的LiveWare! 3.0驅動中體現出來。因此,當你將SB Live!的驅動程序換成採用同樣規格設計的E_mu APS錄音卡的驅動後,音頻處理軟體就會報告說找到ASIO!另外CMI8738本身也是具備ASIO的潛質,只不過至今還沒有合適的驅動將其發揮出來。

[編輯] AC-3
AC-3是完全數字式的編碼信號,所以正式英文名為「Dolby Digital」,是由著名的美國杜比實驗室(Dolby Laboratories)。Dolby的一個環繞聲標准。AC-3規定了6個相互獨立的聲軌,分別是——前置兩聲道,後置環繞兩聲道,一個中置聲道和一個低音增強聲道。其中前置、環繞和中置五個聲道建議為全頻帶揚聲器,低音炮負責傳送低與80Hz的超重低音。早期的AC-3最高只能支持5.1聲道,在經過不斷的升級改進,目前AC-3的6.1 EX系統增加了後部環繞中置的設計,讓用戶可以體驗到更加精準的定位。

對於AC-3,目前通過硬體解碼和軟體解碼這兩種方式實現。硬體解碼是通過支持AC-3信號傳輸音效卡中的解碼器,將聲間進行5.1聲道分離後通過5.1音箱輸出。軟體解碼就是通過軟體來進行解碼的,(如DVD播放軟體WinDVD、PowerDVD都可以支持AC-3解碼,當然音效卡也必須支持模擬六聲道輸出。),不過這種工作方式比較大的缺陷在於解碼運算需要通過CPU來完成,會增加了系統負擔,而且軟解碼的定位能力依然較遜色,聲場相對較散。

雖然軟體模擬AC-3存在著缺陷,其成本相對低廉,目前中低檔的音效卡大都是使用這種方式。

[編輯] DLS技術
DLS全稱為"Down Loadable Sample",意為「可供下載的采樣音色庫」。其原理與軟波表頗有異曲同工之處,也是將音色庫存貯在硬碟中,待播放時調入系統內存。但不同點在於運用DLS技術後,合成MIDI時並不利用CPU來運算,而依靠音效卡自己的音頻處理晶元進行合成。其中原因在於PCI音效卡的數據寬頻達到133Mb/秒,大大加寬了系統內存與音效卡之間的傳輸通道,PCI音效卡就可使用先進的DLS技術,將波表音色儲存於硬碟中,通過音效卡晶元處理,在播放MIDI時調入內存。從而既免去了傳統ISA波表音效卡所要配備的音色庫內存,又大大降低了播放MIDI時的CPU佔用率。這樣不但提供了良好的MIDI合成效果又可免去ISA波表音效卡上必須配備的音色庫內存,而且這種波表庫可以隨時更新,並利用DLS音色編輯軟體進行修改,這都是傳統波表所無法比擬的優勢。

[編輯] SB1394標准
SB1394是創新公司為達到高速數字音頻傳送(約400Mbps)所提出的IEEE1394兼容標准。創新的SB1394標準保證通過SB1394連接的1394介面設備可發揮最大效能,傳輸速度高達400Mbps,使主機與外設之間大文件的高速傳送成為可能。Sound Blaster Audigy2音效卡就內置SB1394,可通過IEEE 1394標准介面外接設備如DV攝象機等,並可連接63台電腦進行低延遲的聯網游戲

㈣ dx 3D編程怎麼學才可以學到精華

現在書籍很少 雖然有 但因為這是微軟剛出的sdk 段時間 鮮少有人能精通
現在開始學 就是靠些基本 知識 多練 藉助 幫助信息慢慢摸索的
不要急於求成 總有一天你會成功的

㈤ C++ D3D編程光照問題...小白死在這個坎上了..

我也是小白,不過我嘗試著回答一下。
我理解的問題是:准心是帶alpha的,你想通過 alpha混合/去除color key之類的方法,在一個 已經繪制過的圖片上面 繪制一個透明的准心。
我認為什麼時候開啟 alpha 功能是很重要的。

一般都是這樣的:在 繪制(render/draw) 物品前,把需要開的 一些功能都打開, render結束了再關掉(當然這個影響效率,暫時不討論)

那麼你應該先不開 alpha,繪制出你要的那些東西。 最後 ,再開alpha,再繪制出你 需要用alpha繪制的圖形。

以上是我的理解。

㈥ D3D編程游戲編程

要在VC中成功編譯Matlab引擎程序,必須包含引擎頭文件engine.h並引入Matlab對應的庫文件libmx.lib、libmat.lib、libeng.lib。具體的說,打開一個工程後,做如下設置(以VC6為例):

1) 通過菜單工程/選項,打開設置屬性頁,進入Directories頁面,在目錄下拉列表框中選擇Include files,添加路徑:"C:\matlab\extern\include"(假定matlab安裝在C:\matlab目錄)。

2) 選擇Library files,添加路徑:C:\matlab\extern\lib\win32\microsoft\msvc60。

3) 通過菜單工程/設置,打開工程設置屬性頁,進入Link頁面,在Object/library moles編輯框中,添加文件名libmx.lib libmat.lib libeng.lib。

以上步驟1)、2)只需設置一次,而步驟3)對每個工程都要單獨設定,對於其它C++編譯器如Borland C++ builder,設置大體相同,不再贅述。

在調用Matlab引擎之前,首先應在相關文件中加入一行:#include "enging.h",該文件包含了引擎API函數的說明和所需數據結構的定義。

㈦ 游戲里的D3D模式和OPENGL模式各是什麼意思工作原理有什麼不同

D3D,全稱為Direct3D,是微軟為提高3D游戲在Windows中的顯示性能而開發的顯示程序介面,目前已經升級到12版本,它提供了豐富的3D功能庫,是游戲廣泛採用的標准。

OpenGL是用於渲染2D、3D矢量圖形的跨語言、跨平台的應用程序編程介面(API)。這個介面由近350個不同的函數調用組成,用來繪制從簡單的圖形比特到復雜的三維景象。

兩者工作原理上的不同:

1、D3D的原理在於只需要調用D3D提供的介面函數和功能就能實現顯示功能,通過分工合作,極大的降低了軟體開發周期和成本。

2、OpenGL的高效實現是利用了圖形加速硬體,存在於Windows,部分UNIX平台和Mac OS。這些實現一般由顯示設備廠商提供,而且非常依賴於該廠商提供的硬體。

(7)d3d編程擴展閱讀:

OpenGL規范由1992年成立的OpenGL架構評審委員會(ARB)維護。ARB由一些對創建一個統一的、普遍可用的API特別感興趣的公司組成。

據OpenGL官方網站,2002年6月的ARB投票成員包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland;

Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems,Microsoft曾是創立成員之一,但已於2003年3月退出。

㈧ 現在學習directx的2D游戲編程是應該學習什麼

1. 使用d3d編寫2d游戲不會降低運行效率, 相反會提升很多. 說個最直接的吧, 從前ddraw的圖片加工都是由cpu處理, 而d3d完全可以由gpu代為處理. 如果是需要像素級別的碰撞檢測, 這個性能提升就是不言而喻的了.
說明: 簡單說下如何使用d3d進行2d編程吧.
1. 創建3d設備.
2. 創建quad陣列用於投影紋理.(簡單一點來說可以先創建一個單位四邊形用於貼圖)
3. 創建符合你要求的正交投影矩陣
4. 將四邊形繪制上backbuffer, 窗口模式一下, 全屏模式swap一下即可. 其中可以通過shader在多重紋理階段創建各種顯示效果.

㈨ D3D游戲開發大家都是如何學習的怎麼感覺那麼難

這本書裡面應該有許多範例,嘗試自己寫一下這些範例,多看看網上的範例,寫的代碼多了,想不記住這些函數名都難,記住四個字:熟能生巧。這是最好的學習方法。個人感受。樓主連寫最簡單的移動都無從下手,不太可能吧?移動很簡單的,無非就是重繪和疊加。樓主有可能基礎比較薄,才會這樣。龍書確實經典,但可惜講的太簡略,對於新手來講會有點困難。相信樓主肯定不清楚這些函數的底層實現原理是怎樣的。我先學的opengl,後學的dx,這樣的話看龍書的時候感覺簡單多了,而且關於opengl的基礎教程遠遠比dx要多,因此對於新手來講學opengl比學dx要簡單,而且學校的計算機圖形學一般用opengl授課,因此先學opengl在學dx是不錯的選擇。如果樓主覺得為了學dx先學opengl太麻煩,只能慢慢啃龍書了。不會的地方一定要刨根問底,細節地方不要忽略。關鍵要靠自己,堅持堅持再堅持,個人感受。
剛看了一下,龍書上的範例還是不少的,樓主一定要把這些範例一行一行的讀懂,弄懂每一行的用意,然後嘗試自己寫出來,一定大有裨益,我學opengl就是這么做的。看書不在於多,在於精,我在學的時候,幾乎每天都要到網上發帖問問題,因為水平太菜,但不懂的問題最後都明白了,沒有一個例外。樓主只要反復推敲龍書,應該可以學個差不多。

熱點內容
演算法實驗分析 發布:2025-01-24 13:20:25 瀏覽:135
安卓和ios步數哪個准確 發布:2025-01-24 13:12:13 瀏覽:290
怎麼給電腦換配置 發布:2025-01-24 13:04:04 瀏覽:920
如何修改服務密碼10086 發布:2025-01-24 12:44:27 瀏覽:513
dosftp連接 發布:2025-01-24 12:35:56 瀏覽:803
編程來炒股 發布:2025-01-24 12:35:14 瀏覽:855
python正則中括弧 發布:2025-01-24 12:32:08 瀏覽:585
配置排列用英語怎麼說 發布:2025-01-24 12:32:00 瀏覽:608
led流水燈c語言程序 發布:2025-01-24 12:28:15 瀏覽:47
蘋果平板鎖屏密碼在哪裡 發布:2025-01-24 12:16:41 瀏覽:959