POPPUR爱换

标题: 关于曲面细分,我写了个demo,求测试 [打印本页]

作者: oz01    时间: 2011-8-30 13:52
标题: 关于曲面细分,我写了个demo,求测试
本帖最后由 oz01 于 2011-8-30 13:52 编辑

我写了个曲面细分的demo
http://www.terryzxc.com/oz01/qm.7z


数字键1和2分别是降低和提升曲面细分倍率上限
空格键开关框架模式
PageUP和PageDn控制视角远近,方向键控制视角方向
如果Tess后面的数字为0则表示没能成功开启曲面细分
如果你用的是DX11显卡却不能运行,或者细分倍率不可调整,请安装最新的WHQL驱动
[attach]1616524[/attach]
似乎A卡比较新的驱动会导致破面
我用HD5750 10.7版驱动没问题,很多人用11.8有问题

实际细分倍率是经过优化的,背面和平面不细分,拉远距离细分倍率自动降低
作者: xmap    时间: 2011-8-30 13:53
赞啊,难道是k-on里面的人物?

ACG技术宅。。。
作者: Edison    时间: 2011-8-30 14:22
楼主的 A 卡驱动面板 tessellation 倍率是 AMD 优化模式还是程序自选模式?

GTS 450 275.33:
[attach]1616558[/attach]
作者: oz01    时间: 2011-8-30 15:16
Edison 发表于 2011-8-30 14:22
楼主的 A 卡驱动面板 tessellation 倍率是 AMD 优化模式还是程序自选模式?

GTS 450 275.33:

可能我表达有误,优化模式是不变的,无论任何DX11显卡都一样
作者: 乐极生悲    时间: 2011-8-30 18:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: jackyangel    时间: 2011-8-30 19:17
T10 FPS:56
T11 FPS:50
T12 FPS:45
T13 FPS:36
T14 FPS:32
T15 FPS:28
T16 FPS:24
T17 FPS:21
T18 FPS:19
T19 FPS:17
T20 FPS:15
再往上调就没意思了
作者: Edison    时间: 2011-8-30 19:30
oz01 发表于 2011-8-30 15:16
可能我表达有误,优化模式是不变的,无论任何DX11显卡都一样

你可以看看,tessellation factor(?) 都是 4 的情况下,我用 GTS 450 跑出来的 wireframe 密度远远高于你的测试。
作者: jackyangel    时间: 2011-8-30 19:35
Edison 发表于 2011-8-30 19:30
你可以看看,tessellation factor(?) 都是 4 的情况下,我用 GTS 450 跑出来的 wireframe 密度远远高于 ...

是的,T4的效果和你的一样,接近的放大比例,看上去已经呈现点状了
作者: oz01    时间: 2011-8-30 20:21
抱歉有个文件发错了
把附件解压缩替换同名文件
在\data\shader\GLSL\SM5
作者: oz01    时间: 2011-8-30 20:23
另外想请问jackyangel同学是啥显卡这么强力
我的hd5750 1GB版到4就不行了……
作者: jackyangel    时间: 2011-8-30 20:26
oz01 发表于 2011-8-30 20:23
另外想请问jackyangel同学是啥显卡这么强力
我的hd5750 1GB版到4就不行了……

GTX580啊,既然你这个跑TS的,就开高一点试试了
作者: oz01    时间: 2011-8-30 20:28
果然……
新上传的文件请试试看吧
作者: jackyangel    时间: 2011-8-30 20:32
本帖最后由 jackyangel 于 2011-8-30 20:36 编辑
oz01 发表于 2011-8-30 20:28
果然……
新上传的文件请试试看吧


