2015-12-15 4 views
1

Хорошо, поэтому я пытаюсь развернуть 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, который был принят ... это то же самое вещь?)

ответ

0

Я действительно решил это, получается, если я заменил значение цвета в конце значком palcolour, это сработает! Это почти так, как будто все это зависит от того, используете ли вы все значения в цепочке по цепочке. Безумный а?

+0

Не удалось/не нужно просто проверить, не является ли 'effect.Parameters [" paletteImage "]' значением null перед попыткой вызвать 'SetValue'? (Или вы даже можете использовать '? .', если вы на C# 6.0.) Судя по тому, что вы сказали по другому ответу, вы получаете« NullReferenceException ». – 31eee384

+0

Я проверял, был ли параметр доступен для отладки, это было не то, почему я был смущен, поскольку HLSL был действительным, насколько я мог судить. В конце концов выясняется, что он удалял его, потому что считал, что он не используется, и только после того, как я заставил его использовать его, он действительно побежал. – mikelomaxxx14

+0

Моя точка зрения заключается в том, что вместо изменения шейдерного кода для «принудительных» переменных, которые вы должны использовать, вы можете сделать свой код на стороне процессора гибким и только предоставить параметры по мере необходимости. – 31eee384