Opengl 有没有一种有效的方法可以超越GL_MAX_视口?
我目前正在实现中提出的姿势估计算法,该算法涉及在不同的假设姿势中渲染网格(Opengl 有没有一种有效的方法可以超越GL_MAX_视口?,opengl,graphics,glsl,shader,viewport,Opengl,Graphics,Glsl,Shader,Viewport,我目前正在实现中提出的姿势估计算法,该算法涉及在不同的假设姿势中渲染网格(N可能约为64)。第2.5节建议通过使用实例同时生成多个渲染来加快计算速度(之后,它们会将GPU上的每个渲染减少到一个数字),从它们的描述来看,它们似乎找到了一种同时生成N渲染的方法 在我的实现的设置阶段,我使用OpenGL视口数组定义GL\u MAX\u视口视口。然后在渲染阶段,我将GL\u MAX\u视口的数组model pose矩阵传输到GPU内存中的mat4uniform数组(我只对估计位置和方向感兴趣),并在“我
N
可能约为64)。第2.5节建议通过使用实例同时生成多个渲染来加快计算速度(之后,它们会将GPU上的每个渲染减少到一个数字),从它们的描述来看,它们似乎找到了一种同时生成N
渲染的方法
在我的实现的设置阶段,我使用OpenGL视口数组定义GL\u MAX\u视口
视口。然后在渲染阶段,我将GL\u MAX\u视口的数组
model pose矩阵传输到GPU内存中的mat4
uniform数组(我只对估计位置和方向感兴趣),并在“我的几何体着色器”中使用gl\u InvocationID
,为网格的每个多边形选择适当的姿势矩阵和视口
GL_MAX_视口
在我的机器上是16个(我有一个GeForce GTX Titan),因此此方法允许我在GPU上一次渲染多达16个假设。这可能足够快,但我仍然对以下几点感到好奇:
对于GL\u MAX\u视口
限制是否有一个解决方法,该方法可能比调用我的渲染函数ceil(双(N)/GL\u MX\u视口)
次更快?
几周前我才开始学习OpenGL中基于着色器的方法,所以我还不知道所有的技巧。我最初考虑将内置视口支持的使用替换为以下组合:
h
是所需的视口高度)将h*gl\u调用id
添加到顶点的y
坐标中,并将gl\u调用id
传递到片段着色器上;及y=(gl\u InvocationID+1)*h
的y
坐标丢弃s片段
丢弃
会对性能造成极大的损害,我推迟了进一步研究这个想法
上面这篇文章的作者发表了一篇文章,描述了他们的一些GPU加速方法,但不够详细,无法回答我的问题。第3.2.3节说“在几何体实例化期间,视口信息附加到每个顶点……自定义像素着色器将剪辑其预定义视口之外的像素”。这听起来类似于我上面描述的解决方法,但他们使用的是Direct3D,所以很难将他们在2011年实现的功能与我今天在OpenGL中实现的功能进行比较
我意识到,对我的问题唯一确定的答案是实施变通方法并衡量其性能,但目前这是一个低优先级的问题,我在其他任何地方都找不到答案,因此我希望更有经验的GLSL用户能够提供他们节省时间的智慧。粗略地看一下这篇文章,在我看来,这一点并没有改变。也就是说,您仍在以相同的深度范围渲染到相同的宽度/高度和X/Y位置 您需要的是更改要渲染到的图像。这就是
gl\u层
的用途;更改附加到要渲染到的帧缓冲区的图像分层阵列中的哪一层
因此,只需将所有顶点的gl_ViewportIndex
设置为0即可。或者更具体地说,根本不要设置它
数量不一定是一个限制;那是你的选择。GS调用可以将多个原语写入不同的层。因此,您可以让每个实例编写,例如,4个基本体,每个基本体到4个单独的层
您唯一的限制应该是可以使用的层的数量(由
GL\u MAX\u ARRAY\u TEXTURE\u layers
和GL\u MAX\u FRAMEBUFFER\u layers
控制,两者都必须至少为2048),以及单个GS调用可以发射的基本体和顶点数据的数量(即)(也就是说,glViewport
)的参数实际上从“viewport”变为“viewport”?从对算法的粗略描述来看,我认为不会。感谢您的建议!花了一段时间才弄清楚如何渲染到纹理数组的深度附件中,然后读取结果以验证它是否有效(我不得不从使用glReadPixels
切换到glGetTextureImage
)。不幸的是,限制远没有GL\u MAX\u ARRAY\u TEXTURE\u LAYERS
那么高,因为您只能创建MAX\u GEOMETRY\u SHADER\u调用
GEOMETRY SHADER实例,在我的机器上是32个。但这仍然比GL\u MAX\u视口
限制好,所以我接受了您的答案。技术的第3.2.3节我在回答中提到的al报告称为“多视口剪裁”,所以看起来很明显,他们确实并行渲染到了不同的视口中。他们是使用内置视口支持还是使用discard
模拟视口还不清楚,他们是否真的能够同时渲染所有假设的问题也不清楚。@Ose:GS调用不是一个限制;请参阅我的answer、 哦,说得好,我将编写多个原语!再次感谢您的帮助!我遇到了另一个限制:可用制服的数量()。我需要一个N
mat4
s数组(每个假设一个),以及一个额外的投影矩阵mat4
,但我的机器不允许我定义超过128个mat4
制服。这个问题建议使用统一缓冲区对象来解决这个问题:。但我可能不需要超过127个假设。