我是着色器编程的真正初学者,我使用的是monogame框架。我试图按照本书中的例子进行操作
使用xna game studio 4.0打包3d图形
但在过去的4天里,我一直试图让预制渲染器工作(第3章,如果你们中的一些人知道这本书) https://www.packtpub.com/books/content/advanced-lighting-3d-graphics-xna-game-studio-40
VertexShader' this.depthNormalEffect._shaders [0] .VertexShader'扔 类型的例外 ' System.Runtime.InteropServices.SEHException' SharpDX.Direct3D11.VertexShader {System.Runtime.InteropServices.SEHException}
使用DX本机调试器转换为
D3D11错误:ID3D11Device :: CreateVertexShader:着色器必须是vs_4_0,vs_4_1或vs_5_0。提供的着色器版本:ps_4_0 [STATE_CREATION错误#167:CREATEVERTEXSHADER_INVALIDSHADERTYPE] D3D11: BREAK 为上一条消息启用,即:[ERROR STATE_CREATION#167:CREATEVERTEXSHADER_INVALIDSHADERTYPE] 3dTest.exe中0x75FAC41F(KernelBase.dll)的第一次机会异常:0x0000087A(参数:0x00000001,0x003DB5D0,0x003DC328)。 D3D11错误:ID3D11Device :: CreatePixelShader:着色器必须是ps_4_0,ps_4_1或ps_5_0。提供的着色器版本:vs_4_0 [STATE_CREATION错误#193:CREATEPIXELSHADER_INVALIDSHADERTYPE] D3D11: BREAK 为上一条消息启用,即:[ERROR STATE_CREATION#193:CREATEPIXELSHADER_INVALIDSHADERTYPE]
令人困惑的事情(对我来说)库似乎将错误的编译着色器函数链接到顶点或像素着色器
D3D11错误:ID3D11Device :: CreatePixelShader:着色器必须是ps_4_0, ps_4_1或ps_5_0。提供的着色器版本:vs_4_0 [STATE_CREATION ERROR#193:CREATEPIXELSHADER_INVALIDSHADERTYPE]
这里有一些着色器代码(效果跨越三个着色器,其中2个渲染用于渲染目标,因此第三个可用于最终传递)
float4x4 World;
float4x4 View;
float4x4 Projection;
struct VertexShaderInput
{
float4 Position : SV_POSITION;
float3 Normal : NORMAL0;
};
struct VertexShaderOutput
{
float4 Position : SV_POSITION;
float2 Depth : TEXCOORD0;
float3 Normal : TEXCOORD1;
};
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
float4x4 viewProjection = mul(View, Projection);
float4x4 worldViewProjection = mul(World, viewProjection);
output.Position = mul(input.Position, worldViewProjection);
output.Normal = mul(input.Normal, World);
//les composante z et w de Position correspondent a la distance % camera et % plan lointain
output.Depth.xy = output.Position.zw;
return output;
}
struct PixelShaderOutput
{
float4 Normal : COLOR0;
float4 Depth : COLOR1;
};
PixelShaderOutput PixelShaderFunction(VertexShaderOutput input)
{
PixelShaderOutput output;
output.Depth = input.Depth.x / input.Depth.y;
output.Normal.xyz = (normalize(input.Normal).xyz/ 2) + .5;
output.Depth.a = 1;
output.Normal.a = 1;
return output;
}
technique Technique0
{
pass Pass0
{
VertexShader = compile vs_4_0 VertexShaderFunction();
PixelShader = compile ps_4_0 PixelShaderFunction();
}
};
好吧,谷歌上的搜索让我在这个问题上干了,这让我觉得我在做一些绝对愚蠢的事情并没有意识到这一点(着色器n00b记得:D)。
任何想法??