游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6662|回复: 16

实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色器?

[复制链接]

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
发表于 2009-5-18 12:11:00 | 显示全部楼层 |阅读模式
如题

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-5-18 17:27:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

初学的话先用effect,帮你免去了很多工作量
等熟悉了再直接用vs,ps

用pix看一下,你就会发现其实很少有游戏用effect

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2009-5-18 18:06:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

对了 clayman 再问一个问题:

用d3d做2d的话, 是不是每一个2d图元(4个顶点) 都创建一个VertexBuffer?
或者还有没有其他的更好的方法?

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-5-18 19:46:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

用Effect。
不用Effect的游戏大多是DX8时代传承下来的代码,已经形成了自己的体系;另一种是跨DX和OpenGL而又不用CgFX的,只能自己制作跨平台的Effect系统。

如果你要做shader编译、反编译等的话另当别论。

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-5-18 20:45:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

不是,每一个vertexBuffer在使用的时候,都需要dx对其进行管理和调度,vb越多,需要管理的对象也越多,导致整体性能下降。
基本上,你的整个2D系统只维护一个动态的vb
此外,为了优化性能,你应该实现类似Batch的功能,以减少DP数量,最终的接口应该和ID3DXSprite非常类似
Sprite.begin()
sprite.draw()
sprite.draw()
sprite.draw()
...........
sprite.end();
每一次draw时,把顶点记录到内部的渲染队列
end对队列进行处理,分为不同的batch,然后更新vb中的数据,调用DP

在begin和end之间,最好不要改变render state或者纹理
如果确实需要,那么最好分开写成几个不同的begin-end块

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-5-18 20:56:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

Effect设计的非常不错,只是在参数更新时,比直接使用SetVertexConstant要稍微慢一点,不过仍然非常快

就像qrli所说的,如果不做shader的动态编译,反编译,不能确定你的参数更新方式是否比effect好,,那么最好还是直接用effect

13

主题

113

帖子

113

积分

注册会员

Rank: 2

积分
113
发表于 2009-5-19 12:25:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

每一个2d图元(4个顶点) 都创建一个VertexBuffer那不累死啊? 可以创建一个大的VertexBuffer, Draw不同的部分嘛, 或者干脆就用一个, 用矩阵去改变不就行了?

如果想自己封装材质类,用Effect就不方便了

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2009-5-19 12:38:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

我大概了解了, 是不是这样:

在draw的时候就记录下传入的矩形, 保存在一个列表内,

然后在end的时候把列表内记录的矩形信息写入一块 VertexBuffer, 然后调用一次 DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 记录的矩形个数 * 2)

13

主题

113

帖子

113

积分

注册会员

Rank: 2

积分
113
发表于 2009-5-19 13:12:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

这要看你图片资源是怎么样的.如果一帧动画是一个图片的话,用一个VB就够了.如果多帧动画是在一个图片上的,由于纹理坐标的差异,可以用多个QUAD放入一个VB里,用的时候找到合适的DRAW.

或者,就用一个VB,但是这样会频繁的LOCK和UNLOCK.如果偷懒,还不如直接用DrawPrimitiveUP函数.

HGE中是有自己管理VB的,它在开始画的时候,LOCK,然后传入顶点.传完了UNLOCK画出.这样的方法最好,减少了DRAW的次数,多帧动画也可以放在一个图片上.

13

主题

113

帖子

113

积分

注册会员

Rank: 2

积分
113
发表于 2009-5-19 13:17:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

如果想自己封装材质类,用Effect就不方便了,你一定以为我在夸夸其谈.材质并不是指D3D中的材质,现在引擎的材质类是很强大的,包括了基本光照信息,渲染状态还有shader.这个shader并不是一般理解的shader,一般的shader,写好了就可以用了,但是如果遇到复杂多变的情况,比如不同的光源类型,不同的顶点输出方式(骨骼动画,粒子)就难办了,所以现代引擎并不是固定一个shader的,它把一个shader分成许许多多的小函数,根据不同的情况把小函数拼接形成一个shader,这是需要动态管理的.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-12 17:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表