我一直在查看几个 webgl 示例。考虑 MDN's tutorial .他们的顶点着色器将顶点乘以透视矩阵和世界位置矩阵:
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
但是 uMVMatrix 本身是在一些矩阵库的帮助下用 javascript 计算的几个变换(平移、旋转等)的产物。
直接在着色器中计算他们的乘积似乎会更快;这肯定比在 .js 中做更快。他们选择这种方法有什么原因吗?
现在,我想您可以通过这种方式以任意顺序堆叠任意数量的转换,这样更加灵活。但是说不需要灵 active ,是否有任何理由避免直接在着色器中进行变换?有点像
gl_Position = uPMatrix * uRotationMatrix * uScaleMatrix * uTranslationMatrix * vec4(aVertexPosition, 1.0);
e: 要添加一些上下文,在我的特定情况下,我将只渲染 2D 矩形实体(主要是 Sprite ),因此顶点数将始终仅为 4。
考虑到引入一个库来进行快速 .js 矩阵乘法的开销,似乎将这些计算插入着色器绝对是我个人案例的方法。
(另外,即使它在平衡方面比在 javascript 中慢,将计算分流到 GPU 本身可能是值得的!)
最佳答案
这取决于....
如果您在着色器中执行此操作,则它会针对每个顶点(顶点着色器)或每个像素(片段着色器)完成。即使是 GPU 也没有无限的速度,所以假设您正在绘制 100 万个顶点。很可能在 JavaScript 中进行 1 组矩阵数学计算与在 GPU 中进行 100 万次矩阵计算,JavaScript 将获胜。
当然你的里程数可能会很高。每个 GPU 都是不同的。一些 GPU 比其他 GPU 更快。一些驱动程序在 CPU 上进行顶点计算。有些 CPU 比其他的更快。
你可以测试,不幸的是,因为你是为网络编写的,你不知道用户正在运行什么浏览器,也不知道 CPU 速度或 GPU 或驱动程序等。所以,这真的取决于。
最重要的是,将矩阵传递给着色器也是一种非自由操作。换句话说,调用 gl.uniformMatrix4fv 一次比您在示例中显示的 4 次更快。如果您要绘制 3000 个对象,您必须测试 12000 次调用 gl.uniformMatrix4fv(每次调用 4 个矩阵)是否明显慢于调用 3000 次(每次调用 1 个矩阵)。
此外,浏览器团队正在努力通过 JavaScript 更快地对矩阵进行数学运算,并努力使其更接近 C/C++。
我想这意味着除了测试之外没有正确的答案,而且每个平台/浏览器/gpu/驱动程序/cpu 的结果都会不同。
关于javascript - 最好在 javascript 或着色器中乘以矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20984554/
点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度; 在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。
在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
随着ruby被引入为新的编程救世主,我想知道是否有人基于易用性、运行所需的资源、可用性和易定制性而有偏好。两者有更好的吗? 最佳答案 好吧,任何基于Rails的社交网络应用程序的比较都应该包括insoshi(http://portal.insoshi.com/)。话虽这么说,这三个都非常相似,区别在于实现细节。Lovd和Insoshi都是完整的Rails应用程序;它旨在供您将它们用作入门工具包,并使用您自己的自定义功能对其进行扩展。另一方面,CommunityEngine是一个Rails插件。这意味着您可以更轻松地向现有Rail
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如
我有一个正在开发的命令行Ruby应用程序,我想允许它的用户提供将在部分过程中作为过滤器运行的代码。基本上,应用程序是这样做的:读入一些数据如果指定了过滤器,则使用它来过滤数据处理数据我希望过滤过程(第2步)尽可能灵活。我的想法是,用户可以提供一个Ruby文件,该文件设置一个已知常量以指向实现我定义的接口(interface)的对象,例如:#user'sfilterclassMyFilterdefdo_filter(array_to_filter)filtered_array=Array.new#domyfilteringonarray_to_filterfiltered_arrayen
出于某种原因,我必须为Firefox禁用javascript(手动,我们按照提到的步骤执行http://support.mozilla.org/en-US/kb/javascript-settings-for-interactive-web-pages#w_enabling-and-disabling-javascript)。使用Ruby的SeleniumWebDriver如何实现这一点? 最佳答案 是的,这是可能的。而是另一种方式。您首先需要查看链接Selenium::WebDriver::Firefox::Profile#[]=