c++ - OpenGL 统一函数 - 为什么这么多?

标签 c++ opengl glsl shader uniform

为什么设置Uniforms的函数那么多?

glUniform1f    glUniform2f    glUniform3f    glUniform4f
glUniform1fv   glUniform2fv   glUniform3fv   glUniform4fv
glUniform1i    glUniform2i    glUniform3i    glUniform4i
glUniform1iv   glUniform2iv   glUniform3iv   glUniform4iv
glUniform1ui   glUniform2ui   glUniform3ui   glUniform4ui
glUniform1uiv  glUniform2uiv  glUniform3uiv  glUniform4uiv

glUniformMatrix2fv  glUniformMatrix2x3fv  glUniformMatrix2x4fv
glUniformMatrix3fv  glUniformMatrix3x2fv  glUniformMatrix3x4fv
glUniformMatrix4fv  glUniformMatrix4x2fv  glUniformMatrix4x3fv

我认为数据上传到顶点和元素缓冲区的方式更好,因为我不必为不同的类型调用不同的函数。 为什么 uniform 会出现这种情况?有没有可能只使用一个函数,我可以只传递一个指针?

最佳答案

后见之明总是 20/20,做出选择是为了与其他采用各种类型和维度的 vector 数据的函数保持一致。我指的是 glVertex ……当然。现在按值传递的最初原因是,在某些体系结构上,周围有足够的寄存器,这样在寄存器中按值传递更有效。编译器还可以优化前面的操作以在正确的寄存器中结束正确的值。

OpenGL 是 IrixGL 的后代,由 SGI 为其图形工作站和 Irix 操作系统开发。这些工作站使用了 MIPS 架构。 MIPS 的调用约定是 ( https://en.wikipedia.org/wiki/Calling_convention#MIPS )

The most commonly used[5] calling convention for 32 bit MIPS is the O32[6] ABI which passes the first four arguments to a function in the registers $a0-$a3; …

The N32 and N64 ABIs pass the first eight arguments to a function in the registers $a0-$a7; …

现在您已经知道了:在 MIPS 上,按值传递 vec4 元素实际上是一个非常明智的选择。特别是在没有顶点数组的 IrixGL 和 OpenGL-1.0 中,您必须进行大量的 glVertex 调用。

关于c++ - OpenGL 统一函数 - 为什么这么多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38456694/

相关文章:

使用 GL_LINE_STRIP 的 OpenGL 正交草图绘制

OpenGL 可编程管线点光源

three.js - 如何在three.js中实现这个shadertoy?

GLSL 自旋锁永不终止

c++ - 具有重叠固定相机的 OpenCV Stitcher 类

c++ - 如何从 STL 容器中获取只能 move 的类型?

c++ - wxTextCtrl 改变值

opengl - 在 OpenGL 中结合顶点数组和纹理

c++ - OpenGL光照

c++ - vector 中存储的表达式的惰性求值