Windows 8 Directx 开发学习笔记(十一)地形纹理贴图

本文介绍如何在DirectX 8中为大型模型如山峰和水面进行纹理贴图,通过调整纹理坐标范围和设置重复纹理寻址模式,实现平铺效果。文章详细阐述了在HLSL中修改顶点和像素着色器,C++代码中更新顶点结构、加载纹理资源和应用时间偏移来模拟水面流动效果的过程。
摘要由CSDN通过智能技术生成

前一篇实现木箱贴图时,木箱的六个面都正好用一整张纹理图,即六个面的纹理坐标均在[0,1]内。然而在为比较大的模型贴图时,像山峰河谷模型,如果只用一张纹理图,那么每个三角形只得到几个纹理元素,无法为提供足够高的分辨率。这时可以在模型表面上平铺纹理贴图,像给墙面贴磁砖一样,只需要知道一个单位的贴图,就能铺满整个表面,从而获得较高的分辨率。实现起来其实很简单,只要变换纹理坐标的范围,同时将纹理寻址模式设置为重复即可。

纹理坐标范围变换有两种方式,很简单,如图1:


其中x,y是原始纹理坐标,为了能与4*4的变换矩阵相乘,将其扩展为4元向量。等号左边是一种变换方式,使用变换矩阵进行纹理坐标变换,可用GPU计算。等号右边是第二种变换方式,直接生成变换后的纹理坐标,由CPU计算。本文选择的是第一种变换方式。

下面就开始给学习笔记(九)实现的山峰和水面模型贴图。

依然是先修改HLSL代码。在顶点着色器的输入输出结构中添加用于存储纹理坐标的成员tex。并在ModelViewProjectionConstantBuffer里添加texTransform成员,用于存储缩放和平移变换矩阵。

struct VertexShaderInput
{
    float3 pos : POSITION;
    float3 normal : NORMAL;
    float2 tex : TEXCOOD;
};
 
struct VertexShaderOutput
{
    float4 posH : SV_POSITION;
    float3 posW   : POSITION;
    float3 normal : NORMAL;
    float2 tex : TEXCOOD;
};
 
cbuffer ModelViewProjectionConstantBuffer : register(b0)
{
    matrix model;
    matrix view;
    matrix projection;
    matrix texTransform;
};

变换纹理坐标时只要在main方法中添加下面的语句即可:

// 纹理坐标变换
output.tex = mul(float4(input.tex, 0.0f, 1.0f),texTransform).xy;

在像素着色器中要定义采样器和纹理资源,并更改输入结构体,与顶点着色器的输出对应。

SamplerState samplerLinear : register(s0);
Texture2D texDiffuse : register(t0);
 
struct PixelShaderInput
{
    float4 posH : SV_POSITION;
    float3 posW : 
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值