- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是签名。
glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
glUniform4fv(GLint location, GLsizei count, const GLfloat *v);
以我的愚见,前者应该更快,因为值可以直接从寄存器传递,而不需要从内存中获取。不过,我想听听很多意见。
最佳答案
虽然 *v
变体主要用于设置数组类型的统一,但 OpenGL 规范明确允许您使用数组变体来设置标量值:使用一数。
让我引用一下 OpenGL 规范(强调我自己添加的):
The commands glUniform{1|2|3|4}{f|i}v can be used to modify a single uniform variable or a uniform variable array. These commands pass a count and a pointer to the values to be loaded into a uniform variable or a uniform variable array. A count of 1 should be used if modifying the value of a single uniform variable, and a count of 1 or greater can be used to modify an entire array or part of an array.
这来自OpenGL 2.1 Spec ,但是对于 OpenGL 4.2 Spec 来说它读起来是一样的。 .
实际上,反过来也是允许的。假设您有一套 vec3 v[2]
类型的制服,并且您使用 glGetUniformLocation()
查询其位置,它可能会返回 6
。这意味着 6
实际上是 v[0]
的位置。
这很难说。它们可能同样快,或者其中一个可能比另一个更快,这非常依赖于实现。实际上,我希望大多数实现都在另一种之上实现其中一种。
例如考虑以下代码:
void glUniform1f ( GLint location, GLfloat v0 ) {
glUniform1fv(location, 1, &v0);
}
在这种情况下,数组变体会更快。但是,以下变体也是可能的:
void glUniform1fv ( GLint location, GLsizei count, GLfloat * value ) {
int i;
for (i = 0; i < count; i++) {
glUniform1f(location, *value);
value++;
location++;
}
}
在这种情况下,非数组变体会更快。
就我个人而言,我会说(这只是我个人的观点)早期的 OpenGL 实现可能已经使用非数组变体实现了数组变体,因为这是更简单的实现,在整个其余部分几乎没有任何其他修改OpenGL 库。另一方面,它的实现速度也慢得多,因为它涉及现代图形适配器很可能不需要的循环,因此现代实现很可能在数组变体之上实现非数组变体。
阵列变体还有其他优点。考虑以下函数:
struct v3 {
GLfloat x;
GLfloat y;
GLfloat z;
};
void setUniform ( GLint location, struct v3 * vPtr ) {
glUniform3f(location, vPtr->x, vPtr->y, vPtr->z);
}
仅仅为了调用非数组函数而取消引用 vPtr 三次是相当愚蠢的,并且几乎没有比以下实现更快的:
void setUniform ( GLint location, struct v3 * vPtr ) {
glUniform3fv(location, 1, (const GLfloat *)vPtr);
}
此外,所有数组变体始终只有三个参数,而其他变体最多可以有五个参数。当这些参数通过堆栈而不是在寄存器中传递时,需要传递给函数的参数越多,函数调用本身的速度就越慢。对于具有混合调用方案的架构,函数调用具有的参数越多,这些参数在寄存器内传递的可能性就越小。因此,根据普通 CPU 上的纯函数调用开销,对带有少量参数的函数的调用通常比对带有许多参数的函数的调用要快,尽管只有当您执行数千次调用时,这种差异才会产生影响。其次,对于统一值通常不是这种情况。
关于optimization - 考虑到所有类型的优化,glUniform4f/glUniform4fv 更快是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3642468/
当我调用 glUniform2fv 时到底会发生什么? 它是同步复制传递的缓冲区还是只是接受指针并稍后使用该数据?它保留缓冲区吗? 换句话说:在函数中传递本地创建的或非保留的缓冲区是否安全,或者由我来
我接到了一项任务,要将一个简单的电子表格转换为要在网站上使用的 HTML 表单,该任务将使用 JavaScript 进行一些计算。这根本没问题,除非我对财务功能一无所知,而且我遇到了 FV( futu
我负责表单的验证。我使用 BootstrapValidator v0.4.5 库。我想触发“success.form.fv”事件来发送表单数据。 有人可以帮我修复这段代码以进入处理程序并查看警报吗?
我正在尝试计算客户的终生值(value)。假设一位新客户每年支付 10 万美元并保留 5 年。让我们以 10% 的利率对 future 几年的付款进行折扣。 这是手动计算: Year 1 $
我想知道下面的命令到底是什么意思?? rm -fv csf.tgz 我输入这个命令作为在我的 virtualmin 上安装 csf 的第一步,但我不知道确切的含义。我刚刚复制并粘贴了它。 最佳答案 r
我正在将一些相当复杂的计算从 Excel 电子表格转换为 PHP。我卡在 Excel 的 FV 函数的转换上,它是这样定义的: FV( interest_rate, number_payments,
我是一名优秀的程序员,十分优秀!