怎樣使用深度紋理

2021-08-23 14:58:17 字數 2553 閱讀 1637

這個問題經常出現, 所以我試著來總結一下ati和nvidia晶元對於深度紋理的支援情況. 如果發現我說錯了nvidia的深度實現, 請告知我 :)

ati和nvidia在硬體上都支援深度紋理, 雖然方法不一樣. 深度紋理的建立非常相似:

* **的格式

- ati

**了兩個fourcc 來建立16或24位深度的紋理

:#define fourcc_df16 ((d3dformat) makefourcc('d','f','1','6')) #define fourcc_df24 ((d3dformat) makefourcc('d','f','2','4'))

df16

在r300或以上的晶元(9500+)上支援而df24 只有rv530 和以上的晶元(x1600和x1900)才支援

.- nvidia 使用預定義的d3dfmt_d16 和d3dfmt_d24s8 格式.geforce3 和之後的晶元都支援這個.

大多數情況下16位的格式應該滿足多數需要了. 只要你適當地選擇投影矩陣(近裁剪面盡量大)並且z的範圍適當, 它的精度是足夠的. 強烈建議盡可能選擇16位的shadow map, 因為它具有更好的效能, 而且被廣泛支援.

* 要檢測這些格式的有效性, 可使用

checkdeviceformat() api.

- 因此, 對於ati的16位深度紋理需要呼叫

:hres = d3d->checkdeviceformat(adapter, devicetype, adapterformat, d3dusage_depthstencil, d3drtype_texture, fourcc_df16);

- 對於

nvidia:

hres = d3d->checkdeviceformat(adapter, devicetype, adapterformat, d3dusage_depthstencil, d3drtype_texture, d3dfmt_d16);

注意, 檢查nvidia的裝置id比上面的做法更安全, 因為nvidia的深度紋理是」過載」的現有格式(乙個關鍵的不同就是對nvidia的深度紋理進行取樣返回的不是真正意義上的深度值).

* 紋理表面(su***ce)建立

同樣的, ati和nvidia的呼叫只有一點不同

:- 對於

ati:

hres = d3ddevice->createtexture(shadowmapwidth, shadowmapheight, 1, d3dusage_depthstencil, fourcc_df16, d3dpool_default, &pshadowmap);

- 對於

nvidia:

hres = d3ddevice->createtexture(shadowmapwidth, shadowmapheight, 1, d3dusage_depthstencil, d3dfmt_d16, d3dpool_default, &pshadowmap);

* 中間的設定(su***ce繫結, viewport, 等等) 兩者都是一樣的.

* 當渲染完成後深度紋理可以當作是一張普通紋理通過settexture() 來使用.

* ati和nvidia的深度紋理實現的主要不同是在shader的使用上

.- 從ati深度紋理進行取樣會返回深度值. 這需要shader取出深度並與輸入的z值進行比較. 這樣允許更為靈活的為每個取樣選擇濾波掩模(kernel)和權重. x1600和x1900支援一項叫做fetch4的特性, 它會在每次紋理指令執行時返回四個鄰近的深度取樣到目標rgba通道. 這就使高效能的shadow map和更大的掩模成為可能

.- 從nvidia的深度紋理進行取樣會返回pcf(percentage-closer-filtered)的結果, 並且在取樣的同時會自動與輸入的z值做比較.

自動迎合ati或nvidia版本的深度紋理建立應該是很簡單的, 因為它們在**上非常相似. 大部分的工作在於hlsl shader**中的#ifdef來區分ati和nvidia風格的逐畫素陰影貢獻計算. 雙方的開發**上都有相應的**和shader示例和文件.

為了確保高效能, 有兩條值得注意的事情(基於實際的例子:)):

- 記著在渲染投影物體到深度紋理時關閉顏色寫入(color write). 大多數情況下你會對深度紋理的內容感興趣(執行時需要繫結乙個有效的跟深度紋理/紋理大小一致的顏色緩衝(color buffer)). "忘記"關閉顏色寫入會引起不必要的顏色緩衝頻寬消耗.

- 關於渲染透明(alpha測試)投影物體到深度紋理: 確保只對需要透明的三角形開啟了alpha測試(或者texkill 如果目標su***ce不能與

d3dusage_query_postpixelshader_blending

一起使用). 為所有投影物體 保持alpha測試開著(或使用乙個

texkill

shader)會讓早期的z優勢失效, 因為pixel shader可能會在深度比較之前執行

.所有陰影渲染也可以使用同乙個靈活的shader, 但這需要付出額外的步驟:)

nick

european developer relations, ati technologies

[email protected]

深度緩紋理

create a texture object storing color glgentextures 1,m udepthtexid glbindtexture gl texture 2d,m udepthtexid gltexparameterf gl texture 2d,gl texture...

UntiyShader之深度紋理

unity是可以取得物體的深度值,相當於可以取得z buffer的值,這個需要在相機上獲得,另外需要硬體支援 首先在相機上開啟獲取深度渲染 getcomponent depthtexturemode depthtexturemode.depth 然後就可以在shader中使用了,需要先申明 samp...

openGL 紋理使用

最近找了點資料學習了下opengl 紋理的使用 先有個 整體把握,然後再去看大部頭中的細節講解,感覺這樣的學習方式好些 總結下紋理使用總體流程 1 啟用紋理 glenable gl texture 2d 2 載入紋理 3 紋理 的顯示 載入紋理 1 讀取紋理影象高寬和畫素資料到記憶體中,老版本 op...