Почему результаты отличаются при использовании TextureObj.Sample и SampleLevel для выборки текстуры только с 1 уровнем mipmap?
Я реализовал алгоритм оптимизации нормального хранения GBuffer, который называется Best Fit Normal, согласно этой статье Crytek: http://www.crytek.com/cryengine/presentations/CryENGINE3-reaching-the-speed-of-light. Он был реализован D3D11, но с Shader Model 4.0.
Мне нужно отобрать наиболее подходящую текстуру нормального вида из-за использования этого алгоритма. На самом деле это операция с экранным пространством, и у этой текстуры только один уровень mipmap, поэтому я должен сэмплировать только уровень 0 этой текстуры, используя TextureObject.SampleLevel( texcoord, 0.0f). Но когда я сэмплирую его только с уровнем 0, на конечном изображении появляются пиксели черного и белого шума. Если я вместо этого использую TexObj.Sample( texcoord), эти шумы исчезли. Насколько я знаю, эти две функции должны действовать точно так же в этом случае, но почему результаты разные? Есть ли какая-то магия, когда GPU выполняет эти инструкции?
Кстати, когда я использую SampleLevel для выборки текстуры, окончательное качество выглядит лучше, чем при использовании Sample. Любая помощь будет благодарна, спасибо!
1 ответ
Вы пытались проанализировать проблему с PIX (или графическим отладчиком VS2012), чтобы убедиться, что ваша исходная текстура одинакова в обоих случаях? Кроме того, может быть полезно, если вы можете опубликовать два снимка экрана сравнения двумя способами.