Windows 8 DirectX 开发学习笔记(十五)使用Billboard实现树木贴图

本文介绍了如何在Windows 8 DirectX 11应用中使用Billboard技术来绘制树木,以此提高大规模场景渲染的效率。通过重新编写顶点、几何和像素着色器,实现了在CPU生成树木位置和大小后,由几何着色器完成二维图片的旋转和投影,减少计算量。文章详细阐述了着色器的编写、树木模型的生成和渲染流程,展示了最终的渲染效果。
摘要由CSDN通过智能技术生成

要使用DirectX来获得三维效果,一般首先要生成一个三维模型,然后计算它在可视空间中的投影。这样得到的二维图像十分真实,但是计算量也很大。在大规模场景渲染中,随着模型精度的提高,这样的处理方式十分消耗资源。人眼的分辨率是有限的,对于远处的模型,模糊一些不会影响到整体效果。Billboard技术就是用二维图片来模拟三维模型的投影,从而提高渲染效率。只要距离足够远,通过将二维图片旋转至合适角度,实际渲染效果与三维模型相差无几,但计算量减少很多。本文使用几何着色器,利用Billboard技术在之前的模型中添加树木贴图。

整个过程与上一篇的内容类似。不过这一次树木模型的顶点结构与其他模型不同,所以要重新写一套着色器(TreeVertexShader.hlslTreeGeometryShader.hlslTreePixelShader.hlsl)。使用Billboard绘制树木时,CPU只要生成树木的位置和大小即可,计算过程均由几何着色器完成,而顶点着色器只起到传递参数的作用,代码如下:

struct VertexShaderInput
{
    float3 center : POSITION;
    float2 size : SIZE;
};
 
struct VertexShaderOutput
{ 
    float3 center : POSITION;
    float2 size : SIZE;
};
 
VertexShaderOutput main( VertexShaderInput input )
{
    VertexShaderOutputoutput;
 
    output.center =input.center;
    output.size =input.size;
 
    return output;
}

另外,为了方便观察绘制效果,新像素着色器只进行纹理采样,不实现光照等效果。

SamplerState samplerLinear : register(s0);
Texture2D texDiffuse : register(t0);
 
struct PixelInputType
{
    float4 posH    : SV_POSITION;
    float3 posW    : POSITION;
    float3 normalW : NORMAL;
    float2 texC    : TEXCOORD;
};
 
float4 main(PixelInputType pIn) : SV_Target
{
    float4 diffuse =texDiffuse.Sample(samplerLinear, pIn.texC);
 
    // alpha值小于0.25,放弃该像素
    clip(diffuse.a -0.25f);
   
    // 输出纹理颜色
    return diffuse;
}

三个新着色器中,几何着色器是重点。由于几何着色器在顶点着色器和像素着色器之间,根据前面的代码可以很容易地得到几何着色器的结构定义:

struct GSInput
{
    float3 center : POSITION;
    float2 size : SIZE;
};
 
struct GSOutput
{
    float4 posH : SV_POSITION;
    float3 posW : POSITION;
    float3 normal : NORMAL;
    float2 tex : TEXCOOD;
};

而计算树木贴图的变换矩阵时需要观察点的位置等信息,所以在几何着色器中定义一个常量缓冲区来存储相关信息:

cbuffer cbTreeConstanBuffer : register(b0)
{
    matrix model;
    matrix view;
    matrix projection;
    float4 eye; 
};

接下来就根据输入的点信息来生成树木模型。具体的数学原理在DirectX游戏编程中有详细的介绍,这里主要关注其实现。

[maxvertexcount(4)]
void main(
    point GSInput input[1],
    inout Triangle
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值