通常情況下,我們的render target都是後緩衝,但也可以把render target設定為一個2d 紋理,然後再通過貼圖的方式,把這個2d紋理顯示出來,這樣,就可以在一個螢幕上顯示多個情境了。 本教程中,我們在myTutorialD3D11_59的基礎上,來實現渲染到紋理的效果。 首先,建立一個rendertextureclass,這個類中,我們建立一個2d紋理,並把這個2d紋理設定為render
有時候,我們需要查看depth/stencil buffer的內容,比如上一章中,我們要查看stencil buffer,看看我們設定的stencil值是否起作用,這時就要輸出depth/stencil buffer內容,但這些內容在gpu中,我們並不能直接查看,需要通過紋理copy,資源地圖的方式,拷貝到system memory中才可以直接查看。 下面是輸出depth/stencil buffer的代碼,最終結果被輸出到一個csv檔案中,便於用excel
在myTutorialD3D11_32中,我們在PlaneModelClass中增加一個紋理TextureClass* m_Texture;讀入一個grass的紋理,程式執行後的效果如下:完整的代碼請參考:工程檔案myTutorialD3D11_32代碼下載:http://files.cnblogs.com/mikewolf2002/d3d1127-28.ziphttp://files.cnblogs.com/mikewolf2002/pictures.zip
本教程中,我們利用stencil來實現一個鏡面反射效果。1、首先我們要在D3DClass中增加幾個成員變數及函數。ID3D11DepthStencilState* m_depthStencilStateMirror; ID3D11DepthStencilState* m_depthStencilStateReflect; m_depthStencilStateMirror是渲染鏡子時候,使用的depth stencil 狀態,我們設定stencil 函數為D3D11_
把物體從全局座標系轉化到視點座標系的矩陣稱為視圖矩陣。 下面我們先看下opengl視圖矩陣的推導過程: 假設視點或camera的局部座標係為UVN,UVN分別指向右方、上方和後方從而構成右手座標系,視點則局部座標系處於座標原點。 就如opengl的函數OpenGL的gluLookAt(eyex, eyey, eyez, lookatx, lookaty, lookatz, upx, upy,
上篇日誌中,我們用紋理和光照顏色調製的方式得到最終顏色,本章我們嘗試用紋理採樣的顏色,直接做為材質的漫反射係數Kd,並用它來做光照計算,最後再做個gamma校正,如果不做的話,效果會偏亮。 lighttex.ps主要改動代碼:float4 textureColor = shaderTexture.Sample(SampleType, input.tex);float4 Kd = textureColor; …finalcolor =
原帖地址:http://ogldev.atspace.co.uk/www/tutorial06/tutorial06.html 在這篇教程中,我們開始對3維物體進行位置變化操作,比如平移、旋轉、縮放等等。物體位置變化的操作通常都是通過矩陣來實現的,每種變化用一個矩陣表示,如果一個物體進行多種位置操作,可以把它們對應的矩陣乘起來,最後再乘以頂點的座標,這樣就可以得到物體位置變化後的頂點座標位置。
在C++模式設計中,常用的一種模式設計方法就是監聽者-觀察者模式。每個監聽者對象都把自己理解的事件註冊到一個中心事件處理註冊庫,接收到訊息後,中心事件處理註冊庫會把該訊息分發到每個監聽者對象。 下面是來自於c++ profressional中的代碼:首先是監聽者類:Listener.h 和Listener.cpp,這是一個監聽者基類,該類中定義了訊息處理的純虛函數,代碼如下:#pragma onceclass Listener{public: Listener(void);
在本教程中,我們學慣用opencl進行簡單的影像處理,對一個圖片進行旋轉。圖片讀入、儲存等工作,我們使用開源的FreeImage,:http://freeimage.sourceforge.net/ 首先我們建立一個gFreeImage類,用來裝入映像,該類主要調用FreeImage的函數,首先會初始化FreeImage庫,然後根據檔案名稱猜測影像檔格式,最終load影像檔到變數FIBITMAP *bitmap中去。同時,我們還定義了2個緩衝unsigned char
現在我們看看在不同tess factor的情況下,三角形是如何細分的?(這兒三條邊和內部tess factor值是一樣的,而且partitioning("integer"))下面8張圖是三角形在tess factor 1到8的情況下的細分細節: 因為TS階段是硬體自己做的,沒有演算法細節,所以我們只能從這些圖中,來猜一猜不同tess factor情況下的規律。 可以看出在奇數的情況下,1, 3, 5, 7,…,
原帖地址:http://ogldev.atspace.co.uk/www/tutorial05/tutorial05.html 在這篇教程中,我們將接觸到一種新的shader變數uniform
本教程中,我們開始tessellation編程,共實現了2個程式,第一個tessellation程式,是對一個三角形進行細分操作,第二個程式是對一個四邊形進行細分操作,兩個程式coding差不多,我們先看第一個程式。 程式碼是在myTutorialD3D11_53的基礎上改出來的,首先就是修改ModelClass,用來畫一個三角形。代碼主要的改動是Render函數中// 設定體元語義,渲染三角形列表.
有些時候,我們需要在情境中渲染大量的重複的物體,比如體育場中的觀眾,森林裡面的樹木等等,這些物體具有相似的形狀,比如很多樹木,只是位置不同,或者貼圖不同而已,如果重複渲染這些樹木,用billboard技術,n棵樹,就要輸入n*4個頂點,在樹木很多的時候,這也是比不小的開銷,因為每次都要在system memory和gpu之間傳輸資料。 在D3D11中,通過使用執行個體技術,可以有效減少這種開銷。
billboard稱作公告板,通常用一個quad(四邊形)表示[有的billboard用兩個正交的quad表示],它的特點就是始終面向攝像機的方向。在大規模情境渲染中,可以公告板上貼一個紋理,比如樹,這樣在比較遠的情境中,可以用它表示模型資料,從而減少情境中的頂點數量。 假定xz平面是大地,y軸是向上的方向,則billboard和y軸的方向一致,隨著攝像機位置的改變,billboard必須改變自己的全局座標,始終朝向攝像機。 在billboard類中,
1、第一副圖我們採用各性異性的濾波方式,並設定最大各性異性值為8. samplerDesc.Filter = D3D11_FILTER_ANISOTROPIC; samplerDesc.MaxAnisotropy = 8; 第二副圖我們用了常用的3線性差值濾波方式 samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; 按道理說,對於遠處的紋理貼圖,第一副圖要好些,但我看起來,似乎這兩個效果差不多,
本章嘗試使用紋理行列式,或者說紋理數組,在ps中,使用2個紋理,最終的像素顏色,是光照顏色*紋理1採樣顏色*紋理2採樣顏色,主要是想達到如下的效果: 把這兩個映像以及光照產生的顏色融合產生以像: 為此我們建立一個lighttex2.ps檔案,在其中定義://兩個紋理,可用於紋理混合,bump mapping等等 Texture2D shaderTexture[2]; SamplerState SampleType;…float4
1.對於一個標準的3*3 均值濾波,kernel代碼如下:使用buffer/image緩衝對象__kernel void filter(__global uchar4* inputImage, __global uchar4* outputImage, uint N){int x = get_global_id(0);int y = get_global_id(1);int width = get_global_size(0);int height =
現在看看四邊形在不同tess factor時,四邊形細分的細節,是tess factor1-8時候的細分。tess factor是偶數時候,細分的三角形是對稱的,奇數時候,只有一條對角線,細分的三角形是不對稱的。相比三角形的細分,四邊形的相對來說還算簡單,但邊的細分以及內部環繞四邊形的概念和三角形是一樣的,奇數時,中心是一個小的四邊形,偶數時中心是一個點。
在前面的教程中,我們分析了VS-PS的shader管線組合執行過程,本章我們分析一下VS-GS-PS的管線執行過程,主要是GS階段hardware何如調度。 參考資料:http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-8/ 從D3D10開始,D3D 管線中增加了GS 階段,如所示: