c++ - 使用模板管理 glUniform 函数

标签 c++ templates opengl

再次嗨,欢迎来到另一个“如果我们将两件我真的不了解的事情结合起来会不会很棒”-问题;)

这一集:OpenGL 制服和 C++ 模板

想法:如果您可以编写一个模板函数来在 OpenGL 着色器中设置制服,那不是很好吗?

问题:着色器中的制服是使用许多 glUniform* 函数设置的。它们的不同之处在于:

  1. 类型:制服可以采用多种类型。这导致 OpenGL 中的不同函数名称看起来像:glUniform1f、glUniform1i、glUniform1fv 等。

    使用函数重载可以很容易地“统一”这些。但这会产生大量类似的函数。

    第一个问题:这个地方可以用模板吗?据我了解模板,您必须专门针对每个新功能。最后,您将拥有与简单重载相同数量的函数。

  2. 参数个数:glUniform函数中的个数是指给定参数的个数。有 1 到 4 个参数与简单值相关,最多包含 4 个元素的 vector 。

    第二个问题:是否可以使用模板实现“动态”参数计数?

  3. 矩阵:让事情变得复杂的是另一类发送矩阵的统一函数,但由于我并没有真正使用它们,所以我对它们并不真正感兴趣。

可能没有真正的方法来简化统一方法......但也许有人可以使用强大的模板想出一个很好的解决方案?

亲切的问候, 弗洛里安

最佳答案

1 :是的,是的,但至少当编译器提示它无法在 float 和 double 重载之间进行选择时,你可以非常简单地强制他,即 setUniform<float>(blah)而不是 setUniform(blah)

2:这次重载是一个更简单的解决方案:)

3:问题是什么?

问题是,你为什么要做这样的事情?

关于c++ - 使用模板管理 glUniform 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3386687/

相关文章:

opengl - OpenCL 和 OpenGL SL 有 "undefined behaviour"吗?

c++ - QT c++ 画点 qpainter qgraphicsscene

c++ - 运行 WinForm 的函数 "In Background"(VS2010 c++)

c++ - 将来尝试引用已删除的函数

c++模板函数参数推导和函数解析

c++ - 无法在屏幕上绘制正方形(相同的宽度和高度)

c++ - ROS C++ 项目 "include"文件夹?

c++ - 随机数生成器 C++ 动态数组

html - 电子邮件模板 HTML 从 ul 中删除元素符号点

c++ - 编写支持 OpenGL 的 GUI