我希望有一个通用的解决方案,通过openTK向着色器添加参数。 OpenTK通过SetUniform()
提供不同类型参数(float,int,double ...)的实现。现在在我的程序中,我想做ShaderParam<T>(string name, params T[] values)
之类的事情。不幸的是,我有两个问题。我认为没有很好的解决方案来存储ShaderParam的对象,我不确定将此转换为openTK界面的最优雅解决方案是什么。我不想做switch(typeof(T))
,有更通用的方法吗?
答案 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 functions:glUniform[1234][fui][v]
。实际上,这意味着switch(typeof(T))
是由OpenGL的基本设计强制实施的。
GL.BufferData<T>
或GL.MapBuffer
上传制服。如果您能够满足OpenGL 3.1+的要求,UBO可以提供更清晰,更快速的代码。