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

问题描述 投票:0回答:1

因此,我有一个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.0f,0.0f},0.75f,true};
shader.Uniform(object);
c++ templates opengl glsl shader
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.