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裁剪是否放弃不可见的原语? 我在C++中编写了简单的OpenGL程序,它渲染了许多纹理立方体(大约100000),并有一些照明效果(基于Phan-model)。_C++_Opengl_Shader - Fatal编程技术网

为什么';OpenGL裁剪是否放弃不可见的原语? 我在C++中编写了简单的OpenGL程序,它渲染了许多纹理立方体(大约100000),并有一些照明效果(基于Phan-model)。

为什么';OpenGL裁剪是否放弃不可见的原语? 我在C++中编写了简单的OpenGL程序,它渲染了许多纹理立方体(大约100000),并有一些照明效果(基于Phan-model)。,c++,opengl,shader,C++,Opengl,Shader,当我将相机移动到看不见任何东西的位置(所有立方体都在相机后面)时,我得到19 FPS。然而,当我将片段着色器替换为基本体着色器(只返回固定颜色)并以所有立方体(或至少大部分立方体)都可见的方式移动摄影机时,我得到28 FPS,这要多得多 在我看来,应该是相反的,因为在第一种情况下,片段着色器根本不应该使用(因为顶点和片段着色器阶段之间的剪切阶段),而在第二种情况下,片段着色器必须运行多次 我的思维方式正确吗?或者这个功能必须被启用或者类似的东西 我在KDE Neon 5.13上使用OpenGL

当我将相机移动到看不见任何东西的位置(所有立方体都在相机后面)时,我得到19 FPS。然而,当我将片段着色器替换为基本体着色器(只返回固定颜色)并以所有立方体(或至少大部分立方体)都可见的方式移动摄影机时,我得到28 FPS,这要多得多

在我看来,应该是相反的,因为在第一种情况下,片段着色器根本不应该使用(因为顶点和片段着色器阶段之间的剪切阶段),而在第二种情况下,片段着色器必须运行多次

我的思维方式正确吗?或者这个功能必须被启用或者类似的东西

我在KDE Neon 5.13上使用OpenGL 3.3核心配置文件
我的图形卡是Radeon HD3470(带有Mesa OpenGL实现)

编辑(更多测量值):
具有高级着色器的可见立方体:每秒15.5帧。
具有基本着色器的可见立方体:每秒28-30帧。
带有Advadec着色器的不可见立方体:每秒18帧。

使用基本着色器的不可见立方体:36 FPS。

如果没有更多信息,很难说,例如,在查看所有照亮的立方体以及不查看标准立方体时,最好了解帧率。如果我不得不猜测这可能与剪辑有关,因为在离屏幕很远的情况下,剪辑非常昂贵(无法利用保护带剪辑等功能),而调用大量片段着色器则“昂贵”,这也是一个非常可并行化的任务,GPU对此没有问题。但是你检查过第一种情况下的像素着色器是否执行了吗?您确定这不是非图形代码故障吗?事实上,你应该分析一下你的应用程序以了解到底发生了什么。奇怪的是,引入不同的片段着色器会导致如此巨大的性能差异,即使在没有绘制任何内容的情况下,我怀疑这更像@VTT在这一点上所说的,可能是CPU端的一些代码导致了这些问题,例如根据您的操作方式上传照明信息。如果不完全了解您的管道是如何构造的,或者发生了什么,仍然很难说。您是否在其他PC/驱动程序/硬件上尝试过这种方法?也可能是Mesa实现不太在意,只是调用着色器而实际上不需要。剪裁根本不可见的几何体(剔除或可见曲面确定)是程序的责任,而不是OpenGL实现的责任。没有一个具有复杂场景的OpenGL程序会单独使用深度缓冲区来完成此任务。使用某种场景图进行空间分割,只发送部分或完全可见的立方体。