VBGAME-DIRECT3D

坚持并快乐着!——繁星
posts - 15, comments - 15, trackbacks - 0, articles - 1
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

VS初步学习

Posted on 2006-05-14 17:49 繁星 阅读(329) 评论(0)  编辑 收藏 引用

最近对顶点着色器发生了兴趣,当然这也是学习d3d过程中必然会遇到的。下面是初步学习Vexter Shader后写的一个示例程序。
虽然简单,但我希望对大家有所帮助,因为我觉得学习编程莫过于看原代码,看示例了。在VB中是用一长串数据来代表顶点类型,它也将在汇编代码中使用。在示例中能找到如下代码:

Function creaVShader(filesrc As String) As Long
Dim shaderArray() As Long
Dim shader As Long
Dim decl(4) As Long
Dim shaderCode As D3DXBuffer
decl(0) = 536870912           'D3DVSD_STREAM(0)
decl(1) = 1073872896         'D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3 )
decl(2) = 1074003973         'D3DVSD_REG(D3DVSDE_DIFFUSE, D3DVSDT_D3DCOLOR )
decl(3) = -1                          'D3DVSD_END()
Set shaderCode = D3DX.AssembleShaderFromFile(filesrc, 0, "", Nothing)
ReDim shaderArray(shaderCode.GetBufferSize() / 4)
D3DX.BufferGetData shaderCode, 0, 1, shaderCode.GetBufferSize(), shaderArray(0)
Set shaderCode = Nothing
g_D3DDevice.CreateVertexShader decl(0), shaderArray(0), shader, D3DUSAGE_SOFTWAREPROCESSING
creaVShader = shader
End Function

上面代码创建了一个顶点着色器,creaVShader为其着色器句柄了,在以后渲染时,通过g_D3DDevice.SetVertexShader方法来应用.
关于着色器更多的信息:d3dshader.bas中的宏定义
我们开始进入正题。

1.首先,我们手动创建一个三角形。
Dim Vertices(3) As cvertex
VertexSizeInBytes = Len(Vertices(0))
With Vertices(0): .x = 0: .y = 0: .z = 0: .diffuse = 0: End With
With Vertices(1): .x = 1: .y = 0: .z = 1: .diffuse = 0: End With
With Vertices(2): .x = 1: .y = 0: .z = 0: .diffuse = 0: End With
Set g_VB = g_D3DDevice.CreateVertexBuffer(VertexSizeInBytes * 3, 0, D3DFVF_XYZ Or D3DFVF_DIFFUSE, D3DPOOL_DEFAULT)
D3DVertexBuffer8SetData g_VB, 0, VertexSizeInBytes * 3, 0, Vertices(0)

2.然后,我们设置变换矩阵
下面的这个过程将在Render()过程中被调用。Render()过程又在Timer1_Timer()过程中被不断调用。
Sub SetupMatrices()
Dim tempmat As D3DMATRIX
Dim matWorld As D3DMATRIX
Dim matView As D3DMATRIX
Dim matProj As D3DMATRIX
D3DXMatrixRotationY matWorld, Timer
D3DXMatrixLookAtLH matView, vec3(0#, 2#, 3#), vec3(0#, 0#, 0#), vec3(0#, 1#, 0#)
D3DXMatrixMultiply tempmat, matWorld, matView
D3DXMatrixPerspectiveFovLH matProj, g_pi / 3, 1, 1, 1000
D3DXMatrixMultiply tempmat, tempmat, matProj
D3DXMatrixTranspose tempmat, tempmat
g_D3DDevice.SetVertexShaderConstant 1, tempmat, 4
End Sub
函数D3DXMatrixTranspose用来转置矩阵,然后把矩阵写入常数寄存器1,2,3,4.

3.在每次调用Render()时,改变constants(0 to 3)的值,这些值将被写进C0常量寄存器。用于改变每个顶点的颜色:
For i = 0 To 3
If constants(i) - 1 >= 0 Then
constants(i) = 0
End If
constants(i) = constants(i) + 0.01
Next
g_D3DDevice.SetVertexShaderConstant 0, constants(0), 1
汇编代码:
add oD0,v5,c0
v5为颜色输入寄存器,oD0为颜色输出寄存器。

4.新建一.txt文档。写入如下内容:
vs.1.0
m4x4 r0,v0,c1     'v0为顶点位置对应的输入寄存器
mov oPos,r0        'oPos顶点位置对应的输出寄存器
add oD0,v5,c0    
然后保存为vshader.txt文件。
在vb中通过一下函数creaVShader来加载到程序中使用:
vshader = creaVShader(App.Path + "\vshader.txt")
得到一个着色器句柄vshader,然后在渲染时使用SetVertexShader方法来应用着色器:
g_D3DDevice.SetVertexShader vshader

结果如下图:
vs1.bmpvs2.bmpvs3.bmp
原代码下载:http://www.cnitblog.com/Files/seesea/VSexample.rar

只有注册用户登录后才能发表评论。