texldl - ps

使用特定取樣器取樣紋理。 要取樣的特定 mipmap 層級詳細資料必須指定為紋理座標的第四個元件。

Syntax

texldl dst, src0, src1

 

其中:

  • dst 是目的地暫存器。
  • src0 是來源暫存器,可提供紋理樣本的紋理座標。 請參閱 紋理座標暫存器
  • src1 會識別來源取樣器暫存器 (s#) ,其中 # 會指定要取樣的紋理取樣器編號。 取樣器與它相關聯的紋理和 D3DSAMPLERSTATETYPE (列舉所定義的控制項狀態,例如D3DSAMP_MINFILTER) 。

備註

圖元著色器版本 1_1 1_2 1_3 1_4 2_0 2_x 2_sw 3_0 3_sw
texldl x x

 

texldl 會在 src1 所參考的取樣器階段查閱紋理集。 從 src0.w 選取詳細層級。 這個值可以是負數,在此情況下,選取的詳細層級是 0 第一個 (最大地圖) 與 MAGFILTER。 由於 src0.w 是浮點值,因此如果 MIPFILTER 是兩個 mip 層級之間的 LINEAR) ,則會使用小數點值插補 (。 接受取樣器狀態 MIPMAPLODBIAS 和 MAXMIPLEVEL。 如需取樣器狀態的詳細資訊,請參閱 D3DSAMPLERSTATETYPE

如果著色器程式範例來自沒有紋理集的取樣器,則會在目的地暫存器中取得 0001。

以下是參考裝置所遵循的粗略演算法:

LOD = src0.w + LODBIAS;
if (LOD <= 0 )
{
   LOD = 0;
   Filter = MagFilter;
   tex = Lookup( MAX(MAXMIPLEVEL, LOD), Filter );
}
else
{
   Filter = MinFilter;
   LOD = MAX( MAXMIPLEVEL, LOD );
   tex = Lookup( Floor(LOD), Filter );
   if( MipFilter == LINEAR )
   {
      tex1 = Lookup( Ceil(LOD), Filter );                        
      tex = (1 - frac(src0.w))*tex + frac(src0.w)*tex1;
   }
}

限制:

  • 紋理座標不應依紋理大小縮放。
  • dst 必須是 暫存暫存器 (r#) 。
  • dst 可以接受寫入遮罩。 請參閱 目的地暫存器寫入遮罩
  • 遺漏元件的預設值為 0 或 1,且取決於紋理格式。
  • src1 必須是 Sampler (Direct3D 9 asm-ps) (s#) 。 src1 可能不會使用否定修飾詞 (請參閱 目的地暫存器寫入遮罩) 。 src1 可能會使用 swizzle (請參閱 來源暫存器 Swizzling) ,這會在取樣之後套用,但在寫入遮罩之前 (請參閱接受目的地暫存器寫入遮罩) 。 取樣器必須使用 dcl_samplerType (sm2、sm3 - ps asm) ) 著色器開頭宣告 (。
  • 執行紋理樣本所需的座標數目取決於取樣器的宣告方式。 如果它宣告為 Cube,則需要三個元件紋理座標 (.rgb) 。 驗證會強制執行提供給tex_ldl的座標組取樣器所宣告的紋理維度就已足夠。 不過,不保證應用程式實際上會透過 API (設定紋理) 維度等於針對取樣器所宣告的維度。 在這種情況下,執行時間會嘗試偵測 (可能只偵錯) 不相符。 取樣維度比紋理座標中的維度少,將允許取樣,並假設忽略額外的紋理座標元件。 相反地,取樣維度比紋理座標中存在的維度還多的紋理不合法。
  • 如果 src0 (紋理座標) 為 暫存暫存器,則先前必須撰寫上述查閱 (所需的元件) 。
  • 取樣不帶正負號的 RGB 紋理會導致浮點數介於 0.0 和 1.0 之間。
  • 取樣帶正負號的紋理會導致 -1.0 到 1.0 之間的浮點值。
  • 取樣浮點紋理時,Float16 表示資料會在MAX_FLOAT16範圍內。 Float32 表示將使用管線的最大範圍。 未定義任一範圍以外的取樣。
  • 沒有相依的讀取限制。

圖元著色器指示