更新了
1、效果和你顶楼一样
2、TS开到40 FPS还是显示在60......
3、GPU LOAD保持在30%出头,上不去了
4、把TS开到程序最高的64,GPU LOAD才不到70%
作者: oz01    时间: 2011-8-30 20:37
用记事本打开light.tc
里面的内容都删掉
换成下面的
  1. #version 400
  2. layout(vertices = 3) out;

  3. in vec3 vPosition[];
  4. in vec3 vNormal[];
  5. in vec2 vTexCoord0[];
  6. in vec4 vColor[];

  7. out vec3 tcPosition[];
  8. out vec3 tcNormal[];
  9. out vec2 tcTexCoord0[];
  10. out vec4 tcColor[];
  11. out vec3 b210[];
  12. out vec3 b120[];
  13. out vec3 b021[];
  14. out vec3 b012[];
  15. out vec3 b102[];
  16. out vec3 b201[];
  17. out vec3 b111[];
  18. out vec3 n110[];
  19. out vec3 n011[];
  20. out vec3 n101[];

  21. #define ID gl_InvocationID
  22. #define float3 vec3
  23. uniform float TessLevel;
  24. void main()
  25. {
  26.     tcPosition[ID] = vPosition[ID];
  27.     tcNormal[ID] = vNormal[ID];
  28.     tcTexCoord0[ID] = vTexCoord0[ID];
  29.     tcColor[ID] = vColor[ID];
  30.     if (ID == 0)
  31.         {
  32.                 vec3 TessLevelSize,TessLevelSizeZ;
  33.                 TessLevelSize.x=length(vPosition[2].xy - vPosition[1].xy)/(vPosition[0].z);
  34.                 TessLevelSize.y=length(vPosition[0].xy - vPosition[2].xy)/(vPosition[1].z);
  35.                 TessLevelSize.z=length(vPosition[0].xy - vPosition[1].xy)/(vPosition[2].z);
  36.                 vec3 ANormal = vPosition[2] - vPosition[0];
  37.                 vec3 BNormal = vPosition[1] - vPosition[0];
  38.                 vec3 gFacetNormal = normalize(cross(ANormal, BNormal));
  39.                 vec3 gFacetNormal2=normalize(vNormal[0]+vNormal[1]+vNormal[2]);
  40.                 if(dot(gFacetNormal,gFacetNormal2)<0.0)
  41.                 gFacetNormal=-gFacetNormal;
  42.                 //gFacetNormal=abs(gFacetNormal);
  43.                                 // Assign Positions
  44.                 float3 b003 = vPosition[0];
  45.                 float3 b030 = vPosition[1];
  46.                 float3 b300 = vPosition[2];
  47.                 // And Normals
  48.                 float3 n002 = vNormal[0];
  49.                 float3 n020 = vNormal[1];
  50.                 float3 n200 = vNormal[2];
  51.                         // Compute the cubic geometry control points
  52.                 // Edge control points
  53.                 b210[ID] = (2 * b003 + b030 - (dot(b030 - b003, n002) * n002)) / 3;
  54.                 b120[ID] = (2 * b030 + b003 - (dot(b003 - b030, n020) * n020)) / 3;
  55.                 b021[ID] = (2 * b030 + b300 - (dot(b300 - b030, n020) * n020)) / 3;
  56.                 b012[ID] = (2 * b300 + b030 - (dot(b030 - b300, n200) * n200)) / 3;
  57.                 b102[ID] = (2 * b300 + b003 - (dot(b003 - b300, n200) * n200)) / 3;
  58.                 b201[ID] = (2 * b003 + b300 - (dot(b300 - b003, n002) * n002)) / 3;
  59.                 // Center control point
  60.                 float3 e = (b210[ID] + b120[ID] + b021[ID] + b012[ID] + b102[ID] + b201[ID]) / 6;
  61.                 float3 v = (b003 + b030 + b300) / 3;
  62.                 b111[ID] =e+(e-v)*0.5 ;//mix(e, v, 0.5f);

  63.                 // Compute the quadratic normal control points, and rotate into world space
  64.                 float v12 = 2 * dot(b030 - b003, n002 + n020) / dot(b030 - b003, b030 - b003);
  65.                 n110[ID] = normalize(n002 + n020 - v12 * (b030 - b003));
  66.                 float v23 = 2 * dot(b300 - b030, n020 + n200) / dot(b300 - b030, b300 - b030);
  67.                 n011[ID] = normalize(n020 + n200 - v23 * (b300 - b030));
  68.                 float v31 = 2 * dot(b003 - b300, n200 + n002) / dot(b003 - b300, b003 - b300);
  69.                 n101[ID] = normalize(n200 + n002 - v31 * (b003 - b300));

  70.                 float DotN=dot(vNormal[0],vNormal[1])+dot(vNormal[2],vNormal[1]);
  71.                 if((dot(gFacetNormal,vec3(0.0,0.0,1.0))>0.0)&&(DotN<1.999))
  72.                 {
  73.                         gl_TessLevelInner[0] = TessLevel*min(1.0,10.0*abs(TessLevelSize.x));
  74.                         gl_TessLevelOuter[0] = TessLevel*min(1.0,10.0*abs(TessLevelSize.x));
  75.                         gl_TessLevelOuter[1] = TessLevel*min(1.0,10.0*abs(TessLevelSize.y));
  76.                         gl_TessLevelOuter[2] = TessLevel*min(1.0,10.0*abs(TessLevelSize.z));
  77.                 }
  78.                 else
  79.                 {
  80.                         gl_TessLevelInner[0] = 1;
  81.                         gl_TessLevelOuter[0] = 1;
  82.                         gl_TessLevelOuter[1] = 1;
  83.                         gl_TessLevelOuter[2] = 1;
  84.                 }
  85.                
  86.     }
  87. }


