2016-11-26 5 views
0

Скажем, у меня есть эти две переменные в моем шейдера:Set шейдера из C# в MonoGame

HLSL

texture ModelTexture; 
sampler2D TextureSampler 

И это, как я установил бы текстуру:

C#

myEffect.Parameters["ModelTexture"].SetValue(woodTexture); 

Что делать с пробоотборником? Нет перегрузки EffectParameter.SetValue(SamplerState), но я хочу изменить фильтры во время выполнения. Как мне это сделать?

Я уверен, что остальная часть кода в порядке, потому что если я инициализирую TextureSampler непосредственно в HLSL, он правильно рисует текстурированные объекты.

Edit:

Я попытался установить объект SamplerState в GraphicsDevice.

C#

GraphicsDevice.SamplerStates[0] = new SamplerState { Filter = TextureFilter.Linear }; 

HLSL

sampler2D TextureSampler : register(s0); 

Теперь назначение текстур (см 2-й фрагмент) бросает NullReferenceException.

Я также попытался установить текстуру, как выше, а не с помощью EffectParameter:

C#

GraphicsDevice.Textures[0] = woodTexture; 

HLSL

texture ModelTexture : register(t0); 

Программа компилируется и работает, но текстура не загружена (выделенный объект черный).

ответ

0

Это долгое время, что я не использовал рамку XNA, но с помощью простого поиска в Google я получаю следующие результаты:

What Is Sampler State?

Sampler состояние определяет, как данные текстуры оцифровываются с помощью текстуры адресации режимы, фильтрацию и уровень детализации. Используйте класс SamplerState для создания объекта состояния семплера. Задайте состояние сэмплера графическому устройству, используя свойство GraphicsDevice.SamplerStates Property.

GraphicsDevice.SamplerStates Property

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

Итак, вы должны создать объект SamplerState и установить его в одном из слотов GraphicsDevice.SamplerStates.

+0

Я отредактировал свой ответ. –

+0

@ matt-pielat Настройте свою текстуру с помощью «GraphicsDevice.Textures» и обратитесь к тексту в файле shader с помощью 'sampler texture: register (s0);' где индекс сэмплера соответствует индексу в коллекции текстур. См. Пример из этой [ссылки] (https://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.graphicsdevice.textures.aspx) – MRB

+0

Компилирует и запускает, но рендер-модель черная. –

0

Состояние пробоотборника задается на объекте графического устройства или внутри самого шейдера.

Смежные вопросы