Shader資料型別和精度

2021-09-29 09:10:37 字數 2021 閱讀 8840

高精度:float

高精度浮點值;一般是32位(就像是普通程式語言中的浮點數)

完全浮點精度通常用於世界空間位置,文理座標或者涉及複雜函式(如三角學或冪/指數)的標量計算

中精度:half

中精度浮點值;一般為16位(範圍為-60000到+60000,精度為3位小數)

half精度是有用的對於短向量,方向,物體空間位置,高動態范的顏色

低精度:fixed

低精度fixed值,一般為11位,位置為-2.0到+2.0,精度為1/256.

fixed精度是有用的對於常規顏色(通常儲存在常規文理)和執行簡單的操作.

整數資料型別

整數(int資料型別)通常用作迴圈計數器或陣列索引.為此,他們通常可以在各種平台上很好的工作.

根據平台的不同,gpu可能不支援整數型別.例如direct3d 9和opengl es 2.0 gpu只對浮點資料進行操作,而看起來很簡單的整數表示式(設計位或邏輯操作)可能會使用相當複雜的浮點數書序指令進行模擬.

direct3d 11、opengl es 3、metal和其他現代平台都對整數資料型別提供了適當的支援,因此使用唯一和位掩蔽可以正常工作.

通常你在你的hlsl**中宣告紋理如下:

sampler2d _maintex;

samplercube _cubemap;

對於一動平台,這些轉換為"低精度取樣器",即紋理中期望有低精度的資料.如果你知道你的紋理包含hdr顏色,你可能想要使用半精度取樣器:

sampler2d_half _maintex;

samplercube_half _cubemap;

或者如果你的紋理包含完整的float精度資料(;如深度紋理),使用乙個完整的精度取樣器:

sampler2d_float _maintex;

samplercube_float _cubemap;

float/half/fixed資料型別使用的乙個複雜之處是pc gpu的精度總是很高.也就是說,對弈所有的pc(window/mac/linux)gpu,在著色器中寫入float,half或者fixed型別並不重要.他們總是以32位浮點精度計算所有的東西.

half和fixed型別只在針對一動gpu時才變的相關,在移動gpu中,這些型別主要是為了電源(有時是效能)約束而存在的.記住,你需要在手機上測試你的著色器,看看你是否遇到精度/數值問題.

及時在移動gpu上,不同的gpu家族也有不同的精度支援.治理是乙個概述,每個移動gpu家族如何對待每個浮點型別(由他們使用的bit數表示)

大多數現在的移動gpu實際上只支援32位數字(用於浮點型別)或16位數字(用於half和fixed型別).一些舊的gpu有不同的頂點著色精度和片段著色器計算.

使用低精度通常可以更快,要麼是由於改進的gpu暫存器的分配,要麼是由於某些低精度數學操作的特殊"快捷路徑"執行單元.即使在沒有原始效能優勢的情況下,使用較低的精度通常也會減少gpu的功耗,從而提高電池的壽命.

一般的經驗法則是,除了位置和紋理座標之外,所有的開始都要有half的精度.只有當half的精度不足以滿足某些部分的計算時,才能提高精度.

支援無窮大,nans和其他特殊的浮點值.

支援特殊的浮點值取決於哪個(主要是移動)gpu家族你正在執行.

所有支援direct3d 10的pc gpu都支援非常詳細的ieee 754浮點標準。這意味著浮點數在cpu上的行為與常規程式語言中的行為完全相同。

移動gpu可以有稍微不同的支援級別。在一些情況下,用0除0可能會得到nan(不是數字);在其他情況下,它可能導致無窮大、零或任何其他未指定的值。確保在目標裝置上測試著色器,以檢查它們是否受支援。

number資料型別顯示精度問題

create table wjytemp no number 16,2 insert into wjytemp values 11111111111111.11 sqlplus查詢結果 11111111111111.10 解決 1.設定plsql讓它顯示原本的值 工具 首選項,開啟視窗,然後選擇sq...

資料型別 基本資料型別和引用資料型別

一.分類 1,五種簡單資料型別 基本資料型別 number,string,boolean,null,undefined,新增symbol es6 基本資料型別是指存放在棧中的簡單資料段,資料大小確定,記憶體空間大小可以分配,它們是直接按值存放的,所以可以直接按值訪問。1 undefined 宣告的變...

VB6中雙精度和單精度資料型別的比較

單精度 single 和雙精度 double 資料 類型是vb6裡的兩種浮點型別 它們被用來儲存帶有小數的數值。小數的位數可以變化 所以名字叫 浮點 因為小數點的位置可以變化。例如 1.23456 12.3456 123.456 雙精度和單精度的差別 大多數程式設計師都知道雙精度型別容納的數值要比單...