Directx11教程 19 畫乙個簡單的地形

2021-09-08 00:11:54 字數 2149 閱讀 8320

通常我們在xz平面定義乙個二維的網格,然後y的值根據一定的函式計算得到,比如正弦、余弦函式的組合等等,可以得到乙個看似不錯的地形或者水面的效果。 在本教程中我們修改modelclass.h和modelclass.cpp,得到乙個近似的地形。

在本章**中,我們定義300*300=90000個頂點,共(300-1)(300-1)*2個三角形,每個網格的大小都為1.

我們得到y值的函式為:

float modelclass::getheight(float x, float z) const

modelclass.h主要**如下:

#pragma once

#include

#include

#include "common.h"

class modelclass ;

modelclass.cpp主要**如下:

bool modelclass::initialize(id3d11device* device, int m, int n, float dx)

return true; }

void modelclass::shutdown()

float modelclass::getheight(float x, float z) const

void modelclass::render(id3d11devicecontext* devicecontext)

int modelclass::getindexcount()

bool modelclass::initializebuffers(id3d11device* device, int m, int n, float dx)

float halfwidth = (n-1)*dx*0.5f;

float halfdepth = (m-1)*dx*0.5f;

for(int i = 0; i < m; ++i) }

// 建立索引緩衝.

indices = new unsigned long[m_indexcount];

if(!indices)

// 迭代每個grid,計算得出索引.

int k = 0;

for(int i = 0; i < m-1; ++i) }

// 設定頂點緩衝描述 …

return true; }

還要修改一下graphicsclass.cpp中初始化modelclass的**:

// 初始化模型物件.

result = m_model->initialize(m_d3d->getdevice(), 300, 300, 1.0f);

if(!result)

執行程式後,效果如下,我們還可以用a/s/d/w鍵來移動攝像機看看地形的效果。

我們還可以修改d3dclass.cpp中,渲染狀態fillmode設定,修改為線框模式後的效果如下:

d3dclass.cpp中修改**如下:

// 設定光柵化描述,指定多邊形如何被渲染.

rasterdesc.antialiasedlineenable = false;

rasterdesc.cullmode = d3d11_cull_back;

rasterdesc.depthbias = 0;

rasterdesc.depthbiasclamp = 0.0f;

rasterdesc.depthclipenable = true;

rasterdesc.fillmode = d3d11_fill_wireframe;

rasterdesc.frontcounterclockwise = false;

rasterdesc.multisampleenable = false;

rasterdesc.scissorenable = false;

rasterdesc.slopescaleddepthbias = 0.0f;

完整的**請參考:

工程檔案mytutoriald3d11_13

Directx11教程37 紋理對映 7

本章是在教程35 36的基礎上來實現乙個光照紋理結合的程式,就是把場景中旋轉的cube加上紋理。lighttex.vs中頂點的結構現在為 struct vertexinputtype 紋理座標 output.tex input.tex 紋理座標不做任何變化,只是單純的從vs輸出到ps中。lightt...

Directx11教程38 紋理對映 8

上篇日誌中,我們用紋理和光照顏色調製的方式得到最終顏色,本章我們嘗試用紋理取樣的顏色,直接做為材質的漫反射係數kd,並用它來做光照計算,最後再做個gamma校正,如果不做的話,效果會偏亮。lighttex.ps主要改動 float4 texturecolor shadertexture.sample...

Directx11教程39 紋理對映 9

在mytutoriald3d11 32中,我們在planemodelclass中增加乙個紋理textureclass m texture 讀入乙個grass的紋理,程式執行後的效果如下 完整的 請參考 工程檔案mytutoriald3d11 32 在mytutoriald3d11 33中,我們移去了...