我正在实现Oikonomidis et al., 2011中提出的姿态估计算法,其中涉及在
在我的实现设置阶段,我使用OpenGL视口数组来定义
上述论文的作者发布了一个技术报告,描述了他们的一些GPU加速方法,但它并不详细,无法回答我的问题。第3.2.3节说:“在几何实例化期间,视口信息被附加到每个顶点...自定义像素着色器剪裁在其预定义视口之外的像素”。这听起来与我上面描述的解决方法类似,但他们使用的是Direct3D,所以很难比较他们在2011年使用Direct3D能够实现的成果与我今天在OpenGL中能够实现的成果。
我意识到,对我的问题唯一明确的答案是实施这个解决方法并测量其性能,但目前这只是一个低优先级的好奇心,我没有在其他地方找到答案,所以我希望更有经验的GLSL用户能够提供节省时间的智慧。
N
个不同的假设姿势下渲染网格(N
可能约为64)。第2.5节建议使用实例化加速计算,同时生成多个渲染(之后将每个渲染缩减为GPU上的单个数字),从他们的描述中可以得知,他们找到了一种同时生成N
个渲染的方法。在我的实现设置阶段,我使用OpenGL视口数组来定义
GL_MAX_VIEWPORTS
视口。然后在渲染阶段,我将一个GL_MAX_VIEWPORTS
模型-姿势矩阵数组传输到GPU内存中的mat4
uniform
数组中(我只关心位置和方向),并在我的几何着色器中使用gl_InvocationID
来选择网格的每个多边形所需的适当姿势矩阵和视口。
GL_MAX_VIEWPORTS
在我的机器上是16(我有一台GeForce GTX Titan),所以这种方法将允许我一次在GPU上渲染多达16个假设。这可能足够快,但我仍然对以下内容感到好奇:
是否存在一个解决GL_MAX_VIEWPORTS
限制的方法,比调用我的渲染函数ceil(double(N)/GL_MX_VIEWPORTS)
次更快?
我只是几周前开始学习基于着色器的OpenGL方法,所以我还不知道所有的技巧。最初,我想用内置视口支持的组合来替换它:
- 一个几何着色器,在透视投影后将
h*gl_InvocationID
添加到顶点的y
坐标,并将gl_InvocationID
传递到片段着色器;和 - 一个片段着色器,使用
y
坐标来丢弃
符合y<gl_InvocationID*h || y>=(gl_InvocationID+1)*h
条件的片段。
discard
会对性能产生很大的影响而放弃了进一步研究这个想法。上述论文的作者发布了一个技术报告,描述了他们的一些GPU加速方法,但它并不详细,无法回答我的问题。第3.2.3节说:“在几何实例化期间,视口信息被附加到每个顶点...自定义像素着色器剪裁在其预定义视口之外的像素”。这听起来与我上面描述的解决方法类似,但他们使用的是Direct3D,所以很难比较他们在2011年使用Direct3D能够实现的成果与我今天在OpenGL中能够实现的成果。
我意识到,对我的问题唯一明确的答案是实施这个解决方法并测量其性能,但目前这只是一个低优先级的好奇心,我没有在其他地方找到答案,所以我希望更有经验的GLSL用户能够提供节省时间的智慧。
glViewport
的参数)从一个"视口"到另一个"视口"是否真正发生了变化?根据你算法的简要描述,我认为它们并没有发生变化。 - Nicol Bolas