簡體   English   中英

在像素着色器中檢測單通道紋理

[英]Detect single channel texture in pixel shader

是否可以檢測格式何時在 HLSL 或 GLSL 中具有單個通道? 或者同樣好,是否可以從這樣的紋理中提取灰度顏色而不知道它是單通道還是 4 通道?

從 DXGI_FORMAT_R8_*/GL_R8 或 DXGI_FORMAT_BC4_UNORM 等紋理格式采樣時,我得到純紅色 RGBA 值 (g,0,0,1)。 如果我知道(在着色器中)紋理只有一個通道,這就不是問題,因為我可以用那個紅色值填充其他通道。 但是做任何這種性質的事情都會破壞顏色紋理的邏輯,需要一個單獨的編譯版本來進行灰色采樣(對於每個紋理槽)。

如果不為現代着色器專門化着色器,就不可能在現代着色器中有效地使用灰色紋理嗎?

目前我能想到的唯一解決方案是在 CPU 端檢測灰色紋理並在 GPU 端生成一個宏,為每個紋理槽選擇不同的着色器編譯版本。 使用 8 個紋理槽執行此操作將為每個想要支持灰色輸入的着色器添加多達 8x8=64 個編譯版本。 這還不包括其他真正有意義的類似宏的開關。

明確一點,我知道我可以將這些紋理作為 4 通道灰度紋理加載到 GPU memory,然后從那里加載到 go。 但是這樣做會使用 4X memory,我寧願再加載 3 個紋理。

OpenGL中,有兩種方法可以實現您要查找的內容:

  1. 舊版: INTENSITYLUMINANCE紋理格式將在采樣時產生vec4(I,I,I,I)vec4(L,L,L,1)
  2. 現代:使用調配蒙版對每個紋理應用用戶定義的通道調配: glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, {GL_RED,GL_RED,GL_RED,GL_ONE});

DirectX 12中,您可以在創建ShaderResourceView期間使用組件映射

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM