POPPUR爱换

 找回密码
 注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

搜索
查看: 6943|回复: 67
打印 上一主题 下一主题

关于曲面细分,我写了个demo,求测试

[复制链接]
跳转到指定楼层
1#
发表于 2011-8-30 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 oz01 于 2011-8-30 13:52 编辑

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


数字键1和2分别是降低和提升曲面细分倍率上限
空格键开关框架模式
PageUP和PageDn控制视角远近,方向键控制视角方向
如果Tess后面的数字为0则表示没能成功开启曲面细分
如果你用的是DX11显卡却不能运行,或者细分倍率不可调整,请安装最新的WHQL驱动

似乎A卡比较新的驱动会导致破面
我用HD5750 10.7版驱动没问题,很多人用11.8有问题

实际细分倍率是经过优化的,背面和平面不细分,拉远距离细分倍率自动降低

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
2#
发表于 2011-8-30 13:53 | 只看该作者
赞啊,难道是k-on里面的人物?

ACG技术宅。。。
回复 支持 反对

使用道具 举报

3#
发表于 2011-8-30 14:22 | 只看该作者
楼主的 A 卡驱动面板 tessellation 倍率是 AMD 优化模式还是程序自选模式?

GTS 450 275.33:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

4#
 楼主| 发表于 2011-8-30 15:16 | 只看该作者
Edison 发表于 2011-8-30 14:22
楼主的 A 卡驱动面板 tessellation 倍率是 AMD 优化模式还是程序自选模式?

GTS 450 275.33:

可能我表达有误,优化模式是不变的,无论任何DX11显卡都一样
回复 支持 反对

使用道具 举报

乐极生悲 该用户已被删除
5#
发表于 2011-8-30 18:36 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

6#
发表于 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
再往上调就没意思了
回复 支持 反对

使用道具 举报

7#
发表于 2011-8-30 19:30 | 只看该作者
oz01 发表于 2011-8-30 15:16
可能我表达有误,优化模式是不变的,无论任何DX11显卡都一样

你可以看看,tessellation factor(?) 都是 4 的情况下,我用 GTS 450 跑出来的 wireframe 密度远远高于你的测试。
回复 支持 反对

使用道具 举报

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

是的,T4的效果和你的一样,接近的放大比例,看上去已经呈现点状了
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2011-8-30 20:21 | 只看该作者
抱歉有个文件发错了
把附件解压缩替换同名文件
在\data\shader\GLSL\SM5

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

10#
 楼主| 发表于 2011-8-30 20:23 | 只看该作者
另外想请问jackyangel同学是啥显卡这么强力
我的hd5750 1GB版到4就不行了……
回复 支持 反对

使用道具 举报

11#
发表于 2011-8-30 20:26 | 只看该作者
oz01 发表于 2011-8-30 20:23
另外想请问jackyangel同学是啥显卡这么强力
我的hd5750 1GB版到4就不行了……

GTX580啊,既然你这个跑TS的,就开高一点试试了
回复 支持 反对

使用道具 举报

12#
 楼主| 发表于 2011-8-30 20:28 | 只看该作者
果然……
新上传的文件请试试看吧
回复 支持 反对

使用道具 举报

13#
发表于 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%
回复 支持 反对

使用道具 举报

14#
 楼主| 发表于 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. }


复制代码
回复 支持 反对

使用道具 举报

15#
发表于 2011-8-30 20:41 | 只看该作者
从s1搬过来了?
回复 支持 反对

使用道具 举报

16#
发表于 2011-8-30 20:41 | 只看该作者
470 sli ts到64 稳定60无压力
回复 支持 反对

使用道具 举报

17#
发表于 2011-8-30 20:41 | 只看该作者
论坛防复制,没法子黏贴啊
回复 支持 反对

使用道具 举报

18#
 楼主| 发表于 2011-8-30 20:44 | 只看该作者
jackyangel 发表于 2011-8-30 20:41
论坛防复制,没法子黏贴啊

所以我特意用了代码模式
代码模式可以复制的
无论哪个论坛
回复 支持 反对

使用道具 举报

19#
 楼主| 发表于 2011-8-30 20:45 | 只看该作者
Sirlion 发表于 2011-8-30 20:41
从s1搬过来了?

S1毕竟有DX11显卡的人还是不多
回复 支持 反对

使用道具 举报

20#
发表于 2011-8-30 20:46 | 只看该作者
oz01 发表于 2011-8-30 20:44
所以我特意用了代码模式
代码模式可以复制的
无论哪个论坛

我黏贴出来就夹杂了一堆乱码了.........
回复 支持 反对

使用道具 举报

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

本版积分规则

广告投放或合作|网站地图|处罚通告|

GMT+8, 2025-2-6 05:51

Powered by Discuz! X3.4

© 2001-2017 POPPUR.

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