zoukankan      html  css  js  c++  java
  • RenderMonkey 练习 第四天 【OpenGL Texture Bump】

    BumpTexture

    1. 新建一个OpenGL 空effect;

    2. 添加相关变量

    右击Effect节点选择Add Variable->float->float / float3 添加镜面光强度、灯光位置和相机位置参数:

    float fSpecularPower = 25.0;

    float3 vec3LightPosition = {-100.0,100.0,100.0};

    float3 vec3EyePosition = {0,0,100.0};

    右击Effect节点选择AddTexture->Add 2DTexture 添加base和bump两张纹理图片:

    Fieldstone.tga   ---->  base

    FieldstoneBumpDOT3.tga  -----> bump

    右击Effect节点选择Add Variable->Color 添加 环境光、散射光、镜面光颜色

    fvAmbient  = {0.3,0.3, 0.3};

    fvDiffuse = {0.86,0.86,0.86};

    fvSpecular = {0.57,0.56,0.58};

    3. 修改Stream Mapping 中 添加NORMAL、TexCoord 、 BINORMAL、TANGENT

    4. 在pass0中添加纹理对象 AddTextureObject 将base和bump图片添加进去,重新命名为baseMap和bumpMap

    5. 修改vertex shader :

    uniform vec3 vec3LightPosition;
    uniform vec3 vec3EyePosition;

    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 fviewDirection = normalize(vec3EyePosition - fvObjectPosition.xyz);
       vec3 flightDirection = normalize(vec3LightPosition - fvObjectPosition.xyz);
       
       vec3 fvNormal = gl_NormalMatrix * gl_Normal;
       vec3 fvBiNormal = gl_NormalMatrix * rm_BiNormal;
       vec3 fvTangent = gl_NormalMatrix * rm_Tangent;
       
       viewDirection.x = dot(fvTangent, fviewDirection);
       viewDirection.y = dot(fvBiNormal, fviewDirection);
       viewDirection.z = dot(fvNormal, fviewDirection);
       
       lightDirection.x = dot(fvTangent, flightDirection);
       lightDirection.y = dot(fvBiNormal, flightDirection);
       lightDirection.z = dot(fvNormal, flightDirection);   
    }

    6.修改pixel shader:

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

    uniform sampler2D baseMap;
    uniform sampler2D bumpMap;

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

    void main( void )
    {
       vec3  fvLightDirection = normalize( LightDirection );
       vec3  fvNormal         = normalize( ( texture2D( bumpMap, Texcoord ).xyz * 2.0 ) - 1.0 );
       float fNDotL           = dot( fvNormal, fvLightDirection );
       
       vec3  fvReflection     = normalize( ( ( 2.0 * fvNormal ) * fNDotL ) - fvLightDirection );
       vec3  fvViewDirection  = normalize( ViewDirection );
       float fRDotV           = max( 0.0, dot( fvReflection, fvViewDirection ) );
       
       vec4  fvBaseColor      = texture2D( baseMap, Texcoord );
       
       vec4  fvTotalAmbient   = fvAmbient * fvBaseColor;
       vec4  fvTotalDiffuse   = fvDiffuse * fNDotL * fvBaseColor;
       vec4  fvTotalSpecular  = fvSpecular * ( pow( fRDotV, fSpecularPower ) );
     
       gl_FragColor = ( fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular );      
    }

    7. 效果图

  • 相关阅读:
    String、StringBuffer与StringBuilder之间区别
    关于 hashCode() 你需要了解的 3 件事
    Java基础之 运算符
    Java基础之基础语法
    Java基础之Java 修饰符
    自动化-python介绍与基础
    vue访问本地后台
    vue请求报错Uncaught (in promise)
    使用vue-resource,get、post、jsonp都报未定义的错误。
    【蓝桥杯】历届试题 打印十字图
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/6700151.html
Copyright © 2011-2022 走看看