我最近已切换到Visual 2015,并且.fx文件已弃用。我的项目包含用于着色器的.fx文件,因此我一直在切换。

仅在切换期间,我更改为使用延迟渲染进行照明。

唯一的着色器到目前为止,我已经完成了第二遍使用的Pixel Shader,该着色器执行Per Pixel x Per Light计算,求和并输出最终颜色。

编译(我实际上没有在运行时中使用着色器,我只是设置了所有东西,窗口仍然只是每帧都清除为一种颜色,没有实际渲染),我遇到了一个失败,提示... />
错误X4502:着色器模型ps_4_0_level_9_3不允许读取位置语义。

这是我在项目中仅有的导致此错误的着色器。

我省略了getGBufferAttributes和calculateLighting方法,因为我知道它们不是问题。

Texture2D NormalTexture                 : register(t0);
Texture2D DiffuseAlbedoTexture          : register(t1);
Texture2D SpecularAlbedoTexture         : register(t2);
Texture2D PositionTexture               : register(t3);

cbuffer LightParams
{
    float3 LightPos;
    float3 LightColor;
    float3 LightDirection;
    float2 SpotlightAngles;
    float4 LightRange;
};

cbuffer CameraParams
{
    float3 CameraPos;
};

float4 main(in float4 screenPos : SV_Position) : SV_Target0
{
    float3 normal;
    float3 position;
    float3 diffuseAlbedo;
    float3 specularAlbedo;
    float specularPower;

    getGBufferAttributes(screenPos.xy, normal, position, diffuseAlbedo, specularAlbedo, specularPower);

    float3 lighting = calculateLighting(normal, position, diffuseAlbedo, specularAlbedo, specularPower);

    return float4(lighting, 1.0f);
}


用于此着色器的代码高度基于Jason Zink,Matt Pettineo的《 Direct3D 11实用渲染》一书中用作延迟渲染示例的代码。和Jack Hoxley。

我不明白为什么他们会给出无效的源代码。它与Visual 2015和运行时中的新编译器有关系吗?

此外,由于我从仅使用效果到现在的原始HLSL着色器,我应该注意什么可能会让像我这样的人绊倒?

#1 楼

一个非常新手的错误,我正在使用旧的HLSL编译器进行编译。但是,为什么这是默认值呢?非常奇怪。

对于任何想知道的人,只需在解决方案资源管理器中右键单击HLSL文件,然后转到属性-> HLSL编译器->常规,然后将Shader Model切换到您想要的最新模型即可对我来说(5.0)