zoukankan      html  css  js  c++  java
  • Parallax Mapping Shader 凸凹感【转】

    原文 http://www.azure.com.cn/default.asp?cat=11&page=2

    Parallax Mapping 就是通过高度图中的高度,对纹理坐标进行偏移,
    来视觉上欺骗观察者,产生很有凸凹感个幻觉。

    uploads/200612/23_134027_parallax.jpg

    uniform vec3 fvLightPosition;
    uniform vec3 fvEyePosition;

    varying vec2 Texcoord;
    varying vec3 ViewDirection;
    varying vec3 LightDirection;
      
    attribute vec3 rm_Binormal;
    attribute vec3 rm_Tangent;
      
    void main( void )
    {
       gl_Position = ftransform();
       Texcoord    = gl_MultiTexCoord0.xy;
       
       vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
      
       vec3 fvViewDirection  = fvEyePosition - fvObjectPosition.xyz;
       vec3 fvLightDirection = fvLightPosition - fvObjectPosition.xyz;
        
       vec3 fvNormal         = gl_NormalMatrix * gl_Normal;
       vec3 fvBinormal       = gl_NormalMatrix * rm_Binormal;
       vec3 fvTangent        = gl_NormalMatrix * rm_Tangent;
         
       ViewDirection.x  = dot( fvTangent, fvViewDirection );
       ViewDirection.y  = dot( fvBinormal, fvViewDirection );
       ViewDirection.z  = dot( fvNormal, fvViewDirection );
      
       LightDirection.x  = dot( fvTangent, fvLightDirection.xyz );
       LightDirection.y  = dot( fvBinormal, fvLightDirection.xyz );
       LightDirection.z  = dot( fvNormal, fvLightDirection.xyz );
      
    }

    uniform vec4 fvAmbient;
    uniform vec4 fvSpecular;
    uniform vec4 fvDiffuse;
    uniform float fSpecularPower;

    uniform sampler2D baseMap;
    uniform sampler2D bumpMap;
    uniform sampler2D Parallax;

    varying vec2 Texcoord;
    varying vec3 ViewDirection;
    varying vec3 LightDirection;

    void main( void )
    {
       vec3  fvViewDirection  = normalize( ViewDirection );
       vec4  height           = texture2D( Parallax, Texcoord);
       float uoffset          = (height.x-0.5)*0.11*fvViewDirection.x;
       float voffset          = (height.x-0.5)*0.11*fvViewDirection.y;
       vec2 modifyTexcoord    = vec2(Texcoord.x+uoffset, Texcoord.y+voffset); 
      
       vec3  fvLightDirection = normalize( LightDirection );
       vec4  avent = texture2D( bumpMap, modifyTexcoord );
       float d = dot(avent.xyz, fvLightDirection);
       float shadow = clamp((d - avent.w) * 1.8 + 0.5, 0.0, 1.0);
       shadow = shadow * shadow * (3.0 - 2.0 * shadow);

      
       vec3  fvNormal         = normalize(  avent.xyz * 2.0 - 1.0  );
       float fNDotL           = dot( fvNormal, fvLightDirection );
      
       vec3  fvReflection     = normalize( ( ( 2.0 * fvNormal ) * fNDotL ) - fvLightDirection );
     
       float fRDotV           = max( 0.0, dot( fvReflection, fvViewDirection ) );

       vec4  fvBaseColor      = texture2D( baseMap, modifyTexcoord );
      
       vec4  fvTotalAmbient   = fvAmbient * fvBaseColor;
       vec4  fvTotalDiffuse   = fvDiffuse * fNDotL * fvBaseColor;
       vec4  fvTotalSpecular  = fvSpecular * ( pow( fRDotV, fSpecularPower ) );
     
       gl_FragColor = fvTotalAmbient + (fvTotalDiffuse + fvTotalSpecular) * shadow;
          
    }

  • 相关阅读:
    pytorch之dataloader深入剖析
    Pytorch多GPU并行处理
    鸡汤:做灯泡的
    数据工程师
    软实力
    七拼八凑的读书感
    深入一点儿
    Session的生命周期
    cloudera项目源代码
    Storm实时计算系统
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/3806637.html
Copyright © 2011-2022 走看看