2016-03-30 9 views
0

Недавно я начал разработку приложения с использованием 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?

Буду признателен, если вы могли бы помочь мне ответить на эти вопросы или указать мне в правильном направлении. Спасибо.

ответ

0

Система FX в DirectX позволяет вам инициализировать равномерные переменные AmbientColor и AmbientIntensity со значениями, но GLSL не позволяет вам это делать. В этом случае HLSL - это только система FX, построенная поверх HLSL, которая позволяет это.

Таким образом, эти униформы будут по умолчанию равными нулю (или, возможно, некоторым другим неинициализированным значением).

Перед использованием шейдера GLSL вам необходимо установить равномерные константы в программном коде. В OpenGL это обычно делается путем вызова glUniform1f и glUniform4f.

+0

Благодарим вас за своевременный ответ. Это немного проясняет ситуацию. – MutomboDikey