管理3D资源(特别是采样器)

时间:2012-03-28 21:38:38

标签: opengl resources

我有一个关于如何组织图形资源/对象的问题。我正在使用AssImp从3D Studio导入场景。目前我正在将AssImp结构处理成我自己的,所以我可以比AssImp更快地将它们流入和流出磁盘。无论如何,我也在处理场景材料,这给了我一套选择,我不太清楚如何最好地处理。

我有以下材料类:

材料

包含环境,漫反射颜色,镜面反射等等,还包含一组地图,数组中的每个插槽都是“通道”(即插槽0始终是环境贴图,插槽1漫反射,插槽2光泽等等。)

地图

地图的一个实例,包含诸如环绕模式和指向纹理对象的指针之类的参数。

纹理

OpenGL纹理贴图。

取样

OpenGL采样器对象。

现在我很想知道我将如何为材料中的任何给定地图配置采样器。从技术上讲,每个地图可以有不同的采样器参数。例如,采样器可以具有UV包裹模式,最小和最大滤波器以及各向异性。其中一些参数在场景中定义(换行模式),其他参数定义为引擎参数(滤波,各向异性)。

我正在考虑的是每个地图创建一个采样器对象(不是每个纹理,请记住,地图指向纹理)。然后,当我渲染一个具有地图X的材质的对象时,它会自动将采样器中的地图X绑定到任何一个通道。因为有可能会有成千上万的地图,我想知道相应的数千个采样器是不是一个好主意。

另一种方法是将采样器添加到我的资源字典中,以便任何碰巧具有相同参数的地图共享它们。

有没有人对如何最好地管理这样的事情有意见?

1 个答案:

答案 0 :(得分:1)

这真的不是一个难题。

您有多少种不同的采样器?如果您的过滤是一个全局概念,那么采样器之间的主要区别将是包装模式。包装(S,T,R)和4种可能的包装类型有三个维度(CLAMP_TO_EDGE,CLAMP_TO_BORDER,REPEAT和MIRROR_REPEAT)。这将为您提供总共... 12种可能用于正常事物的采样器。

CLAMP_TO_BORDER需要边框颜色,因此需要一个独特的采样器对象(除非许多纹理共享相同的边框颜色,这不是不合理的。黑色是一种流行的选择)。如果你正在进行深度比较采样,那么你需要更多的采样器对象。

所以只需要一个可以从中请求采样器的采样器对象管理器。你给它一些参数,它反过来一个采样器。它既可以是存在的采样器,也可以是它为您创建的采样器。如果你需要一个独特的(边框颜色),那么你可以要求给你一个独特的。否则,如果两个人要求使用相同的采样器,那么他们就会得到相同的采样器。