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个假设。