复制代码

作者: Sirlion    时间: 2011-8-30 20:41
从s1搬过来了?
作者: cloudol    时间: 2011-8-30 20:41
470 sli ts到64 稳定60无压力
作者: jackyangel    时间: 2011-8-30 20:41
论坛防复制,没法子黏贴啊
作者: oz01    时间: 2011-8-30 20:44
jackyangel 发表于 2011-8-30 20:41
论坛防复制,没法子黏贴啊

所以我特意用了代码模式
代码模式可以复制的
无论哪个论坛
作者: oz01    时间: 2011-8-30 20:45
Sirlion 发表于 2011-8-30 20:41
从s1搬过来了?

S1毕竟有DX11显卡的人还是不多
作者: jackyangel    时间: 2011-8-30 20:46
oz01 发表于 2011-8-30 20:44
所以我特意用了代码模式
代码模式可以复制的
无论哪个论坛

我黏贴出来就夹杂了一堆乱码了.........
作者: oz01    时间: 2011-8-30 20:46
cloudol 发表于 2011-8-30 20:41
470 sli ts到64 稳定60无压力

请问你替换我在9楼发的那个文件了吗?
作者: oz01    时间: 2011-8-30 20:47
jackyangel 发表于 2011-8-30 20:46
我黏贴出来就夹杂了一堆乱码了.........

我粘贴出来是正常的啊orz
作者: oz01    时间: 2011-8-30 20:49
看来只有发帖人自己才能复制粘贴orz
作者: jackyangel    时间: 2011-8-30 20:50
oz01 发表于 2011-8-30 20:46
请问你替换我在9楼发的那个文件了吗?

那个文件才显示下载了1次,应该就我下载了吧
作者: oz01    时间: 2011-8-30 20:52
jackyangel 发表于 2011-8-30 20:50
那个文件才显示下载了1次,应该就我下载了吧

470SLI如此强力?:funk:
64级TESS之后面数已经是天文数字了……
作者: cloudol    时间: 2011-8-30 20:52
oz01 发表于 2011-8-30 20:46
请问你替换我在9楼发的那个文件了吗?

替换了
作者: jackyangel    时间: 2011-8-30 20:57
oz01 发表于 2011-8-30 20:52
470SLI如此强力?
64级TESS之后面数已经是天文数字了……

哈哈,替换了就FPS就很正常了
作者: oz01    时间: 2011-8-30 20:57
cloudol 发表于 2011-8-30 20:52
替换了

果然
如果不替换的话
理论上64级tess就是2W*4^64个面……
作者: fish2fish    时间: 2011-8-30 21:03
额。。。我想说的是为什么不是蓝白条纹。。。{titter:]
作者: 乐极生悲    时间: 2011-8-30 21:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: oz01    时间: 2011-8-30 21:33
替换文件后试试看拉近镜头
作者: jackyangel    时间: 2011-8-30 21:48
oz01 发表于 2011-8-30 21:33
替换文件后试试看拉近镜头

