2015-03-02 49 views
0

在我的HLSL for Direct3d 11應用程序中,我遇到了一個問題,其中texture.Sample內部始終返回0.我知道我的數據和參數是正確的,因爲如果我使用texture.Load而不是Sample,則返回的值是正確的。無法獲取texture.Sample工作,雖然我可以texture.Load在Direct 3d 11着色器中工作正常

這裏是我的聲明:

extern Texture2D<float> texMask; 

SamplerState TextureSampler : register (s2); 

這裏是我的像素着色器works--這證實了我的紋理可正確地着色器和我texcoord值是正確的代碼:

float maskColor = texMask.Load(int3(8192*texcoord.x, 4096*texcoord.y, 0)); 

如果我替換下面這行,maskColor始終爲0,我找不出原因。

float maskColor = texMask.Sample(TextureSampler, texcoord); 

TextureSampler具有默認狀態值; texMask被定義爲1 mip級別。

我也試過:

float maskColor = texMask.SampleLevel(TextureSampler, texcoord, 0); 

並且還總是返回0

C++代碼用於設置採樣:

D3D11_SAMPLER_DESC sd; 
ZeroMemory(&sd, sizeof(D3D11_SAMPLER_DESC)); 
sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; 
sd.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; 
sd.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; 
ID3D11SamplerState* pSampler; 
dev->CreateSamplerState(&sd, &pSampler); 

devcon->PSSetSamplers(2, 1, &pSampler); 
+0

設置採樣器插槽2的C++代碼端是什麼樣的? – 2015-03-03 00:06:58

+0

@ChuckWalbourn - 我添加了C++代碼來設置採樣器;我也嘗試過,沒有設置採樣器,因爲我使用的是默認設置,它似乎沒有什麼區別 – antlersoft 2015-03-03 00:26:02

回答

0

,我發現我的問題 - 我需要指定紋理寄存器以及HLSL中的採樣器。我找不到任何描述的文檔,爲什麼這是必要的,但它確實解決了我的問題。

1

原諒我恢復這種舊的文章,但我想,重要的是增加另一個可能的原因這種問題的人,而這個職位最相關的地方,我能找到張貼。

我也有一個問題,HLSL Sample函數總是返回0,但只有特定的紋理,而不是其他的。我檢查了一下,確保紋理被正確綁定,並且顏色值不應該爲0,並且仍然想知道爲什麼我總是回到這個一個特定紋理,但不是在同一着色器通道中使用的其他紋理。 Load函數工作正常,但是後來我失去了採樣器給我們的很好的功能。

事實證明,在我的情況,我不小心創造了這個質地的描述爲:

D3D11_TEXTURE2D_DESC desc; 
desc.Width = _width; 
desc.Height = _height; 
desc.MipLevels = 0; // <- Bad! 
desc.ArraySize = 1; 
desc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; 
desc.SampleDesc.Count = 1; 
desc.SampleDesc.Quality = 0; 
desc.Usage = D3D11_USAGE_DEFAULT; 
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; 
desc.CPUAccessFlags = 0; 
desc.MiscFlags = 0; 

這個工作,創造一個質感,這是可見和渲染,定義MipLevels爲0時,卻發生了什麼, DirectX會爲該紋理生成一個完整的mip鏈。然而,我是我,我在進一步處理我的項目時忘記了這一點,雖然DirectX可能會生成mip鏈的紋理,但繪製紋理並不會在所有層級上級聯(這是有道理的,我猜想)。

現在,我認爲重要的是要注意,如果這還不夠明顯,我仍然對新的圖形編程有所瞭解。我完全不知道常規的Sample函數使用的mip級別或mip級別的組合。但我可以說,就我而言,它並不是0級。也許它會用於較小的mip鏈,但這種紋理特別總共有12個級別,只有0級才具有任何實際的顏色信息。使用Load函數或SampleLevel顯式訪問mip級別0時工作正常。因爲我不需要也不想要紋理,我嘗試通過採樣獲得一個mip鏈,我只是簡單地改變它的描述來修復它。