在openGL中设置统一参数的通用解决方案(C#)

时间:2014-04-13 19:02:43

标签: c# opengl generics opentk

我希望有一个通用的解决方案,通过openTK向着色器添加参数。 OpenTK通过SetUniform()提供不同类型参数(float,int,double ...)的实现。现在在我的程序中,我想做ShaderParam<T>(string name, params T[] values)之类的事情。不幸的是,我有两个问题。我认为没有很好的解决方案来存储ShaderParam的对象,我不确定将此转换为openTK界面的最优雅解决方案是什么。我不想做switch(typeof(T)),有更通用的方法吗?

2 个答案:

答案 0 :(得分:-1)

OpenTK api将c中的OpenGL api包装起来,不处理重载。 The wrapping is automated目前,它剥离了OpenGLTypes并创建了重载。

编辑:(特别是fidler)

重载是实现声明指向不同入口点的相同函数名,例如:

[AutoGenerated(Category = "ARB_shader_objects", Version = "", EntryPoint = "glUniform1ivARB")]
[CLSCompliant(false)]
public static void Uniform1(Int32 location, Int32 count, Int32[] value);

[AutoGenerated(Category = "ARB_shader_objects", Version = "", EntryPoint = "glUniform1fvARB")]
[CLSCompliant(false)]
public static unsafe void Uniform1(Int32 location, Int32 count, Single* value);

最优雅的方法是hack directly OpenTK并改进包装器生成器,剥离统一函数的数组和矩阵限定符。

答案 1 :(得分:-1)

OpenGL规范为每个统一类型提供different functionsglUniform[1234][fui][v]。实际上,这意味着switch(typeof(T))是由OpenGL的基本设计强制实施的。

然而,一切都没有丢失! OpenGL 3.1及更高版本包括Uniform Buffer Objects,允许您使用GL.BufferData<T>GL.MapBuffer上传制服。如果您能够满足OpenGL 3.1+的要求,UBO可以提供更清晰,更快速的代码。