如果老的那个文件的话,拉到和顶楼类似的角度和大小,还是60不变
作者: oz01    时间: 2011-8-30 22:05
jackyangel 发表于 2011-8-30 21:48
如果老的那个文件的话,拉到和顶楼类似的角度和大小,还是60不变

用新的文件
老的无论怎么折腾都不会有变化的
作者: jackyangel    时间: 2011-8-30 22:07
oz01 发表于 2011-8-30 22:05
用新的文件
老的无论怎么折腾都不会有变化的

新文件能不能再挂上来什么的,单纯复制又不行:mad:
作者: zidane1980    时间: 2011-8-30 22:32
oz01 发表于 2011-8-30 20:44
所以我特意用了代码模式
代码模式可以复制的
无论哪个论坛

这个论坛不行
作者: oz01    时间: 2011-8-30 22:56
jackyangel 发表于 2011-8-30 22:07
新文件能不能再挂上来什么的,单纯复制又不行

[attach]1616992[/attach]
作者: jackyangel    时间: 2011-8-30 23:05
oz01 发表于 2011-8-30 22:56

更新了这个,还是60哦
作者: voidshatter    时间: 2011-8-31 00:13
本帖最后由 voidshatter 于 2011-8-31 00:22 编辑

楼主这个程序太狠了,才开到10,就害得我的三路580 SLI跌破60并且全满载。(用的强制交替帧渲染1;如果不强开交替帧渲染的话,则是仅仅GPU1满载,帧数不变,可见SLI并未起到提速作用)

[attach]1617022[/attach]

[attach]1617023[/attach]

[attach]1617024[/attach]

[attach]1617025[/attach]

作者: voidshatter    时间: 2011-8-31 00:16
水手服居然还是半透明的,真邪恶,求视频下载
作者: zxl7288436    时间: 2011-8-31 10:35
看到LS的半透明水手服了,果断决定晚上回去就下载{titter:]
作者: oz01    时间: 2011-8-31 11:22
SLI要起作用,你还需要全屏运行这个程序……
作者: Edison    时间: 2011-8-31 12:01
替换后,GTS 450 也没啥压力:

[attach]1617295[/attach]
作者: cellwing    时间: 2011-8-31 15:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: Edison    时间: 2011-8-31 17:17
cellwing 发表于 2011-8-31 15:57
2630qm集显。启动报错openal缺失,能进入。开线框后跌到13fps
为啥我ts为1?

按“2”可以增加 tessellation factor。
作者: voidshatter    时间: 2011-8-31 17:22
oz01 发表于 2011-8-31 11:22
SLI要起作用,你还需要全屏运行这个程序……

SLI又不是CrossfireX非得全屏,很多游戏SLI都支持窗口的。。不过话说回来我没试过全屏启动这个demo效果如何,请问如何全屏启动啊?
作者: voidshatter    时间: 2011-8-31 17:23
Edison 发表于 2011-8-31 12:01
替换后,GTS 450 也没啥压力:

GTS 450真是神一般的存在{cry:]
作者: jackyangel    时间: 2011-8-31 19:41
voidshatter 发表于 2011-8-31 17:22
SLI又不是CrossfireX非得全屏,很多游戏SLI都支持窗口的。。不过话说回来我没试过全屏启动这个demo效果如 ...

文件夹里面有个gameset文件,修改isFullScreem=1就是全屏启动了。里面还有不少选项可以折腾一下,哈哈。
作者: blooddcl    时间: 2011-8-31 21:05
6950,64下,稳定在47fps+125%GPU。
不过的确是画面有破碎
作者: voidshatter    时间: 2011-8-31 21:38
全屏模式果然可以在“强制交替帧渲染1模式”下让SLI生效!但是N卡的曲面细分也太不给力了,1920x1200分辨率下,三张580才开到19就跌破60fps了,开到64只剩下6fps,看来NV的实力也不咋样嘛,需要多多加油了,等什么时候可以开64那一档都能维持60fps了,大家就可以不用贴图了,纯曲面细分的网格涂颜色就够了

