Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 获取每个基元中的片段数_Opengl - Fatal编程技术网

Opengl 获取每个基元中的片段数

Opengl 获取每个基元中的片段数,opengl,Opengl,在对每个基本体(三角形)进行深度测试之前,有没有办法获得碎片(像素)的数量?我尝试使用opengl查询,但它们似乎非常慢 如果没有内置机制,我正在考虑使用一些图像存储或原子机制,但我没有这些功能的经验。如果这有帮助的话-我可以很容易地将基本体id放入片段着色器,因为我的基本体都不共享顶点。在深度测试之前需要片段计数吗?根本没有办法做到这一点。不一定 请参见,虽然规范规定深度测试发生在片段着色器之后,但运行复杂的FS可能会花费高昂的成本,因为它的结果会因为简单的测试而被丢弃。因此,“仿佛”规则允许

在对每个基本体(三角形)进行深度测试之前,有没有办法获得碎片(像素)的数量?我尝试使用opengl查询,但它们似乎非常慢

如果没有内置机制,我正在考虑使用一些图像存储或原子机制,但我没有这些功能的经验。如果这有帮助的话-我可以很容易地将基本体id放入片段着色器,因为我的基本体都不共享顶点。

在深度测试之前需要片段计数吗?根本没有办法做到这一点。不一定

请参见,虽然规范规定深度测试发生在片段着色器之后,但运行复杂的FS可能会花费高昂的成本,因为它的结果会因为简单的测试而被丢弃。因此,“仿佛”规则允许实现尝试这样做,前提是它们之间没有行为上的差异

然而,虽然有一种明确的机制来强制早期碎片测试,但没有一种反向机制来阻止早期测试。没有这些,你想要的是不可能的

现在,由于早期测试是一种“仿佛”优化,如果您的FS执行了一些需要在深度测试之前执行片段着色器的操作,那么您将强制实现不优化您的FS执行。问题是,唯一能保证这一点的行动是更改
gl_FragDepth
的值。深度测试需要考虑碎片着色器的
gl_FragDepth
值,因此深度测试必须在FS执行之后进行

问题是修改
gl_FragDepth
意味着更改生成的片段的深度,这可能不是您想要的。哦,当然,有可能只是拥有
gl_FragDepth=gl_FragCoord.zmain
函数顶部的code>足以让实现关闭早期测试。但是一个特别聪明的编译器可能会注意到,这个FS实际上保持了
gl_FragDepth
的值不变,因为它的默认值实际上是
gl_FragCoord.z
。因此,它仍可能得到早期测试

甚至像
gl_FragDepth=gl_FragCoord.z+0可以优化出来;毕竟,编译器可以看到您没有添加任何内容

如果您愿意假设编译器没有足够的智能来优化
gl_FragDepth=gl_FragCoord.z
或一些类似的构造,那么您可以使用现有的着色器功能制作所需的内容。您可以使用原子映像加载/存储或SSBO功能来增加片段计数器。Helper调用不执行这些操作,因此您不必担心这一点

如果你真的想要一个每个三角形/线/点的碎片计数,你可以使用
gl\u PrimitiveID
来确定你在哪个原语上。该值将从0开始增加,除非先前的顶点处理阶段对其进行了处理。如果存在几何体着色器,则未定义
gl_PrimitiveID
的值,除非GS为该图元向其写入值。细分着色器甚至可以丢弃基本体,这会影响片段着色器中隐式的
gl\u基本体id
的值


但是,如果你没有在这些阶段玩游戏,那么
gl\u PrimitiveID
将是一个合理的值。

这样一个简单地不反映正在发生的事情(或者通过测量它会改变正在发生的事情)的metirc有什么意义?请注意,深度测试不仅是早期的,但通常也是分层的——光栅化器不会提前在某些2D瓷砖中生成碎片,因为它知道这些碎片都不会通过深度测试——它甚至不知道如果不这样做,它会生成多少碎片,因为不必首先计算出优化的全部要点。