Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xna MojoShader:HLSL到GLSL的转换_Xna_Glsl_Monogame_Hlsl - Fatal编程技术网

Xna MojoShader:HLSL到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

我最近开始使用Monogame开发一个应用程序,并进入了着色器和着色语言的世界。目标平台是GL。这意味着我必须在HLSL中编写着色器,随后由MojoShader将其转换为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
返回浮点4(1,1,1,1)*浮点(1)它给了我正确的结果,我可以在屏幕上看到对象。这就好像当我使用全局变量时,它们被设置为零

在从HLSL转换到GLSL时可能会出现问题吗?在编写HLSL代码时,我必须记住某些特殊性


如果您能帮我回答这些问题或为我指出正确的方向,我将不胜感激。谢谢。

DirectX中的FX系统允许您使用值初始化统一变量
AmbientColor
AmbientIntensity
,但GLSL不允许您这样做。就这一点而言,HLSL也是如此——只有构建在HLSL之上的外汇系统才允许这样做

因此,这些制服将默认为零(或者可能是其他未初始化的值)


在使用GLSL着色器之前,需要在程序代码中设置统一常数。在OpenGL中,通常通过调用
glUniform1f
glUniform4f

来完成此操作,感谢您的及时响应。这就把事情弄清楚了一点。