[attach]1617711[/attach]

[attach]1617712[/attach]

[attach]1617713[/attach]

[attach]1617714[/attach]

[attach]1617715[/attach]

[attach]1617716[/attach]
作者: 蕉少    时间: 2011-8-31 21:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: cellwing    时间: 2011-8-31 21:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: oz01    时间: 2011-8-31 23:09
cellwing 发表于 2011-8-31 21:59
集显是dx10,理论上ts应为0.用1,2吧ts升到48,fps没变

不同的显卡情况不同,不过无论如何,DX10显卡肯定是无效的。。。
作者: oz01    时间: 2011-8-31 23:11
jackyangel 发表于 2011-8-31 19:41
文件夹里面有个gameset文件,修改isFullScreem=1就是全屏启动了。里面还有不少选项可以折腾一下,哈哈。

其他选项大多数都无效
包括AA

作者: oz01    时间: 2011-8-31 23:13
voidshatter 发表于 2011-8-31 21:38
全屏模式果然可以在“强制交替帧渲染1模式”下让SLI生效!但是N卡的曲面细分也太不给力了,1920x1200分辨率 ...

4的64次方倍三角形数……这颗是天文数字……
作者: voidshatter    时间: 2011-9-1 00:32
oz01 发表于 2011-8-31 23:13
4的64次方倍三角形数……这颗是天文数字……

那为啥那个GTS450能如此牛逼。。。求解释。。。
作者: kuroki    时间: 2011-9-1 00:48
这个要拉近的吧,拉近了帧数掉的厉害
作者: luckissy    时间: 2011-9-1 01:00
{titter:]E大发的衣服不透明啊
作者: swloveu    时间: 2011-9-1 10:25
强人这都能写出来
作者: recruitbj    时间: 2011-9-1 10:38
真强,碰到专业人仕了,学习
作者: Edison    时间: 2011-9-1 11:57
luckissy 发表于 2011-9-1 01:00
E大发的衣服不透明啊

:loveliness:

因为我的这个截图是在 wireframe 下抓的。
作者: Edison    时间: 2011-9-1 11:58
voidshatter 发表于 2011-9-1 00:32
那为啥那个GTS450能如此牛逼。。。求解释。。。

你没有替换文件或者替换的位置不对。

替换这个看看:
qm\data\shader\GLSL\SM5\Light.tc。
作者: 泯灭    时间: 2011-9-1 13:17
多久没见过这样的 技术贴了?
作者: oz01    时间: 2011-9-1 15:18
voidshatter 发表于 2011-9-1 00:32
那为啥那个GTS450能如此牛逼。。。求解释。。。

他用了我后来发的优化过的文件
作者: voidshatter    时间: 2011-9-1 20:23
原来如此。。替换之后就上四五百fps了无压力了

不过貌似如果不锁帧数的话,转动视角太快容易crash
作者: 结果    时间: 2011-9-1 20:27
oz01 发表于 2011-9-1 15:18
他用了我后来发的优化过的文件

孤岛也优化下{lol:]
作者: oz01    时间: 2011-9-1 23:54
结果 发表于 2011-9-1 20:27
孤岛也优化下

算法不同,没源代码大概没办法优化……就算优化了,画面大概也会出现大量小隙缝
作者: oz01    时间: 2011-9-1 23:56
voidshatter 发表于 2011-9-1 20:23
原来如此。。替换之后就上四五百fps了无压力了

不过貌似如果不锁帧数的话,转动视角太快容易crash

程序默认设置锁60
0不限制
如果不限制,也不开垂直同步
会导致显卡满负荷运转
也是你crash的主因

作者: zxl7288436    时间: 2011-9-2 11:21
距离不同帧数也不一样,拉到最近的话比远处会差好多




欢迎光临 POPPUR爱换 (https://we.poppur.com/) Powered by Discuz! X3.4