2015-03-02 8 views
0

В моем HLSL для приложения Direct3d 11 у меня возникла проблема, когда текстура. Исключительная внутренняя всегда возвращается 0. Я знаю, что мои данные и параметры верны, потому что, если я использую texture.Load вместо Sample, верное значение верное.Невозможно получить текстуру. Приготовьтесь к работе, хотя я могу получить texture.Load, чтобы нормально работать в Direct 3d 11 shader

Вот мои заявления:

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

Что такое кодовая сторона C++ для установки слота сэмплера 2? –

+0

@ChuckWalbourn - я добавил код C++ для настройки пробоотборника; Я также пробовал это без установки пробоотборника вообще, так как я использую настройки по умолчанию, и это, похоже, не имеет значения – antlersoft

ответ

0

Я нашел мою проблему - мне нужно указать регистр для текстуры, а также пробоотборник в моем HLSL. Я не могу найти какую-либо документацию в любом месте, где описывается , почему это необходимо, но это устранило мою проблему.

1

Прости меня за возрождение такой старый пост, но я полагал, что это важно, чтобы добавить еще одну возможную причину для такого рода проблемы для других, и этот пост является наиболее значимым местом я мог бы найти сообщения в.

У меня тоже возникла проблема, когда функция HLSL Sample всегда возвращала 0, но только на конкретные текстуры, а не на другие. Я проверил, обеспечил правильную привязку текстуры и что значения цвета не должны были 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, рисование текстуры не каскадно через все уровни цепочки (что действительно имеет смысл, я полагаю,).

Теперь, я полагаю, важно отметить, что я все еще новичок во всей работе с графическим программированием, если это еще не было достаточно очевидным. Я абсолютно не знаю, какой уровень mip или комбинация уровней mip используется в обычной функции Sample. Но я могу сказать, что в моем случае это был не уровень 0.Возможно, это будет для более мелкой цепи, но эта текстура, в частности, имела всего 12 уровней, с которыми только уровень 0 имел любую фактическую информацию о цвете, нарисованную на ней. Использование функции Load или SampleLevel для явного доступа к уровню mip 0 работало нормально. Поскольку я не нуждаюсь и не хочу, текстуру, которую я пытаюсь пробовать, чтобы иметь цепочку mip, я просто изменил ее описание, чтобы исправить это.