Хорошо, поэтому я пытаюсь развернуть HLSL в Monogame 3.4. Часть проблемы состоит в том, что многие из существующих примеров, которые я нахожу, работают неправильно, поэтому я не могу понять, что я делаю неправильно, и ошибка, которую я получаю, не помогает!Проблемы с HLSL в Monogame
Я пытаюсь передать текстуру и текстуру палитры в пиксельный шейдер, на данный момент я использую SpriteBatch для рисования, но в конце концов я буду применять его к многоугольникам (надеюсь). Текстура проходит через метод рисования SpriteBatch (я предполагаю, что S0), тогда как мне нужно передать palleteImage с помощью параметров, однако, когда я пытаюсь сделать следующее, я получаю NullException в SetValue, поскольку он не считает, что есть параметр. Есть идеи? Или более того, есть рабочий пример, который я вижу, как многие из существующих элементов пиксельного шейдера, которые я нахожу, не работает на MonoGame 3.4!
HLSL
sampler TextureSampler : register(s0);
texture paletteImage;
sampler2D PaletteSampler = sampler_state {
Texture = <paletteImage>;
};
float4 PixelShaderFunction(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
{
float4 tex = tex2D(TextureSampler, texCoord);
float2 coords = float2(0.5f, 0.5f);
float4 palColour = tex2D(PaletteSampler, coords);
return tex * color;
}
technique Technique1
{
pass Pass1
{
PixelShader = compile ps_4_0 PixelShaderFunction();
}
}
код Розыгрыш
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
effect.CurrentTechnique.Passes[0].Apply();
effect.Parameters["paletteImage"].SetValue(paletteImage);
// draw here
spriteBatch.Draw(texture, new Rectangle(10, 10, texture.Width * 3, texture.Height * 3), Color.White)
spriteBatch.End();
Исключение происходит в SetValue, насколько я могу сказать HLSL это хорошо, но что-то неладно ... Я заметил, что если он не считает, что параметр используется, он выдает ошибку (например, я попытался передать цвет, но это было не до тех пор, пока я не использовал этот цвет в коде HLSL, который был принят ... это то же самое вещь?)
Не удалось/не нужно просто проверить, не является ли 'effect.Parameters [" paletteImage "]' значением null перед попыткой вызвать 'SetValue'? (Или вы даже можете использовать '? .', если вы на C# 6.0.) Судя по тому, что вы сказали по другому ответу, вы получаете« NullReferenceException ». – 31eee384
Я проверял, был ли параметр доступен для отладки, это было не то, почему я был смущен, поскольку HLSL был действительным, насколько я мог судить. В конце концов выясняется, что он удалял его, потому что считал, что он не используется, и только после того, как я заставил его использовать его, он действительно побежал. – mikelomaxxx14
Моя точка зрения заключается в том, что вместо изменения шейдерного кода для «принудительных» переменных, которые вы должны использовать, вы можете сделать свой код на стороне процессора гибким и только предоставить параметры по мере необходимости. – 31eee384