Недавно я начал разработку приложения с использованием Monogame и вошел в мир шейдеров и языков затенения. Целевая платформа GL. Это означает, что я должен написать свой шейдер в HLSL, который впоследствии преобразуется в GLSL с помощью MojoShader.MojoShader: преобразование HLSL в GLSL
Я пропустил что-то очень очевидное, и мне было интересно, может ли кто-нибудь помочь мне. Вот код, который должен нарисовать каждый объект в сцене в однородном темно-сером цвете.
float4x4 World;
float4x4 View;
float4x4 Projection;
float4 AmbientColor = float4(1, 1, 1, 1);
float AmbientIntensity = 0.1;
struct VertexShaderInput
{
float4 Position : POSITION0;
};
struct VertexShaderOutput
{
float4 Position : POSITION0;
};
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
float4 worldPosition = mul(input.Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);
return output;
}
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
return AmbientColor * AmbientIntensity;
}
technique Ambient
{
pass Pass1
{
VertexShader = compile vs_2_0 VertexShaderFunction();
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}
К сожалению, это просто дает мне пустой экран. Но вот что, когда я изменяю одну строку кода в пиксельном шейдере return AmbientColor * AmbientIntensity;
с return float4(1,1,1,1) * float(1);
, он дает мне правильный результат, и я действительно могу увидеть объект на экране. Как будто, когда я использую глобальные переменные, они устанавливаются в ноль.
Может ли быть проблема при конвертации из HLSL в GLSL, и я должен помнить о некоторых особенностях при написании кода HLSL?
Буду признателен, если вы могли бы помочь мне ответить на эти вопросы или указать мне в правильном направлении. Спасибо.
Благодарим вас за своевременный ответ. Это немного проясняет ситуацию. – MutomboDikey