• 一步一步学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. 运行效果如下:

       

  • 相关阅读:
    vue 对图片进行拖拽到另一个位置
    vue自定义拖动指令
    使用pm2启动nodejs+express+mysql管理系统步骤
    重新学习html和css
    vue监听页面大小变化重新刷新布局
    Docker可视化管理工具DockerUI ,Portainer ,Shipyard对比(转)
    js删除html标记 去掉所有html标记 百度文库内容copy
    安卓模拟器连接端口一览表
    springmvc在使用@ModelAttribute注解获取Request和Response会产生线程并发不安全问题(转)
    常用软件测试工具的对比
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/6676734.html
Copyright © 2020-2023  润新知