zoukankan      html  css  js  c++  java
  • vertex texture fetching in HLSL, and heightfield normal calculation

    这是去年 Ubisoft 的一道招聘试题:

    目标

    创建一个程序,读取我们提供的两个高度位图文件(Heightmap01.bmp,heightmap02.bmp)为基础渲染出地形效果,并能顺利地在以各个高度位图为基础的地形之间进行平滑变换(Morphing),保证变换过程中光照效果的正确。

    详情

    在程序中,读取我们提供的两个位图图像(192x192)。使用Direct3D的功能渲染地形效果,使三维场景的地形可从一个平面平滑变形至以第一个高度位图为基础的地形,然后平滑变换到以第二个高度位图为基础的地形,然后再变换回平面。场景应至少有一个方向光,在变换过程中要保证地形的光照效果是正确的。同时用户应该能够改变的变换的速度并能控制相机的移动和旋转。

    最近一直在整理实验结果,绘制图表,撰写论文。很久没写程序了,手痒。于是在鼓捣文章的间隙,把这道题目用来练练手。主要就是用 vertex texture fetching 来做 displacement mapping. 法线的计算采用 Game Programming Gems 3, 4.2中的方法:

    Vertex Shader
    // calc normal
    float offset = 1 / numGrid;
    height1 = tex2Dlod(samp1, float4(input.texcoord, 00+ float4(offset, 000));
    height2 = tex2Dlod(samp2, float4(input.texcoord, 00+ float4(offset, 000));
    float h1 = heightWeight1 * (height1.x) + heightWeight2 * (height2.x);

    height1 = tex2Dlod(samp1, float4(input.texcoord, 00+ float4(0-offset, 00));
    height2 = tex2Dlod(samp2, float4(input.texcoord, 00+ float4(0-offset, 00));
    float h2 = heightWeight1 * (height1.x) + heightWeight2 * (height2.x);

    height1 = tex2Dlod(samp1, float4(input.texcoord, 00+ float4(-offset, 000));
    height2 = tex2Dlod(samp2, float4(input.texcoord, 00+ float4(-offset, 000));
    float h3 = heightWeight1 * (height1.x) + heightWeight2 * (height2.x);

    height1 = tex2Dlod(samp1, float4(input.texcoord, 00+ float4(0, offset, 00));
    height2 = tex2Dlod(samp2, float4(input.texcoord, 00+ float4(0, offset, 00));
    float h4 = heightWeight1 * (height1.x) + heightWeight2 * (height2.x);

    float3 normal = float3(h3 - h1, 2 * gridSize, h4 - h2);
    normalize(normal);

    程序的截图如下:

    源码下载:

    https://files.cnblogs.com/atyuwen/Terrian.rar

  • 相关阅读:
    cookie和session。
    K3cloud Web API对接---单据保存接口(有源单)
    K3 wise kis 防火墙设置
    新单序时簿插件
    mssqlserver中排序规则冲突的问题解决
    读取金蝶图片
    金蝶wise委外订单关闭简述
    存储过程加锁
    判断存储过程是否存在
    解除死锁
  • 原文地址:https://www.cnblogs.com/atyuwen/p/vertex_texture_fetching.html
Copyright © 2011-2022 走看看