3dmax fx shader, vertex color
美术那边需要一个能在3dmax里用的支持diffuse纹理和顶点色的additive shader(不带光照)。
以前没搞过这个,于是从3dmax自带的vertexcolor.fx,DiffuseBump.fx拼凑出了一个,如下:
//-----------------------------DiffuseMapVertexcolorAdditive.fx
// 3ds max effect file
// Simple vertex color - work with the Vertex Paint tool.  The max effect parser
// allows you to define any arbitary map channel to be passed in via a texcoord.
// In this case we are interested in Vertex Color, Illumination and Alpha which 
// are stored in 0,-1,-2 respectively.
// light direction (view space)
// transformations
float4x4 World      :         WORLD;
float4x4 View       :         VIEW;
float4x4 Projection :         PROJECTION;
float4x4 WorldViewProj :     WORLDVIEWPROJ;
float4x4 WorldView :         WORLDVIEW;
texture diffuseTexture : DiffuseMap< 
    string name = "seafloor.dds"; 
    string UIName = "Diffuse Texture";
    int Texcoord = 0;
    int MapChannel = 1;
    >;
int texcoord1 : Texcoord
<
    int Texcoord = 1;
    int MapChannel = 0;
>;
int texcoord2 : Texcoord
<
    int Texcoord = 2;
    int MapChannel = -2;
>;
struct AppData
{
    float3 Pos  : POSITION; 
    float2 TexCoord : TEXCOORD0;
    float3 col    : TEXCOORD1;
    float3 alpha :TEXCOORD2;
  
};
struct v2f
{
    float4 Pos  : POSITION;
    float4 color : COLOR;
    float2 TexCoord0 : TEXCOORD0;
};
struct f2fb {
    float4 col : COLOR;
};
v2f VS(
    AppData IN
  
)
{
    v2f Out = (v2f)0;
   
    Out.Pos  = mul(float4(IN.Pos,1),WorldViewProj);    // position (projected)
    
    float4 diff;
    diff = float4(IN.col,1);
Out.color = diff;
        
    Out.color.a = IN.alpha.x;
Out.TexCoord0.xy = IN.TexCoord.xy;
return Out;
    
}
f2fb PS(v2f IN,
        uniform sampler2D DiffuseMap) 
{
    f2fb OUT;
//fetch base color
    float4 color = tex2D(DiffuseMap,IN.TexCoord0 );
//fetch vertex color
    float4 vertexColor=IN.color;
OUT.col = color *vertexColor;
return OUT;
}
sampler2D diffuseSampler = sampler_state
{
    Texture = <diffuseTexture>;
    MinFilter = Linear;
    MagFilter = Linear;
    MipFilter = Linear;
    ADDRESSU = WRAP;
    ADDRESSV = WRAP;
};
technique tech
{
    pass P0
    {
        ZEnable = true;
    ZWriteEnable = false;
        AlphaBlendEnable = TRUE;
        SrcBlend         = SRCALPHA;
        DestBlend        = ONE;//InvSrcAlpha;  
        CullMode = None;
        ShadeMode = Gouraud;  
        // shaders
        
        VertexShader = compile vs_2_0 VS();
    PixelShader = compile ps_2_0 PS(diffuseSampler);
    }  
}
technique tech_cullModeCW
{
    pass P0
    {
        ZEnable = true;
    ZWriteEnable = false;
        AlphaBlendEnable = TRUE;
        SrcBlend         = SRCALPHA;
        DestBlend        = ONE;//InvSrcAlpha;  
        CullMode = CW;
        ShadeMode = Gouraud;  
        // shaders
        
        VertexShader = compile vs_2_0 VS();
    PixelShader = compile ps_2_0 PS(diffuseSampler);
    }  
}

----
补充:
1,内置的dx shader vertexcolor.fx在3dmax2012中会报错,在3dmax2010中vertexcolor.fx中是可用的。
2,仿照vertexcolor.fx,顶点色col用mapchannel 0,顶点透明度alpha用mapchannel -2。那个diffuse纹理,用一个跟它们不冲突的通道即可,我这里用的是mapchannel 1。
补充2:
3dmax里似乎没有办法控制渲染顺序,所以在复杂场景中,使用了blend的物体,显示结果并不一定符合预期。
3dmax fx shader, vertex color的更多相关文章
- Vertex color blending & UV tiling
		
