zoukankan      html  css  js  c++  java
  • 立方体贴图

    片元着色器利用

    vec4 texColor = textureCube(myCube, texCoord);

    9.12.1 反射贴图

    即,有部分光来自反射方向

    9.12.2 折射

    即,有部分光来自折射方向(在小于临界角时)

    散射光线集中在折射光线方向附近,因此折射模型中可能还包括一项与t.v成正比的项,同样可以用中值来简化

    9.12.3 法线贴图

    9.13 凹凸映射

    9.13.1原理

    给每个点一个法向上的微小扰动,有多种方法

    p = p’ + d(u,v)*n  (1)

    p’处的法向量n’ = p’_u x p’_v (2)

    从(1)式求导,得 p’_u , p’_v,

    再由(2) 得n’

    组成 [t, b, m]

    则只需给出 \partial d/  \partial u 及 \partial d / \partial v, 可用(纹理图像)差分代替

    9.13.2 高度场与凹凸映射

    对多边形模型,在模型或对象桂圆里利用高度场时行凹凸映射。假设某扁平表面处于z = 0,则凹凸效果为移位结果:z = d(x,y)

    用x y 方向上采样点的间隔近似法线扰动

    9.13.3 凹凸映射与片元着色器

    因为需要为每个片元计算法线,在固定功能流水线中不容易实现。对片元着色器,在处理每个片元时可修改法线。

    其中一种方法:每处理一个片元时,调用扰动函数

    另一种,预先计算扰动量,存放在一个纹理贴图里

    还有一点,要注意计算所需要的空间

    9.13.4示例

    在纹理坐标系中。

    varing vec3 lightv;

    varying vec3 viewv;

    attribute vec tangento;

    void main()

    {

        gl_Position = gl_ModelViewmatrix * gl_Vertex;

        vec3 viewe = vec3()gl_ModelViewMatrix*gl_Vertex;

        gl_TexCoord[0] = gl_MultiTexCoord0;

        vec3 lighte = normalize(vec3(gl_LightSource[0].position) – viewe);

        vec3 normal = normalize(gl_NormalMatrix* gl_Normal);

        vec3 tangent = normalize(gl_NormalMatrix*tangento);

        vec3 binormal = cross(normal, tangent);

       lightv.x = dot(tangent, lighte.xyz);

       lightv.y = dot(binormal, lighte.xyz);

       lightv.z = dot(normal, lighte.xyz);

        viewv.x = …

       viewv.y = …

       viewv.z = …

     

       lightv = normalize(lightv);

       viewv = normalize(viewv);
    }

    varying vec3 lightv;

    varying vec3 viewv;

    uniform sampler2D texMap;

    uniform sampler 2D normalMap;

    void main()

    {

      vec3 Light = normalize(lightv);

      vec4 texColor = texture2D(texMap,gl_texCoord[0].st);

      vec3 normal = 2 * (texture2D(normalMap,gl_TexCoord[0].st).rgb – 0.5);

      gl_FragColor = max(dot(light, normal),0.0) * texColor;

    }

    }

  • 相关阅读:
    在谷歌地图上绘制行政区域轮廓【结合高德地图的API】
    用PL/SQL远程连接Oracle服务器
    找工作之离职篇
    linux设置定时备份mysql数据库
    使用NoSQL实现高并发CRM系统实践(源代码+解析)
    做领导应该注意的几个问题
    如何才能成为真正的程序员
    利用websocket实现手机扫码登陆后,同步登陆信息到web端页面
    利用laravel-echo主动向服务端发送消息,实现在线状态管理
    飞鱼CRM
  • 原文地址:https://www.cnblogs.com/justin_s/p/2091241.html
Copyright © 2011-2022 走看看