模仿unlit/Texture着色器并在3dmax中渲染

2023-10-01 13:12
实现unity的纹理着色器并在3dmax中渲染 3dsmax 版本:2019 首先感谢这位大哥同步Unity和3DMax特效——3DMaxDX Shader:https://www.imusiccn.com/p/100253142 在3dsmax中,首先更改材质类型,选择DirectX Shader,然后选择HLSL文件。我的文件是 3ds max 中 StandardFX11.fx 的副本。选择baseColor的图像 Unity的Unlit/Texture着色器不受光照影响,所以我的目标是直接输出baseColor颜色,仅此而已。 在.fx中声明颜色图和相应的SamplerState。这部分是根据知乎上的大哥写的。 Texture2D g_BaseColorTexture < string UIName = “BaseColor”; string ResourceType = “2D”; int Texcoord = 0; int MapChannel = 1;>; SamplerState g_BaseColorSampler { MinFilter = 线性; MagFilter = 线性; MipFilter = 线性;地址U = 换行;地址V = 换行; }; 然后在std_PS中,只需返回采样后的baseColor的颜色即可,不需要计算光照之类的。 float3 baseColor = g_BaseColorTexture.Sample(g_BaseColorSampler, IN.UV0.xy).rgb;返回 float4(baseColor,1); 左边是新材质,右边是3ds max默认材质。 渲染后的结果现在看起来像这样。 。 。 渲染时要注意。选择该渲染器。终于出来了。 完整的效果字符串ParamID =“0x003”;浮动脚本:STANDARDSGLOBAL <字符串UIWidget =“无”;字符串ScriptClass =“对象”;字符串ScriptOrder =“标准”;字符串ScriptOutput =“颜色”;字符串脚本=“技术=主;”; > = 0.8;float4x4 WorldITXf : WorldInverseTranspose < string UIWidget="None"; >; float4x4 WvpXf:世界视图投影< string UIWidget="None"; >; float4x4 WvXf:世界视图< string UIWidget="None"; >; float4x4 WvITXf:WorldViewInverseTranspose < string UIWidget="None"; >; float4x4 WorldXf:世界< string UIWidget="None"; >; float4x4 ViewXf :视图< string UIWidget="None"; >; float4x4 ViewIXf :ViewInverse < string UIWidget="None"; >; float4x4 ViewITXf:ViewInverseTranspose < string UIWidget="None"; >; float4x4 ProjectionXf :投影 < string UIWidget="None"; >;#ifdef _MAX_ int texcoord1 : texcoord ; #万一 float3 Lamp0Pos : POSITION = {-0.5f,2.0f,1.25f}; #ifdef_MAX_ float3 Lamp0Color : LIGHTCOLOR = float3(1.0f, 1.0f, 1.0f); #别的float3 Lamp0Color : 镜面 = {1.0f,1.0f,1.0f}; #endiffloat4 k_a = float4( 0.0f, 0.0f, 0.0f, 1.0f ); float4 k_d = float4( 0.47f, 0.47f, 0.47f, 1.0f ); float4 k_s = float4( 1.0f, 1.0f, 1.0f, 1.0f ); int n = 15;bool g_AlphaVertex = false;bool g_AddVertexColor =false;bool g_UseParallax =false;float g_ParallaxScale = 0.02f;浮点g_ParallaxBias <字符串UIName =“视差偏差”;字符串UIWidget =“滑块”;浮点UIMin = -0.5f;浮点UIMax = 0.5f;浮点UIStep = 0.01f; > = 0.0f;bool g_AmbientOccEnable = 假; Texture2D g_BaseColorTexture < string UIName = "BaseColor";string ResourceType = "2D";int Texcoord = 0;int MapChannel = 1; >;SamplerState g_BaseColorSampler {MinFilter = 线性;MagFilter = 线性;MipFilter = 线性;AddressU = 换行;AddressV = 换行; };Texture2D g_AmbientOccTexture < string UIName = "Ambient Occlusion";string ResourceType = "2D"; >;Texture2D g_TopTexture : DiffuseMap< string UIName = "顶部漫反射";string ResourceType = "2D";int Texcoord = 0;int MapChannel = 1; >;Texture2D g_BottomTexture < string UIName = "底部漫反射";string ResourceType = "2D";int Texcoord = 4;int MapChannel = 1; >;bool g_SpecularEnable = false;Texture2D g_SpecularTexture < string UIName = "镜面反射级别";string ResourceType = "2D"; >;bool g_NormalEnable = false;bool g_FlipGreen = 假; bool orthogonalizeTangentBitangentPerPixel = false;Texture2D g_NormalTexture < string UIName = "Normal";string ResourceType = "2D"; >;float g_BumpScale = 1.0f;bool g_ReflectionEnable = false;TextureCube g_ReflectionTexture < string UIName = "Reflection";string ResourceType = "CUBE"; >; float g_ReflectAmount = 1.0f;SamplerState g_AmbientOccSampler{MinFilter = 线性;MagFilter = 线性;MipFilter = 线性;AddressU = 换行;AddressV = 换行; };SamplerState g_TopSampler {MinFilter = 线性;MagFilter = 线性;MipFilter = 线性;AddressU = 换行;AddressV = 换行;};SamplerState g_BottomSampler {MinFilter = 线性;MagFilter = 线性;MipFilter = 线性;AddressU = 环绕;AddressV = 环绕;};SamplerState g_SpecularSampler {MinFilter = 线性;MagFilter = 线性;MipFilter = 线性;AddressU = 换行;AddressV = 换行;};SamplerState g_NormalSampler {MinFilter = 线性;MagFilter = 线性;MipFilter = 线性;AddressU = 换行;AddressV = 换行;};SamplerState g_ReflectionSampler {MinFilter = 线性;MagFilter = 线性;MipFilter = 线性;AddressU = 钳位;AddressV = 钳位;地址W = 钳位; };struct appdata {float4 位置:POSITION;float3 切线:TANGENT;float3 副法线:BINORMAL;float2 UV0:TEXCOORD0; float3 颜色 : TEXCOORD1;float3 Alpha : TEXCOORD2;float3 照明 : TEXCOORD3;float3 UV1 : TEXCOORD4;float3 UV2 : TEXCOORD5;float3 UV3 : TEXCOORD6;float3 UV4 : TEXCOORD7; }; struct vertexOutput {float4 HPosition : SV_Position;float4 UV0 : TEXCOORD0;float3 LightVec : TEXCOORD1;float3 WorldNormal : TEXCOORD2;float3 WorldTangent : TEXCOORD3;float3 WorldBinormal : TEXCOORD4;float3 WorldView : TEXCOORD5;float 4 UV1 : TEXCOORD6;float4 UV2 : TEXCOORD7;float4 wPos :TEXCOORD8; };vertexOutput std_VS(appdata IN) {vertexOutput OUT = (vertexOutput)0;float4 Po = float4(www.imusiccn.com,1);float3 Pw = mul(Po,WorldXf).xyz;OUT.LightVec = (Lamp0Pos - Pw);OUT.WorldView = 标准化(ViewIXf[3].xyz - Pw);OUT.HPosition = mul(Po,WvpXf);OUT.wPos = mul(IN.Position, WorldXf);float4 颜色;colour.rgb = IN.Colour * IN.Illum;colour.a = IN.Alpha.x;OUT.UV0.z = color.r;OUT.UV0.a = color.g;OUT.UV1.z = 颜色.b;OUT.UV1.a = 颜色.a;OUT.UV0.xy = IN.UV0.xy;OUT.UV1.xy = IN.UV1.xy;www.imusiccn.com = www.imusiccn.com ; 返回输出; }void phong_shading(vertexOutput IN,float3 LightColor,float3 Nn,float3 Ln,float3 Vn,out float3 DiffuseContrib,out float3 SpecularContrib) {float3 specLevel = float3(1.0,1.0,1.0);if(g_SpecularEnable)specLevel = g_SpecularTexture.Sample(g_SpecularSampler, IN.UV0.xy).xyz;float3 Hn = 标准化(Vn + Ln);float4 litV = lit(dot (Ln,Nn),dot(Hn,Nn),n);DiffuseContrib = litV.y * LightColor;SpecularContrib = litV.y * litV.z * k_s * LightColor * specLevel;}float4 std_PS(vertexOutput IN) : SV_Target {float3 diffContrib;float3 specContrib;float3 Ln = 标准化(IN.LightVec);float3 Vn = 标准化(IN.WorldView);float3 Nn = 标准化(IN.WorldNormal);float3 Tn = 标准化(IN.WorldTangent);float3 Bn = 标准化(IN.WorldBinormal);float4 vertColour = float4(0,0,0,0); float3 BottomCol = k_d.rgb; if(g_NormalEnable){float3凹凸 = 2.0f * (g_NormalTexture.Sample(g_NormalSampler,IN.UV0).rgb - 0.5f);bump.g = -bump.g;if (g_FlipGreen){bump.g = -bump. g;}if (orthogonalizeTangentBitangentPerPixel){float3 bitangent = 标准化(cross(Nn, Tn));Tn = 标准化(cross(bitangent, Nn));Bn = 符号(点(bitangent, Bn)) * bitangent;}Nn = g_BumpScale * (凹凸.x * Tn +凹凸.y * Bn) +凹凸.z * Nn;}Nn = 标准化(Nn);if(g_UseParallax && g_NormalEnable){浮动高度 = g_NormalTexture.Sample(g_NormalSampler, IN.UV0) .a;浮动高度 = 高度 + g_ParallaxBias; float3 normalUV = 高度 * g_ParallaxScale*Vn;normalUV += IN.UV0; www.imusiccn.com =NormalUV;} phong_shading(IN,Lamp0Color,Nn,Ln,Vn,diffContrib,specContrib);float4 diffeColor = k_d;float3ambientColor = k_a;float alpha = diffeColor.a;if(g_AlphaVertex)alpha = vertColour.a;diffuseColor.rgb = diffuseColor.rgb * alpha;diffuseColor.rgb += BottomCol * (1.0f - alpha);if(g_AddVertexColor)diffuseColor.rgb *= vertColour.rgb; #ifndef _MAX_ float3 结果 = specContrib+(diffuseColor*(diffContrib.rgb+ambientColor )); #else float3结果=specContrib+(diffContrib*diffuseColor)+ambientColor; #endif if(g_ReflectionEnable){#ifdef _MAX_ float3 R = 反射(Vn,Nn);R.z = -R.z;float3 reflColor = g_ReflectAmount * g_ReflectionTexture.Sample(g_ReflectionSampler,R.xzy).rgb;#elsefloat3 R = 反射(Vn ,Nn);float3 reflColor = g_ReflectAmount * g_ReflectionTexture.Sample(g_ReflectionSampler,www.imusiccn.com).rgb;#endifresult *= diffusColor+reflColor;}float3 baseColor = g_BaseColorTexture.Sample(g_BaseColorSampler, IN.UV0.xy).rgb;return float4(基色,1);}FX集团 DX11 { technology11 Main_11 <字符串脚本 = "Pass=p0;"; > {pass p0 {SetVertexShader(CompileShader(vs_5_0,std_VS()));SetGeometryShader( NULL );SetPixelShader(CompileShader(ps_5_0,std_PS()));} } } FX集团 DX10 { technology10 Main_10 <字符串脚本 = "Pass=p0;"; > {pass p0 {SetVertexShader(CompileShader(vs_4_0,std_VS()));SetGeometryShader( NULL );SetPixelShader(CompileShader(ps_4_0,std_PS()));} } }