[Vertex color blending & UV tiling] 1.GemotryData控件用于代码顶点数据,如网格中的Vertex Color(下左图),UV Coord(下右图) ...
 - Shader编程教程
		
2010-05-13 11:37:14| 分类: DirectX 3D学习|举报|字号 订阅 Shader编程教程1-环境光照 您好,欢迎来到XNA Shader教程1.我的名字叫Petri ...
 - DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER
		
原文:DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...
 - Unity3d 着色器语法(Shader)
		
Shader "name" { [Properties] Subshaders [Fallback] } 定义了一个着色器.着色器拥有一个 Properties 的列表.着色器包含 ...
 - Unity3D shader简介
		
Unity3D shader简介 可以肯定的说Unity3D使得很多开发者开发游戏更容易.毫无疑问,shader(着色器)编码,仍有很长的路要走.shader是一个专门运行在GPU的程序,经常被神秘包 ...
 - Shader 之 顶点变形
		
可以使3D物体通过顶点变形弯曲,常见于跑酷游戏的跑道.可向左.右.上.下弯曲. Shader "Custom/VertexColorCurved" { Properties { / ...
 - Surface Shader
		
Surface Shader: (1)必须放在SubShdader块,不能放在Pass内部: (2)#pragma sufrace surfaceFunction lightModel [option ...
 - UnityShader之固定管线命令Combine纹理混合【Shader资料4】
		
Combine,纹理混合. 我们先看圣典上给的解释. 纹理在基本的顶点光照被计算后被应用.在着色器中通过SetTexture 命令来完成. SetTexture 命令在片面程序被使用时不会生效:这种模 ...
 - Unity3d Shader开发(三)Pass(Pass Tags,Name,BindChannels )
		
Pass Tags 通过使用tags来告诉渲染引擎在什么时候该如何渲染他们所期望的效果. Syntax 语法 Tags { "TagName1" = "Value1&qu ...
 
随机推荐
- 为什么Scrum不行?
			
这篇文章的原文在这里(原文链接)(下文不是全译,也不是部分译,我只是把其总结,有我自己的发挥,但是原意大致不变),这篇文章完全是在调侃Scrum的,作者第一段就是一个免费声明,其说他是Scrum和其它 ...
 - 【资料】wod强壮护符
			
泛用耗材 损坏的 卡罗先活力护符 小型的 强壮护符 改良的 鲁比斯护符 否定护符 活跃护符 自然防御护符 防御疾病护符 特定职业使用耗材护符 野蛮人 诗人 祭司 泛用 仪式用巴博许教的 ...
 - osgi实战学习之路:2. maven+maven-bundle-plugin+karaf搭建osgi之HelloWorld
			
环境准备: jdk版本号 jdk:1.7 karaf: 版本号:apache-karaf-3.0.1 下载地址: http://pan.baidu.com/s/1qWM4Y1u http://kara ...
 - C#调用API向外部程序发送数据
			
C#调用API向外部程序发送数据 最近有可能要做一个项目.在项目中有这么一个功能,在A程序中调用B程序,同时在A程序中进行登陆后,要将A程序的登录名和密码自动填充到B程序的登陆对话框中,这样B程序就不 ...
 - Python学习(四)数据结构 —— list  tuple  range
			
序列类型 list tuple range list 和 tuple list: 列表,由 [] 标识: 有序:可改变列表元素 tuple: 元组,由 () 标识: 有序:不可改变元组元素(和 ...
 - ansible安装文档
			
一.系统环境 [root@ansible ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@ansible ~]# uname ...
 - .net维护的一些心得
			
做了三个月的.net的开发,其实一直在做一个维护加二次开发的工作.现在这个项目告一段落,就此总结下我的所学所感吧.总的来说,.net和JAVA还是有许多地方是不同的,比如.net中的数据绑定问题,已经 ...
 - jquery ajax方式直接提交整个表单
			
$.ajax({ type: "POST", url: url, data: $('#form1').serialize(), success: function(msg){ al ...
 - 【实践】简洁大方的summernote 富文本编辑器插件的用发——小技巧
			
前面说到summernote 的上传,可是我要知道怎么获取内容呀,很简单调用一下函数便可: 获取内容: $("#user-work-content").summernote(&qu ...
 - reportservice报表单元格依据条件显示不同的颜色
			
有时候.我们须要依据条件,让单元格显示不同的颜色: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveV9mMTIz/font/5a6L5L2T/fontsi ...