C++ 解释HLSL着色器编译器宏代码
个人资料:C++ 解释HLSL着色器编译器宏代码,c++,directx-11,hlsl,C++,Directx 11,Hlsl,个人资料: WiN7 Prof SP1 Directx11 开发IDE:VS 2015 程序语言:C# 应用类型:3D渲染 Directx11包装器:SLimDX 在我的C#项目中,我有一个3D渲染器正在工作 我想集成第三方HLSL着色器代码 我已经翻译了Directx11功能级别的代码,它使用fxc.exe编译,没有错误或警告 着色器由我的C#应用程序加载,我可以访问所有着色器变量并设置它们的值 问题: 当我试图在我的C#代码中获取一个引用来访问着色器的第一个技术的第一个过程时,我得到了一个S
WiN7 Prof SP1 Directx11 开发IDE:VS 2015 程序语言:C# 应用类型:3D渲染 Directx11包装器:SLimDX 在我的C#项目中,我有一个3D渲染器正在工作 我想集成第三方HLSL着色器代码 我已经翻译了Directx11功能级别的代码,它使用fxc.exe编译,没有错误或警告 着色器由我的C#应用程序加载,我可以访问所有着色器变量并设置它们的值 问题: 当我试图在我的C#代码中获取一个引用来访问着色器的第一个技术的第一个过程时,我得到了一个SlimDX运行时错误 我可以在没有运行时错误的情况下引用着色器的第一种技术,但获得的对象有一个标志is_valid=false,表明该技术未被正确引用 澄清:我不尝试进行抽签,但在准备抽签时,我必须获得相关通行证的证明 问题: 我无法理解最后一个编译器指令中关于这些技术的确切含义 有人能翻译编译器指令最终生成的HLSL代码吗 我的意思是从: #定义对象\u TEC(名称,mmdpass)\
#包括“./ray.conf”
#包括“./ray_advanced.conf”
#包括“./shader/math.fxsub”
#包括“./shader/common.fxsub”
#包括“./shader/gbuffer.fxsub”
#包括“./shader/lighting.fxsub”
float3 LightDirection:DIRECTION;
float3 LightSpecular:SPECULAR;
bool:控制对象;
纹理扩散图:材质纹理;
采样器扩散图SAMP=采样器_状态
{
纹理=;
MINFILTER=各向异性;
磁过滤=各向异性;
MIPFILTER=点;
最大各向异性=16;
地址u=包裹;
地址v=包裹;
};
float4 GetTextureColor(float4反照率,float2 uv)
{
如果(使用纹理)
{
float4 TexColor=tex2D(DiffuseMapSamp,uv);
TexColor.rgb=lerp(1,TexColor*TextureMulValue+TextureAddValue,TextureAddValue.a+TextureAddValue.a);
反照率*=TexColor;
}
返回SRGB2线性(反照率);
}
无效DrawObjectVS(
在浮动4位置:位置,
在float3 Normal中:Normal,
在float4 Texcoord:TEXCOORD0中,
out float4 oTexcoord:TEXCOORD0,
浮点数3不正常:TEXCOORD1,
out float3 oViewdir:TEXCOORD2,
输出浮动4位置:SV_位置)
{
正常=正常;
oTexcoord=Texcoord;
oViewdir=CameraPosition-Position.xyz;
位置=mul(位置,matWorldViewProject);
}
float4 DrawObjectPS(float4 texcoord:TEXCOORD0,float3 normal:TEXCOORD1,float3 viewdir:TEXCOORD2):SV_目标
{
#如果存在射线
#如果放弃α启用
浮动α=材料扩散a;
#如果放弃\u ALPHA\u映射\u启用
如果(使用纹理)alpha*=tex2D(DiffuseMapSamp,texcoord.xy);
#恩迪夫
剪辑(α-α阈值);
#恩迪夫
返回0;
#否则
如果(退出)
{
#如果放弃α启用
浮动α=材料扩散a;
#如果放弃\u ALPHA\u映射\u启用
如果(使用纹理)alpha*=tex2D(DiffuseMapSamp,texcoord.xy);
#恩迪夫
剪辑(α-α阈值);
#恩迪夫
返回0;
}
其他的
{
float4反照率=GetTextureColor(MaterialDiffuse,texcoord.xy);
float3 L=标准化(-LightDirection);
float3 V=标准化(viewdir);
float3 N=正常化(正常);
浮子材料粗糙度=平滑度或粗糙度(光泽至平滑度(材料功率));
浮动4照明=反照率;
lighting.rgb*=扩散BRDF(N、L、V、材料粗糙度);
照明度.rgb+=镜面反射比f_GGX(N,L,V,材料粗糙度,0.04,1.0);
lighting.rgb*=LightSpecular;
回流管2SRGB(照明);
}
#恩迪夫
}
#定义对象(名称,mmdpass)\
技术名称 { \
传递对象{\
AlphaTestEnable=FALSE;AlphaBlendEnable=FALSE\
VertexShader=编译vs_3_0 DrawObjectVS()\
PixelShader=编译ps_3_0 DrawObjectPS()\
} \
}
对象(MainTec0,“对象”)
对象技术(MainTecBS0,“对象技术”)
技术EdgeTec{}
技术阴影技术{}
技术ZplotTec{}
#include "../ray.conf"
#include "../ray_advanced.conf"
#include "../shader/math.fxsub"
#include "../shader/common.fxsub"
#include "../shader/gbuffer.fxsub"
#include "../shader/lighting.fxsub"
float3 LightDirection : DIRECTION < string Object = "Light"; >;
float3 LightSpecular : SPECULAR < string Object = "Light"; >;
bool ExistRay : CONTROLOBJECT<string name = "ray.x";>;
texture DiffuseMap: MATERIALTEXTURE;
sampler DiffuseMapSamp = sampler_state
{
texture = <DiffuseMap>;
MINFILTER = ANISOTROPIC;
MAGFILTER = ANISOTROPIC;
MIPFILTER = POINT;
MAXANISOTROPY = 16;
ADDRESSU = WRAP;
ADDRESSV = WRAP;
};
float4 GetTextureColor(float4 albedo, float2 uv)
{
if (use_texture)
{
float4 TexColor = tex2D(DiffuseMapSamp, uv);
TexColor.rgb = lerp(1, TexColor * TextureMulValue + TextureAddValue, TextureMulValue.a + TextureAddValue.a).rgb;
albedo *= TexColor;
}
return srgb2linear(albedo);
}
void DrawObjectVS(
in float4 Position : POSITION,
in float3 Normal : NORMAL,
in float4 Texcoord : TEXCOORD0,
out float4 oTexcoord : TEXCOORD0,
out float3 oNormal : TEXCOORD1,
out float3 oViewdir : TEXCOORD2,
out float4 oPosition : SV_Position)
{
oNormal = Normal;
oTexcoord = Texcoord;
oViewdir = CameraPosition - Position.xyz;
oPosition = mul(Position, matWorldViewProject);
}
float4 DrawObjectPS(float4 texcoord : TEXCOORD0, float3 normal : TEXCOORD1, float3 viewdir : TEXCOORD2) : SV_Target
{
#if EXIST_RAY
#if DISCARD_ALPHA_ENABLE
float alpha = MaterialDiffuse.a;
#if DISCARD_ALPHA_MAP_ENABLE
if (use_texture) alpha *= tex2D(DiffuseMapSamp, texcoord.xy).a;
#endif
clip(alpha - DiscardAlphaThreshold);
#endif
return 0;
#else
if (ExistRay)
{
#if DISCARD_ALPHA_ENABLE
float alpha = MaterialDiffuse.a;
#if DISCARD_ALPHA_MAP_ENABLE
if (use_texture) alpha *= tex2D(DiffuseMapSamp, texcoord.xy).a;
#endif
clip(alpha - DiscardAlphaThreshold);
#endif
return 0;
}
else
{
float4 albedo = GetTextureColor(MaterialDiffuse, texcoord.xy);
float3 L = normalize(-LightDirection);
float3 V = normalize(viewdir);
float3 N = normalize(normal);
float MaterialRoughness = SmoothnessToRoughness(ShininessToSmoothness(MaterialPower));
float4 lighting = albedo;
lighting.rgb *= DiffuseBRDF(N, L, V, MaterialRoughness);
lighting.rgb += SpecularBRDF_GGX(N, L, V, MaterialRoughness, 0.04, 1.0);
lighting.rgb *= LightSpecular;
return linear2srgb(lighting);
}
#endif
}
#define OBJECT_TEC(name, mmdpass) \
technique name < string MMDPass = mmdpass;\
> { \
pass DrawObject { \
AlphaTestEnable = FALSE; AlphaBlendEnable = FALSE; \
VertexShader = compile vs_3_0 DrawObjectVS(); \
PixelShader = compile ps_3_0 DrawObjectPS(); \
} \
}
OBJECT_TEC(MainTec0, "object")
OBJECT_TEC(MainTecBS0, "object_ss")
technique EdgeTec < string MMDPass = "edge"; > {}
technique ShadowTech < string MMDPass = "shadow"; > {}
technique ZplotTec < string MMDPass = "zplot"; > {}