Xna MojoShader:HLSL到GLSL的转换
我最近开始使用Monogame开发一个应用程序,并进入了着色器和着色语言的世界。目标平台是GL。这意味着我必须在HLSL中编写着色器,随后由MojoShader将其转换为GLSL 我似乎错过了一些非常明显的事情,我想知道是否有人能帮我。下面是一个代码,该代码用于将场景中的每个对象绘制为均匀的深灰色Xna MojoShader:HLSL到GLSL的转换,xna,glsl,monogame,hlsl,Xna,Glsl,Monogame,Hlsl,我最近开始使用Monogame开发一个应用程序,并进入了着色器和着色语言的世界。目标平台是GL。这意味着我必须在HLSL中编写着色器,随后由MojoShader将其转换为GLSL 我似乎错过了一些非常明显的事情,我想知道是否有人能帮我。下面是一个代码,该代码用于将场景中的每个对象绘制为均匀的深灰色 float4x4 World; float4x4 View; float4x4 Projection; float4 AmbientColor = float4(1, 1, 1, 1); float
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代码>带返回浮点4(1,1,1,1)*浮点(1)代码>它给了我正确的结果,我可以在屏幕上看到对象。这就好像当我使用全局变量时,它们被设置为零
在从HLSL转换到GLSL时可能会出现问题吗?在编写HLSL代码时,我必须记住某些特殊性
如果您能帮我回答这些问题或为我指出正确的方向,我将不胜感激。谢谢。DirectX中的FX系统允许您使用值初始化统一变量AmbientColor
和AmbientIntensity
,但GLSL不允许您这样做。就这一点而言,HLSL也是如此——只有构建在HLSL之上的外汇系统才允许这样做
因此,这些制服将默认为零(或者可能是其他未初始化的值)
在使用GLSL着色器之前,需要在程序代码中设置统一常数。在OpenGL中,通常通过调用glUniform1f
和glUniform4f
来完成此操作,感谢您的及时响应。这就把事情弄清楚了一点。