VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 7040|回复: 11

一个简单DX9HLSL代码

[复制链接]
 楼主| 发表于 2009-6-21 17:20:30 | 显示全部楼层 |阅读模式
一个简单DX9HLSL代码,不知道什么地方出问题 [已解决]

就是想让输出颜色固定为白色……
  1. Private Sub EffectTest()
  2. 'test only
  3. Dim s As String, ret As Long
  4. Dim buf As D3DXBuffer
  5. ''HLSL :-3
  6. s = s + "static const float4 color0={1.0f,1.0f,1.0f,1.0f};"
  7. s = s + "struct VS_OUTPUT{float4 Position : POSITION;float4 Diffuse: COLOR0;/*float2 TextureUV  : TEXCOORD0;*/};"
  8. s = s + "struct PS_OUTPUT{float4 RGBColor : COLOR0;};"
  9. s = s + "VS_OUTPUT TestVS( float4 vPos : POSITION,float3 vNormal: NORMAL/*,float2 vTexCoord0 : TEXCOORD0*/){"
  10. s = s + "VS_OUTPUT Output;Output.Position=vPos;Output.Diffuse=color0;/*Output.TextureUV=vTexCoord0;*/return Output;}"
  11. s = s + "PS_OUTPUT TestPS( VS_OUTPUT In){PS_OUTPUT Output;Output.RGBColor=In.Diffuse;return Output;}"
  12. s = s + "technique Test{pass P0 {VertexShader=compile vs_2_0 TestVS();PixelShader = compile ps_2_0 TestPS();}}"
  13. s = s + vbNullChar
  14. s = StrConv(s, vbFromUnicode)
  15. 'create effect
  16. ret = D3DXCreateEffect(d3dd9, ByVal StrPtr(s), LenB(s), ByVal 0, ByVal 0, D3DXSHADER_DEBUG, Nothing, d3dxe, buf)
  17. If ret < 0 Then
  18.   MsgBox "Can't create D3DXEffect!! &H" + Hex(ret)
  19.   If Not buf Is Nothing Then
  20.     ret = buf.GetBufferSize
  21.     s = Space(ret)
  22.     CopyMemory ByVal StrPtr(s), buf.GetBufferPointer, ret
  23.     s = StrConv(s, vbUnicode)
  24.     ret = InStr(1, s, vbNullChar)
  25.     If ret > 0 Then s = Left(s, ret - 1)
  26.     Debug.Print s
  27.   End If
  28.   Set d3dxe = Nothing
  29.   Check1.Visible = False
  30. End If
  31. End Sub
复制代码
创建D3DXEffect倒是成功了,不启用HLSL可以正常显示,但是启用HLSL之后什么都没画出来:
  1. With d3dd9
  2.   .Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HFF000000, 1, 0
  3.   .BeginScene
  4.   .SetTransform D3DTS_WORLD, mat
  5.   .SetFVF D3DFVF_MY_VERTEX
  6.   If Not d3dxe Is Nothing And Check1.Value Then
  7.     d3dxe.SetTechnique StrPtr(StrConv("Test", vbFromUnicode))
  8.     d3dxe.Begin m, 0
  9.     'Debug.Assert m = 1
  10.     d3dxe.BeginPass 0
  11.   End If
  12.   .DrawPrimitiveUP D3DPT_TRIANGLELIST, v.nCount, v.d(0), Len(v.d(0))
  13.   If Not d3dxe Is Nothing And Check1.Value Then
  14.     d3dxe.EndPass
  15.     d3dxe.End
  16.   End If
  17.   .EndScene
  18.   .Present ByVal 0, ByVal 0, 0, ByVal 0
  19. End With
复制代码
不知道是不是HLSL写错了,我照着M$的BasicHLSL乱写的……DrawPrimitiveUP出问题了……或者是不知道有没有人研究过DX9,不管是VB还是VC……

下面是工程的源码,注意:要想在VB6里面打开需要最新dx9vb.tlb文件( http://www.vbgood.com/viewthread.php?tid=80529 )才能打开……运行exe没有额外要求……
问题出在VertexShader上面,太想当然了,直接返回位置了 应该在VertexShader里面写变换代码不过不要VertexShader,只要PixelShader就没有问题了……

现在用Shader写了一个WMP的转移矩阵效果,几乎不用CPU……看图……

[ 本帖最后由 acme_pjz 于 2009-6-22 14:21 编辑 ]
无标题-1.jpg

HLSL.rar

15.35 KB, 下载次数: 606

src & exe

本帖被以下淘专辑推荐:

发表于 2009-6-21 18:36:02 | 显示全部楼层
晕了,代码写在字符串里??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-21 18:55:47 | 显示全部楼层

回复 #2 msflexgrid 的帖子

对啊,然后提交给DirectX编译……反正这是M$的设计,效率低也没办法……当然保存成文件也行,不过也是纯文本……
回复 支持 反对

使用道具 举报

发表于 2009-6-21 20:35:24 | 显示全部楼层
M$现在全搞伪编译了啊.
VB,.NET,DX.......
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-21 21:29:30 | 显示全部楼层

回复 #4 msflexgrid 的帖子

主要问题是不同显卡对GPU汇编代码的支持不一样,所以只能实时编译了……
回复 支持 反对

使用道具 举报

发表于 2009-8-13 20:17:03 | 显示全部楼层
不错,我支持~~~
回复 支持 反对

使用道具 举报

发表于 2009-9-19 17:11:25 | 显示全部楼层
还是新林这块显卡好。

acme_pjz:主要问题是不同显卡对GPU汇编代码的支持不一样,所以只能实时编译了……
新林:不错,我支持~~~
回复 支持 反对

使用道具 举报

发表于 2009-10-2 09:08:12 | 显示全部楼层
谢谢分享~~~~~~~~~~~~??
回复 支持 反对

使用道具 举报

发表于 2009-10-13 16:27:13 | 显示全部楼层
不错不错
回复 支持 反对

使用道具 举报

发表于 2009-12-15 19:48:09 | 显示全部楼层
不是说vb不支持d9的了?现在可以了么?可怜我学在vb中学d8学了很久
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-6-26 04:08

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表