首页 > 其他分享 >【MME编写入门】光照模型

【MME编写入门】光照模型

时间:2023-11-01 12:55:56浏览次数:118  
标签:string Normal Color Object float4 MME float3 光照 入门

float4x4 WorldViewMatrix        : WORLDVIEW;
float4x4 WorldViewProjMatrix    : WORLDVIEWPROJECTION;
float4x4 WorldMatrix            : WORLD;
//需要用到的矩阵
//需要用到光的位置、相机位置
float3   LightDirection    : DIRECTION < string Object = "Light"; >;
float3   CameraPosition    : POSITION  < string Object = "Camera"; >;

//需要用到物体的材质色
//漫反射、环境色、自发光色、镜面反射色
float4   MaterialDiffuse   : DIFFUSE  < string Object = "Geometry"; >;
float3   MaterialAmbient   : AMBIENT  < string Object = "Geometry"; >;
float3   MaterialEmmisive    : EMISSIVE    < string Object = "Geometry"; >;
float3   MaterialSpecular    : SPECULAR    < string Object = "Geometry"; >;
//镜面反射强度、toon色
float    SpecularPower        : SPECULARPOWER < string Object = "Geometry"; >;
float3   MaterialToon      : TOONCOLOR;
//需要的光源颜色,取三份,方便下面计算
float3   LightDiffuse      : DIFFUSE   < string Object = "Light"; >;
float3   LightAmbient      : AMBIENT   < string Object = "Light"; >;
float3   LightSpecular     : SPECULAR  < string Object = "Light"; >;
//计算漫反射颜色、环境色颜色、镜面反射颜色
static float4 DiffuseColor  = MaterialDiffuse  * float4(LightDiffuse, 1.0f);
static float3 AmbientColor  = saturate(MaterialAmbient  * LightAmbient + MaterialEmmisive);
static float3 SpecularColor = MaterialSpecular * LightSpecular;
//先定义,后面调用
bool UseTexture;
bool UseToon ;
//材质纹理和采样器
texture ObjectTexture: MATERIALTEXTURE;
sampler ObjTexSampler = sampler_state {
    texture = <ObjectTexture>;
    MINFILTER = LINEAR;
    MAGFILTER = LINEAR;
    ADDRESSU  = WRAP;
    ADDRESSV  = WRAP;
};
//结构体,准备需要的数据
struct VS_OUTPUT
{
    float4 Pos        : POSITION;
    float2 Tex        : TEXCOORD1;
    float3 Normal      : TEXCOORD2;
    float3 Eye        : TEXCOORD3;
};
//顶点着色器部分
VS_OUTPUT Basic_VS( float4 Pos : POSITION, float3 Normal : NORMAL, float2 Tex : TEXCOORD0)
{
//这里把pos另存了一份
    float4 Pos0 = Pos;
//位置变换
    Pos = mul( Pos, WorldViewProjMatrix );
//视线位置变换
    float3 Eye = CameraPosition - mul( Pos0, WorldMatrix );
//顶点法线
    Normal = normalize( mul( Normal, WorldMatrix ) );
//输出
    VS_OUTPUT Out = { Pos, Tex, Normal, Eye };
    return Out;
}

//像素着色器部分
float4 Basic_PS( float2 Tex : TEXCOORD1, float3 Normal : TEXCOORD2, float3 Eye : TEXCOORD3 ) : COLOR0
{
    float4 Color = 0;
//漫反射和环境色计算
    Color.rgb = saturate( max(0,dot( Normal, -LightDirection )) * DiffuseColor.rgb + AmbientColor );
    Color.a = DiffuseColor.a;
//镜面反射计算
    float3 HalfVector = normalize( normalize(Eye) + -LightDirection );
    float3 Specular = pow( max(0,dot( normalize(Normal),HalfVector )), SpecularPower ) * SpecularColor;
 //纹理应用
    Color *= tex2D( ObjTexSampler, Tex );
 //TOON应用
    if (UseTexture = true) {
        float LightNormal = dot(Normal,-LightDirection);
        Color.rgb *= lerp(MaterialToon, float3(1,1,1), saturate(LightNormal * 16 + 0.5));
    }
//镜面反射色加入
    Color.rgb += Specular;
//最终输出
    return Color;
}

//绘制
technique BasicLight < string MMDPass = "object_ss"; > {
    pass DrawObject
    {
        VertexShader = compile vs_2_0 Basic_VS();
        PixelShader  = compile ps_2_0 Basic_PS();
    }
} 

 

