对于OpenGL着色器,您将如何用C ++编写一个接受所有类型的统一函数?

所以说我有一个Shader类,我想拥有一个Uniform函数,该函数将传递给我的数据传递给加载的Shader程序

class Shader{
   unsigned int programid;
   template<typename Type>
   void Uniform(unsigned int location,Type object){
       //Some logic that passes the type data to the uniform using glUniform[?]()
   }
}

我将如何编写Uniform函数(使用C ++中的模板)以接受任何类型(原始OR对象)并将其传递给Shader?

示例:

GLSL:uniform float Amount; C ++:shader.Uniform(somefloat);

GLSL:uniform vec3 Position;

C ++:

template<typename Type,size_t Size>
Vector{ Type data[Size]; }

Vector<float,3> position = {0.0f,1.0f,1.0f}
shader.Uniform(position);

GLSL:

struct Light
{
  vec3 position;
  vec4 rotation;
  float luminosity;
  bool status;
};

uniform Light object;

C ++:

struct Light {
  Vector<float,3> position;
  Vector<float,4> rotation;
  float luminosity;
  bool status;
}
Light object = {{1.0f,0.0f,0.0f},{0.0f,0.75f,true};
shader.Uniform(object);
wzqzl 回答:对于OpenGL着色器,您将如何用C ++编写一个接受所有类型的统一函数?

首先,C ++和GLSL是静态类型的语言,而不是像JavaScript或Python这样的动态类型。因此,没有写任何接受任何类型的C ++函数的实际方法。 C ++模板函数的作用本质上是文本替换。每当C ++编译器看到所使用的模板(例如“ Vector”)时,它都会使用原始模板声明并制作一个新副本,其中“ Type”和“ Size”分别替换为“ float”和“ 3”。然后编译器会生成一个唯一的错误名称,以防止链接器错误,例如__Vector_TypeFOO_SizeBAR ...

(出于完整性考虑,是的,可以在C / C ++中使用联合和/或指针强制转换来实现您自己的动态类型。但是由于您无法在GLSL中进行任何操作,因此无助于解决问题。

因此,由于GLSL没有模板来进行文本替换,因此您必须自己实现它。从文件或其他加载着色器的源。在将其传递给glCompileShader之前,请使用您喜欢的字符串处理库将实际的字符串插入占位符文本。

例如,在着色器中,您可以编写如下内容:

if (arr.Length > 0) { /* do something with the array */ }

您的主程序会执行类似的操作

<TYPE><SIZE> position;

希望这会有所帮助。

本文链接:https://www.f2er.com/3099882.html

大家都在问