【主体程序代码2】
'————————————————
'第二段代码是算法主体了
'————————————————
Private Sub Command2_Click()
'————————————算法解释——————————
'从高度图的灰度得到高度,然后取(X,Y) (X+1,Y) (X,Y+1)等等的点
'作为三角形的顶点,4个顶点一共形成4个三角形
'叉乘得到法向量,4个法向量相加再归一化,转为色值之后储存在Bump图的(X,Y)处
' 俯视图XYZ标准数学坐标系
'↑Y
'| [Vertex1] [Vertex2]
'|
'| [Vertex3] [Vertex4]
'|——————————→X'
'Vec1 = P1 —— P2
'VEC2 = P3 —— P4
'VEC3 = P1 —— P4
'VEC4 = P2 —— P3
'——————————————————多敬业连注释都搬了上来 = =
Dim VertexH1 As Long, VertexH2 As Long, VertexH3 As Long, VertexH4 As Long '每次处理的时候取4点(2x2)Dim V1 As TV_3DVECTOR, V2 As TV_3DVECTOR '俯视图中正方形的对边Dim V3 As TV_3DVECTOR, V4 As TV_3DVECTOR '俯视图中的正方形的斜边
Dim Normal1 As TV_3DVECTOR, Normal2 As TV_3DVECTOR '法向量1,2Dim Normal3 As TV_3DVECTOR, Normal4 As TV_3DVECTOR '法向量3,4
Dim BumpVector As TV_3DVECTOR '
For w = 1 To HTexture.Width - 2
For h = 1 To HTexture.Height - 2
'————————相邻4(2x2)像素处理——————————
VertexH1 = DecodeRGBA(HeightMapPixel(w, h)).r * 255
'R值= =反正灰度图RGB相等,取一个就行 顶点高度
VertexH2 = DecodeRGBA(HeightMapPixel(w + 1, h)).r * 255
VertexH3 = DecodeRGBA(HeightMapPixel(w, h + 1)).r * 255
VertexH4 = DecodeRGBA(HeightMapPixel(w + 1, h + 1)).r * 255
V1 = Normalize(Vector(1, 0, VertexH2 - VertexH1)) '正方形边
V2 = Normalize(Vector(1, 0, VertexH4 - VertexH3)) '正方形边
V3 = Normalize(Vector(1, -1, VertexH4 - VertexH1)) '斜边
V4 = Normalize(Vector(-1, -1, VertexH3 - VertexH2)) '斜边
'严格遵守右手定则
Normal1 = Cross(V4, V1) '三角形 |/
Normal2 = Cross(V3, V1) '三角形 \|
Normal3 = Cross(V3, V2) '三角形 |\
Normal4 = Cross(V4, V2) '三角形 /|
With TVMath
BumpVector = Normalize(.vAdd(Normal1, .vAdd(Normal2, .vAdd(Normal3, Normal4)))) '4个向量加起来
End With
Dim BumpColor As TV_COLOR
BumpColor.r = (BumpVector.x + 1) / 2 'VectorX取值(-1,1),转为颜色要这样
BumpColor.g = (BumpVector.y + 1) / 2 'VectorX取值(-1,1),转为颜色要这样
BumpColor.b = (BumpVector.z + 1) / 2 'VectorX取值(-1,1),转为颜色要这样
HeightMapPixel(w, h) = RGBA(BumpColor.r, BumpColor.g, BumpColor.b, 1) texF.SetPixel GetTex("Bump"), w, h, HeightMapPixel(w, h) '储存像素
'————————————————————————————
Next h
Next w
End Sub