最新-基于四叉樹的LOD地形設計
上次說過要在這里把最新的地形設計寫出來,不過一直沒時間寫,也想畫些UML圖,但沒工具畫,呵呵,只能通過手寫了。希望大家看得明白吧。基本設計思想:
主要有以下幾個類,
CTerrainBlock,地形一個block,每個對象擁有自己的頂點緩沖和相對應的LOD值。
HeightMap類,讀入高度圖,并根據(jù)策略創(chuàng)建一定數(shù)量的CTerrainBlock。例如1024x1024的地形,我把每個block大小設置為64x64,那么這個HeightMap有16 x 16個block。
CQuadTree類,四叉樹類,根據(jù)block的大小劃分四叉樹。
基本流程:當場景渲染時,在場景UpdateScene的時候,首先Update了Camera數(shù)據(jù),然后從新計算Frustum,然后調用m_quadTree.GetRenderObject(list& renderList)函數(shù),以遞歸形式把quadTree中的在可視區(qū)內的渲染對象加到渲染隊列,加入隊列前并計算出CTerrainBlock的LOD值。到渲染時,首先根據(jù)地形的LOD值與相鄰四個作判斷,然后修補裂縫,具體做法是動態(tài)改變IB的值,有些LOD算法是一開始就根據(jù)不同的LOD和四邊的情況生成N個公共的IB,到渲染時可根據(jù)當前情況選擇合適的IB以解決裂縫問題。這樣可省去計算IB的時間,不過IB的數(shù)量會增多,就是以內存換時間。我現(xiàn)在的做法是以時間換內存。
下面是UpdateScene的代碼:


















下面是CTerrainBlock的部分代碼

2



3

4

5

6

7

8

9

10

11



12

13

14

15

16

17

18

19

20

21



22

23

24

25

26

27

28

29



30

31

32

33

34

35

36

37



38

39

40

41

42

43

44

45



46

47

48

49

50

51



52

53



54

55

56

57



58

59



60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80



81

82



83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104



105

106

107

108

109

110

111

112



113

114

115

116

117

118

119

120

121

122

123

124



125

126



127

128



129

130

131

132

133

134

135

136

137

138

139

140

141

142



143

144

145



146

147



148

149

150

151



152

153

154

155

156

157

158



159

160

161

162

163

164

165



166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185



186

187



188

189

190

191



192

193

194

195

196

197



198

199

200

201

202

203

204



205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232



233

234



235

236



237

238

239

240

241

242

243



244

245

246

247

248

249



250

251

252

253

254

255

256

257

258

259

260



261



262

這樣LOD的地形大概完成,下面是DEBUG版本貼圖:
1025 x1025 的地形:
WireFrame截圖:
129x129截圖:
因為129X129的頂點數(shù)較少,所以開了水面反射與折射幀數(shù)還是比較高。
posted on 2009-01-10 16:19 狂爛球 閱讀(7603) 評論(73) 編輯 收藏 引用 所屬分類: 圖形編程