zoukankan      html  css  js  c++  java
  • 一步一步学RenderMonkey(4)--点光源光照模型 【转】

    转载请注明出处:http://blog.csdn.net/tianhai110

    点光源光照模型:

    公式:

    I = Icolor*attenuation;                        attenuation表示衰减值

    Attenuation = 1-d*d;                                       d为光源到该点的距离

    通常我们用一个r来做点光源的衰减范围

    及 attenuation = 1 - mul(Light/r, Light/r);

    对Phong光照的例子进行修改

    1. vecLightDir 改名为 vecLightPos 表示光源位置,而不是光的方向; 设置其值如下:

       

      2. 修改vertex shader;

    [c-sharp] view plain copy
    1. float4x4 matViewProjection;  
    2.   
    3. float4x4 matWorld;  
    4.   
    5. float4   vecLightPos;  
    6.   
    7. float4   vecEye;  
    8.   
    9.    
    10.   
    11. struct VS_INPUT   
    12.   
    13. {  
    14.   
    15.    float4 Position : POSITION0;  
    16.   
    17.    float3 Normal   : NORMAL0;  
    18.   
    19.    float2 Texcoord : TEXCOORD0;  
    20.   
    21. };  
    22.   
    23.    
    24.   
    25. struct VS_OUTPUT   
    26.   
    27. {  
    28.   
    29.    float4 Position : POSITION0;  
    30.   
    31.    float2 Texc     : TEXCOORD0;  
    32.   
    33.    float3 Light    : TEXCOORD1;  
    34.   
    35.    float3 Norm     : TEXCOORD2;  
    36.   
    37.    float3 View     : TEXCOORD3;   
    38.   
    39. };  
    40.   
    41.    
    42.   
    43. VS_OUTPUT vs_main( VS_INPUT Input )  
    44.   
    45. {  
    46.   
    47.    VS_OUTPUT Output;  
    48.   
    49.    
    50.   
    51.    Output.Position = mul( Input.Position, matViewProjection );  
    52.   
    53.      
    54.   
    55.    float3 posWorld = normalize(mul(Input.Position, matWorld));  
    56.   
    57.    Output.Light = vecLightPos - posWorld;  
    58.   
    59.    Output.View = vecEye - posWorld;  
    60.   
    61.    Output.Norm = mul(Input.Normal, matWorld);  
    62.   
    63.    Output.Texc = Input.Texcoord;  
    64.   
    65.    return( Output );  
    66.   
    67.      
    68.   
    69. }  

    主要就是 把outPut.Light 由原来直接传个方向,变成每次都要计算该点到光源的向量;

      3. 修改 pixel shader;

    [c-sharp] view plain copy
    1. sampler2D baseMap;  
    2.   
    3. float4 ps_main( float2 Texc:TEXCOORD0, float3 Light:TEXCOORD1,  
    4.   
    5.           float3 Norm:TEXCOORD2, float3 View:TEXCOORD3) : COLOR0  
    6.   
    7. {     
    8.   
    9.    float4 ambient = { 0.3686f, 0.3686f, 0.3686f, 1.0f};  
    10.   
    11.    float4 diffuse = { 0.88f, 0.88f, 0.88f, 1.0f};  
    12.   
    13.      
    14.   
    15.    float3 Normal = normalize( Norm);  
    16.   
    17.    float3 LightDir = normalize( Light);  
    18.   
    19.    float3 ViewDir = normalize( View);  
    20.   
    21.    float4 diff = saturate( dot( Normal, LightDir));  
    22.   
    23.      
    24.   
    25.    float3 Reflect = normalize( 2 * diff * Normal - LightDir);  
    26.   
    27.    float4 shadow = saturate(4*diff);  
    28.   
    29.      
    30.   
    31.    float4 fvBaseColor      = tex2D( baseMap, Texc );  
    32.   
    33.    float4 specular = pow(saturate(dot(Reflect, ViewDir)), 25);  
    34.   
    35.    float4 color = fvBaseColor * (shadow * diff + ambient) + shadow * specular;  
    36.   
    37.    
    38.   
    39.    float4 attenuation = mul(Light/64.0, Light/64.0);     
    40.   
    41.      
    42.   
    43.    return color*(1-attenuation);  
    44.   
    45. }  

    主要是 加入衰减值 float4 attenuation = mul(Light/64.0, Light/64.0);

      4. 运行效果如下:

       

  • 相关阅读:
    理解区块链之前,先上手体验一把数字货币(2018-04-06 陈浩 第6讲)
    约瑟夫·卢宾《以太坊:从底层揭秘区块链应用和机会》2018-04-21
    以太坊智能合约介绍,Solidity介绍
    新浪微博 [异常问题] 414 Request-URL Too Large
    Google自动广告,将广告代码放置在 HTML 中的什么位置?
    囤币一族,被中国市场遗忘的价值币ADA
    基于EOS开发的Dapp大全
    朴素贝叶斯算法,贝叶斯分类算法,贝叶斯定理原理
    区块链3.0 ada Cardano卡尔达诺如何获得一致好评?
    拜占庭将军问题(Byzantine Generals Problem),一个关于分布式系统容错问题故事
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/6676734.html
Copyright © 2011-2022 走看看