语义参考MME手册……实在是懒得搬了……

这个模型是用的bling-phong的那一套半程向量计算的,具体的在原文里有捋顺过一遍思路

原文地址https://www.bilibili.com/read/cv22301522

mme中文参考手册https://zhuanlan.zhihu.com/p/147320030

 

标签:string,Normal,Color,Object,float4,MME,float3,光照,入门
From: https://www.cnblogs.com/linser521/p/17802838.html

相关文章

  • 【MME编写入门】后处理模板
    1float4ClearColor={1,1,1,0};2floatClearDepth=1.0;34floatScript:STANDARDSGLOBAL<5stringScriptOutput="color";6stringScriptClass="scene";7stringScriptOrder="postprocess";8......
  • [转]Elasticsearch全文检索入门这一篇就够了
    本文仅针对搜索与Elasticsearch小白,先介绍了全文搜索的原理,然后介绍了Elasticsearch中的一些基本概念,接着讲解如何在Elasticsearch中插入文档构建查询索引,最后介绍Elasticsearch的线上查询API的使用方式。全文搜索原理顺序扫描如何实现全文搜索?最简单的方法就是用正则去匹配文......
  • 怎么发送邮件?电子邮件发送入门指南之简单有效的邮件传送
    电子邮件,作为现代沟通的主要方式之一,对于个人和商业用途都至关重要。无论是与朋友分享生活点滴还是与客户进行业务沟通,了解如何发送邮件都是至关重要的。在本文中,我们将提供一个简单而有效的邮件发送指南,解释怎么发送邮件,并分享一些实用技巧。1.选择合适的电子邮件客户端怎么发送......
  • vuejs3.0 从入门到精通——初始化项目——路由
    路由 VueRouter是Vue.js官方的路由管理器,它和Vue.js深度集成,用于构建单页面应用。Vue.js单页面应用是基于路由和组件映射的,路由用于配置访问路径,将组件(components)映射到路由路径(routes)。一、路由模式 VueRouter常用的两种模式是hash模式和HTML5模式,对应的创建......
  • [17章+电子书]C#速成指南-从入门到进阶,实战WPF与Unity3D开发
    点击下载:[17章+电子书]C#速成指南-从入门到进阶,实战WPF与Unity3D开发  提取码:a3s5 《C#速成指南--从入门到进阶,实战WPF与Unity3D开发》完整讲解了C#语言的核心知识和高阶编程技巧,并结合WPF客户管理系统和Unity3D切水果游戏两大实战项目,帮你实现技术的精通,完成从Zero到Hero的蜕变......
  • [macos]hammerspoon设置
    在init的lua脚本中,下面的代码是为了在进入Terminal、ShortCat和Spolight的时候,默认切换到英文输入法 localfunctionChinese()hs.console.printStyledtext("chinese")hs.keycodes.currentSourceID("com.apple.inputmethod.SCIM.ITABC")endlocalfunctionEnglish()hs.console.pr......
  • k8s-服务网格实战-入门Istio
    背景终于进入大家都比较感兴趣的服务网格系列了,在前面已经讲解了:如何部署应用到kubernetes服务之间如何调用如何通过域名访问我们的服务如何使用kubernetes自带的配置ConfigMap基本上已经够我们开发一般规模的web应用了;但在企业中往往有着复杂的应用调用关系,应用与......
  • Isito 入门(九):安全认证
    本教程已加入Istio系列:https://istio.whuanle.cn目录7,认证PeerAuthenticationPeerAuthentication的定义实验RequestAuthencationRequestAuthencation的定义AuthorizationPolicy的定义实验提供jwksjson创建RequestAuthentication7,认证本章的内容主要是讲解服务间通讯的......
  • Unreal入门,通过蓝图自定义Pawn移动
    1.自定义Pawn新建Pawn添加相机和网格体网格体设置(新建项目自带资源里随便挑一个)相机设置(主要是旋转和位移,随便设置下,大概能达到俯视效果就行,其它效果也可以,只要能看到自己的Pawn,不然不知道怎么动的)2.应用自定义Pawn(默认GameMode不可编辑,不能直接替换Default......
  • spring ApplicationContext版本的快速入门
     代码示例:publicinterfaceUserDao{}-------------------------------------------------------------publicclassUserDaoImplimplementsUserDao{}----------------------------------------------------------publicinterfaceUserService{}---------------------......