游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2185|回复: 5

问几个hlsl基础问题

[复制链接]

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2009-6-7 12:37:00 | 显示全部楼层 |阅读模式
渲染方面始终花的精力不够多,有几个基础问题想问问

问题1:


beginpass
...设置关于 mesh1 的多个渲染参数
fx->commitchanges()
mesh1->draw()

...设置关于 mesh2 的多个渲染参数
fx->commitchanges()
mesh2->draw()

...

...设置关于 mesh2 的多个渲染参数
fx->commitchanges()
meshN->draw()

endpass

这种方式和以下的方式:

...设置关于 mesh1 的多个渲染参数
beginpass
mesh1->draw()
endpass


...设置关于 mesh2 的多个渲染参数
beginpass
mesh2->draw()
endpass

这两种方式,效率方面差别大吗?




第2个问题:
我要渲染shadowmap
骨骼mesh的顶点vs:

//骨骼动画的shadowmap
void BuildShadowMapSkinedMeshVS(
                   float4 vPos    : POSITION0,
                   float3 normalL : NORMAL0,
                   float2 tex0    : TEXCOORD0,
                   float weight0  : BLENDWEIGHT0,
                   int4 boneIndex : BLENDINDICES0,
                                   out float4 vPosOut : POSITION,
                                   out float3 vPixelOut : TEXCOORD0,
                                   out float2 tex1 : TEXCOORD1
                   )

普通mesh的顶点vs:

void VS_RenderShadowMap(
  float4 vPos : POSITION,
   float3 normalL : NORMAL0,
   float2 tex0    : TEXCOORD0,
  out float4 vPosOut : POSITION,
  out float3 vPixelOut : TEXCOORD0,
  out float2 tex1 : TEXCOORD1)

输入参数骨骼的比普通mesh的要多两个,我试过了,统一用BuildShadowMapSkinedMeshVS渲染所有模型的shadowmap没有问题,只是在vs的过程加一个判断就可以了,问题是,如果统一用一个vs,那么将出现实际传入的顶点长度小于vs 中in参数的声明的长度,这样会不会有什么效率上的问题?如果切换pass,整个shadowmap的渲染就不能通过一个pass完成了

我的问题是不同的mesh选不同类型的pass去切换,还是尽可能一个pass渲染最大数量的模型(存在传入参数不一致的问题)?
两者效率怎样?


227

主题

1793

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
发表于 2009-6-7 14:04:00 | 显示全部楼层

Re:问几个hlsl基础问题

我认为应该是尽可能一个pass渲染最大数量的模型效率比较高
不过这还要看你的shader是怎么写的

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-6-7 16:44:00 | 显示全部楼层

Re:问几个hlsl基础问题

问题一:
两种方式很难说哪种更好,不同的数据组织方式和场景规模下,通常有不同的效率
不过我更倾向于你说的第一种方式
另外我觉得无论使用哪种方式,还应该考虑到sort所耗费的时间一起分析,才算完整

问题二:
对shadow map的例子来说,两种方法几乎没有差别
beginSkinningEffect
   drawAllSkinningModel
beginSimpleEffect
   drawAllSimpleMode
只是多了一次effect切换而已,相对于整个渲染shadow map的时间,这点消耗完全可以忽略不计
另外,你渲染skining和非skinning模型的VertexDeclaration是否相同,如果不相同的话,即使使用同一个effect\pass,也会导致GPU重新组织整个管线,相当于切换了一次effect

2

主题

123

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2009-6-7 20:23:00 | 显示全部楼层

Re:问几个hlsl基础问题

问题一:
BeginPass()会提交effect里的所有参数状态,所以可能的话,多个DrawPrimitive在一个pass内完成,中间用effect.CommitChanges()。另外,CommitChanges()只提交改变了的参数。所以一般而言,前一种方式效率高。但高多少很难说,不过至少这样在用debug runtime时,它不会报告一堆的warning: redundent state change。

问题二:
单纯从效率考虑的话,应该用两个shader,这样能达到最大效率。因为任何微小的操作,放到vs或ps的操作数量级上都是非常可观的。但优化不一定要优化到极致,够用就好。另外,你也可以只用一个shader函数,在不同的pass或technique里使用不同的常量参数编译,这时源码只有一份,而shader却是分别优化的两份。

2

主题

123

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2009-6-7 20:28:00 | 显示全部楼层

Re:问几个hlsl基础问题

另外注意,切换technique的开销等同于切换pass的开销,因为technique只是一组pass而已,所谓切换technique本质上就是切换到另一个technique里的pass。另外effect.Begin()和effect.End()还要有些额外开销。这些实现开销的绝大部分不会立刻兑现,而是延迟到DrawPrimitive时一起兑现。

也就是说,选择哪种方式,取决于你的程序的瓶颈是哪一种:
1. 切换状态造成的瓶颈
2. VS瓶颈

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2009-6-7 23:04:00 | 显示全部楼层

Re:问几个hlsl基础问题

受教了,感谢楼上各位仁兄
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 01:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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