3 纹理样式集.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3 纹理样式集

GameRes游戏开发资源网 栅格地形渲染 张嘉华 (Email:newzjh@126.com,QQ:188318005,blog:/javazjh) 华南理工大学计算机学院 摘要:本文专门探讨了适合战棋类(SLG)游戏的三维地形栅格化渲染策略。 图1:栅格地形效果 1 框架   图2是一个栅格(tile)的定义,栅格的纹理样式和颜色都定义在中心采样点上,对于输入256×256的原始地形,就有256×256个栅格,对于每个栅格由四个子区域(sub rect)组成。每个子区域由4个顶点构成,由于每个子区域每层的纹理坐标有差别,后文会详细介绍原因,因此不采用Shader难以实现每个栅格只采用3×3个顶点,因此,先介绍每个子区域2×2个顶点,共2×2×4=16个顶点。对于一个256×256原始采样点的图来说,那么就需要256×256×16个顶点,比普通的只贴一层纹理的顶点刚好多了16倍顶点数量。 图2:1个栅格(Tile)的定义 2. 纹理融合 为了实现栅格间的纹理融合,下面来推导栅格上每个顶点的纹理比例。对于浅黄色子区域(8-9-10-11),参见图3,实质上是采样点A-B-D-E所构成的区域的右下角,因此顶点9的纹理为t9=(A+B+D+E)/4,Wi为四维向量,分别代表影响该子区域的四种类型纹理的权重,其分量顺序对应每个子区域的纹理样式编码,均为左下,左上,右下,右上,实际编码将在后文讨论,类似可以得到下面的: 图3:某个栅格与其邻接栅格示意图 为了在GPU能自动计算上述式子,我们作进一步推导,假设栅格坐标如图4,栅格内顶点像素范围取值从-0.5至0.5,取u1=floor(u),u2=ceil(u),v1=floor(v),v2=ceil(v),那么对于栅格内任意一个像素,影响其的四个栅格(采样点)分别为(i+u1,j+v1),(i+u2,j+v1),(i+u1,j+v2),(i+u2,j+v2),对于如图4,假设像素处于右下角子区域,那么则u1=0,u2=1,v1=-1,v2=0,影响它的四个栅格,也就是提供它融合权重的四个采样点分别为(i+0,j-1),(i+1,j-1),(i+0,j+0),(i+1,j+0)。接着计算混合比例u’=fmod(u,1.0f),v’=fmod(v,1.0f),即对1.0求浮点模,那么栅格内任意点(u,v)的颜色和比例可以通过如下双线性插值计算得到: 具体实现时,颜色的双线性插值可以由GPU完成,计算好每个顶点的颜色即可,纹理的双线性插值由于需要根据不同纹理坐标采样了再进行插值,因此可以在Vertex Shader根据顶点在栅格内坐标计算四个层次的纹理坐标,在Pixel Shader对四个纹理层次进行纹理采样(Sample),然后对双线性插值公式得到的权重进行组合得到纹理颜色。 图4:逐像素纹理混合 3. 纹理样式集 为了减少纹理上下文的切换,上文所设计的顶点组织方案适合把各种样图纹理组合到一张大的纹理集上,本文采用2048×2048的大纹理作为纹理集来存放16×16=256张样式纹理,图4是一张16×16组合的纹理集。每个样式图纹理大小为64×64个像素。 图4:16×16纹理集组合 4. 顶点定义 下面定义具体的每个顶点结构: struct GTileVertex { public: float3 position;//位置 float3 normal; //法向量 DWORD color0; //颜色 float2 xy; //栅格内的单位化位置比例,TexCoord0 float2 uv0; //第0种纹理的坐标,TexCoord1 float2 uv1; //第1种纹理的坐标,TexCoord2 float2 uv2; //第2种纹理的坐标,TexCoord3 float2 uv3; //第3种纹理的坐标,TexCoord4 float4 weight; //上面四种纹理在该顶点的权重,TexCoord5 }; 设E采样点(ix,iy)对应的栅格纹理为texture(ix,iy),颜色为color(ix,iy),则E栅格左下角区域0-3顶点的值如下: V0.color0=(color(ix,iy)+color(ix-1,iy)+color(ix,iy-1)+color(ix-1,iy-1))/4; V0.xy=(0.0f,0.0f) V0.uv0=texture(ix-1,iy-1)在0点的纹理坐标 V0.uv1=texture(ix-1,iy)在0点的纹理坐标 V0.uv2=texture(ix,iy-1)在0点的纹理坐标 V0.uv3=texture(ix,iy)在0点的纹理坐

您可能关注的文档

文档评论(0)

zhuwo + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档