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);
    }  
}

时间: 2024-10-08 16:47:13

3dmax fx shader, vertex color的相关文章

Vertex color blending &amp; UV tiling

[Vertex color blending & UV tiling] 1.GemotryData控件用于代码顶点数据,如网格中的Vertex Color(下左图),UV Coord(下右图). 2.右击每一个控制,会弹出帮助选项,以及输入Comment的选项. 3.Shader Forge中常用R颜色值作为Mask.如下图,左图为RGB预览,右图为只取R值时的预览. 4.value有2种,一种是常量,一种是属性变量. 5.Lerp是一个插值控件. 6.Normalize控件用于规范化向量. 参

Unity3D shader简介

Unity3D shader简介 可以肯定的说Unity3D使得很多开发者开发游戏更容易.毫无疑问,shader(着色器)编码,仍有很长的路要走.shader是一个专门运行在GPU的程序,经常被神秘包围,它最终绘制3D模型的三角形.如果你想给游戏一个特殊的显示,学习如何编写shader是必要的.Unity3D使用shader做后期处理,对2D游戏也是必不可少的.这个系列的文章将逐步介绍shader编程,并面向几乎没有任何shader知识的开发者. 简介 下图大致表示了在Unity3D渲染流程中发

Vertex and FragmentShader顶点与片段着色器

一.顶点与片段着色器简介 Vertex and FragmentShader:最强大的Shader类型,也是本系列的重点,下文中简称V&FShader,属于可编程渲染管线.使用的是CG/HLSL语法.分为2个部分vertex顶点部分和Fragment像素部分.下面依然通过写几个简单的Shader来学习. 二. CG语言一些关键词和常用函数解释 1.Cg顶点程序必须在结构中传递顶点数据.几种常用的顶点结构定义在文件UnityCG.cginc中.在大部分情况下仅仅使用它们就够了.结构如下: 1.ap

Unity3D Shader性能排行

整体上,性能由高到低: Unlit,仅为纹理,光线不产生效果 VertexLit Diffuse 漫反射 Normal Mapped 法线贴图 Specular 高光 Normal Mapped Specular Parallax Normal Mapped Parallax Normal Mapped Specular 另外,unity3d还内置有一些简化的用作移动平台的shader/着色器. 推荐文章内置shader详解(带图) Shader性能影响因素: 着色器性能影响因素较多,最主要有二

Cg入门16:Fragment shader - 片段级光照

将顶点程序实现漫反射放至片段程序后处理效果如下: 看到和左边内建实现的漫反射一样了 片段程序特点: 1.采用三角面的形式渲染,而顶点程序是按顶点形式渲染 注意事项:直接将计算好的顶点法线向量和光向量 直接传给片段程序使用 效果如下:为啥不一样呢? 顶点程序: 1.按顶点计算,一个顶点一个顶点处理程序 片段程序: 1.先进行光栅化,把面片分割成三角形, 2.一个片段程序,可以看成一个一个像素处理 原因: 1.由于面片程序,分割成很多个小三角形处理,但是一下三角形上的法线和光向量相同,就导致了这种现

Shader 之 顶点变形

可以使3D物体通过顶点变形弯曲,常见于跑酷游戏的跑道.可向左.右.上.下弯曲. Shader "Custom/VertexColorCurved" { Properties { // Shader需要的6个参数 _MainTex ("Base (RGB)", 2D) = "white" {} _QOffset ("Offset", Vector) = (0,0,0,0) _Dist ("Distance",

shader 4 杂 一些和函数名词、数据结构

Normal:  法线 Normao mapping: 法线贴图 Lighting mapping: 光照贴图 Bump mapping:     凹凸贴图:模拟粗糙外表面的技术. FX-Water simple.shader中即用到了.模拟波浪效果. Rim lighting: 边缘光照: 在对象的边缘部分添加?亮度. Base Texture, 基础纹理. Detail Texture,细节纹理.与base texture使用同样的uv,可是在material中的Tiling值不同. Cub

UnityShader之固定管线命令Combine纹理混合【Shader资料4】

Combine,纹理混合. 我们先看圣典上给的解释. 纹理在基本的顶点光照被计算后被应用.在着色器中通过SetTexture 命令来完成. SetTexture 命令在片面程序被使用时不会生效:这种模式下像素操作被完全描述在着色器中. 材质贴图可以用来做老风格的混合器效果.你能在一个通道中使用多个SetTexture 命令 - 所有纹理被顺序的应用,如同绘画程序中的层一样.SetTexture 命令必须放置在通道的末尾 Texture block combine command 纹理块合并命令

Vulkan Tutorial 19 Vertex input description

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 在接下来几个章节中,我们将会使用内存顶点缓冲区来替换之前硬编码到vertex shader中的顶点数据.我们将从最简单的方法开始创建一个CPU可见的缓冲区,并使用memcpy直接将顶点数据直接复制到缓冲区,之后将会使用分段缓冲区将顶点数据赋值到高性能的内存. Vertex shader 首先要修改的是顶点着色器,不再包含顶点数据.顶点着色器接受顶点缓冲区的