社区首页 >问答首页 >在SceneKit中,如何在保持绘制调用最小化的同时,在不同大小的对象上平铺纹理?

在SceneKit中,如何在保持绘制调用最小化的同时,在不同大小的对象上平铺纹理?
EN

Stack Overflow用户
提问于 2020-10-08 15:29:47
回答 1查看 62关注 0票数 0

为了在SceneKit场景中提高性能/fps,我希望最小化绘制调用的数量。场景包含一个程序生成的城市,我为它生成了随机高度的房屋(每个SCNBox),并用一个相同的、重复的立面纹理来平铺它们,如下所示:

应用纹理的正确方法如下所示:

代码语言:javascript
代码运行次数:0
复制
let material = SCNMaterial()
material.diffuse.contents = image
material.diffuse.wrapS = SCNWrapMode.repeat
material.diffuse.wrapT = SCNWrapMode.repeat
buildingGeometry.firstMaterial = material

这是可行的。但正如所写的那样,它将材料拉伸以适合盒子表面的大小。要调整纹理大小以保持纵横比,需要添加以下代码:

代码语言:javascript
代码运行次数:0
复制
material.diffuse.contentsTransform = SCNMatrix4MakeScale(sx, sy, sz)

其中,sxsysz是从几何体中的面的大小导出的适当比例因子。这也是可行的。

但后一种方法意味着每个节点都需要一个自定义材质,这反过来意味着我不能对所有房屋重用单个材质,这又意味着每个节点都需要一个额外的绘制调用。

有没有一种方法可以使用单一的纹理材质来平铺所有的房屋(而不拉伸纹理)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-08 16:53:22

使用表面着色器修改器(SCNShaderModifierEntryPointSurface)可以基于scn_node.boundingBox修改_surface.diffuseTexcoord

由于边界框是动态馈送到着色器的,因此所有对象都将使用相同的着色器,并将受益于实例化(减少绘制调用的次数)。

SCNShadable.h头文件中有更多详细信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64265826

复制
相关文章
文档片段(createDocumentFragment)
1.createDocumentFragment var one = document.getElementById("one"); var k = document.createDocumentFragment(); var p = document.createElement("p"); p.innerHTML = "我们不一样"; k.appendChild(p); one.appendChild(k) console.log(k) //文档里没
天天_哥
2018/09/29
5220
[linux][c/c++]代码片段01
#include <stdio.h> #include <unistd.h> void usage() { printf("Usage:\n"); printf("\tOptDemo [-a] [-b] [-c message]"); } int main(int argc, char *argv[]) { int o; const char *optstring = "abc::"; // 有三个选项-abc,其中c选项后有两个冒号,表示后面可选参数 whi
landv
2019/11/10
6760
[linux][c/c++]代码片段02
 gcc `pkg-config --cflags gtk+-3.0` -o example-1 example-1.c `pkg-config --libs gtk+-3.0`
landv
2019/11/11
4970
[linux][c/c++]代码片段02
php代码片段
获取文件后缀
lilugirl
2019/05/26
4K0
Vue.js 中的片段
为了使诸如屏幕阅读器之类的辅助技术能够解释网页和应用程序,无障碍支持是必需的。为了使这些技术起作用,开发人员需要考虑可访问性。
疯狂的技术宅
2020/01/14
2.7K0
Vue.js 中的片段
实战:从 Redux 中的代码片段中应用柯里化!
本文通译自:JavaScript Currying: A Practical Example
掘金安东尼
2022/09/19
9840
MarkDown常用代码片段和工具
markdwon可以支持Html代码,所以很多原生markdown没有的功能,就可以用Html写了。
sean.liu
2022/08/03
3150
HTML代码片段
IE条件注释 <!--[ifIE6]> IE6版本有效 <![endif]--> <!--[if gt IE6]> IE6以上版本有效 <![endif]--> <!--[if gte IE6]> IE6(包含)及以上版本有效 <![endif]--> <!--[if lt IE8]> IE8以下版本有效 <![endif]--> <!--[if lte IE8]> IE8(包含)及以下版本有效 <![endif]--> <!--[if !IE]>--> 除了IE <![endif]--> 用Chrome或
前端GoGoGo
2018/08/27
5.3K0
VSCode 添加用户代码片段,自定义用户代码片段
在使用 VScode 开发中经常会有一些重复使用的代码块,复制粘贴也很麻烦,这时可以在 VScode 中添加用户代码片段,输入简写即可快捷输入。
Cell
2023/09/15
1K0
VSCode 添加用户代码片段,自定义用户代码片段
CSS代码片段
见 https://css-tricks.com/snippets/css/media-queries-for-standard-devices/
前端GoGoGo
2018/08/27
9080
Spring代码片段
配置springmvc核心控制器DispatcherServlet web.xml
小锋学长生活大爆炸
2020/11/24
6640
Spring代码片段
1049. 数列的片段和(20)
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 这10个片段。
AI那点小事
2020/04/20
3290
1049. 数列的片段和(20)
【PAT乙级】数列的片段和
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
4020
nodejs常用代码片段
调用:node index.js --target test 接收:const config=loadConifg(['target'],'--') //config.target----->test
易墨
2018/09/14
8840
Shell脚本常用片段
shell脚本时不时就要用到,但是一些常用的片段却没有记住,这里整理一个笔记 常用片段 普通 文件所在目录 CUR_DIR="$(dirname $0)" 基本每个脚本都要用到,否则脚本执行的时候就容易受到当前目录的影响,可能出现执行结果不一致 if-elif-fi if condition; then commands; elif condition; then commands; fi 时间相关 当前时间 date +%Y%m%d%H%M%S 纪元秒 # 纪元秒,方便用来实现
十毛
2019/03/27
8560
Python 代码片段总结
生成的pyc可以跨平台使用,但是只能这样用python xxx.pyc,而不能使用./xxx.pyc执行,因为缺少了shebang的支持,不过貌似Binfmt_misc可以解决这个问题,ubuntu下apt-get install binfmt-support可以直接安装。
老高的技术博客
2022/12/28
6120
Python 代码片段总结
Lua代码片段收集
Lua实现闭包 --[[@Func :实现闭包 @Desc : 当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征我们称作词法定界]] function fuck() local i = 0 return function() i = i + 1 return i end end c1 = fuck() print(c1()) print(c1()) 序列化Lua表 -- Desc : 序列化Lua表(Co
晚晴幽草轩轩主
2018/03/27
9480
1049 数列的片段和 (20 分)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
韩旭051
2019/11/08
4730
golang代码片段(摘抄)
用户1141560
2017/12/22
7490
golang代码片段(摘抄)
如何快速创建 Visual Studio 代码片段?
使用 Visual Studio 的代码片段功能,我们可以快速根据已有模板创建出大量常用的代码出来。ReSharper 已经自带了一份非常好用的代码片段工具,不过使用 ReSharper 创建出来的代码片段只能用在 ReSharper 插件中。如果团队当中有一些小伙伴没有 ReSharper(毕竟很贵),那么也可以使用到 Visual Studio 原生的代码片段。
walterlv
2023/10/22
4700
如何快速创建 Visual Studio 代码片段?

相似问题

socialengine与外部php网站集成

21

与外部系统集成

30

Facebook与外部网站的集成

20

JIRA与外部系统的集成

12

OpenERP (Odoo)与外部系统的集成

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文