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,是否可以只将前向三角形发送到几何体着色器?我相信默认情况下,剔除只发生在几何体着色器之后发射的三角形上。是的,在古代的地震中,面部剔除是在CPU上使用每个三角形的简单点积来完成的。任何未通过测试的三角形都不包括在绘制的索引列表中 目前,这在大多数硬件上都不是一个可行的优化,但您仍然可以看到它不时地应用于专门的应用程序中。我见过很多这样的应用程序,其中一个是在批处理过程中使用PS3的Cell SPE剔除三角形,以节省PS3的RSX GPU上的顶点变换工作负载-请记住,PS3仍然使用基本着色器体系结

是否可以只将前向三角形发送到几何体着色器?我相信默认情况下,剔除只发生在几何体着色器之后发射的三角形上。

是的,在古代的地震中,面部剔除是在CPU上使用每个三角形的简单点积来完成的。任何未通过测试的三角形都不包括在绘制的索引列表中

目前,这在大多数硬件上都不是一个可行的优化,但您仍然可以看到它不时地应用于专门的应用程序中。我见过很多这样的应用程序,其中一个是在批处理过程中使用PS3的Cell SPE剔除三角形,以节省PS3的RSX GPU上的顶点变换工作负载-请记住,PS3仍然使用基本着色器体系结构,其中有固定数量的专用顶点着色器单元和片段着色器单元。平衡着色器工作负载在该GPU上很重要

不过,我可能没有抓住你问题的重点;您期望/希望从早期剔除原语中获得什么好处


更新: 我想说的是,在现代硬件和软件上,顶点变换/基本体组装通常不是瓶颈。如今,碎片处理的成本要高得多,因此在光栅化过程中剔除原语通常是您不得不担心性能问题的程度。PS3的RSX是一个特例,它的顶点性能非常差,并且CPU架构很难保持繁忙,因此将原始剔除工作卸载到CPU是有意义的

您仍然可以在CPU上的顶点着色器/细分/几何体着色器之前剔除三角形,但将每个三角形的法线存储在某个位置并传输一组新的索引以绘制每个帧很难明智地使用资源。与在GPU上处理三角形并让GL在光栅化过程中抛出后向基本体相比,您可能会花费更多的时间和内存来设置简化的三角形列表


至少有一个用例会出现在脑海中,这实际上仍然是一件有用的事情。我指的是镶嵌补丁。如果可以在细分发生之前在CPU上确定整个面片朝向错误的方向,则可以跳过在GPU上细分面片。现在,渲染通常不受顶点限制,但细分是一种可能的情况。

这实际上是可能的。就像前面提到的另一个答案一样,您可以在软件方面进行操作。但在顶点着色器和几何体着色器之间存在阶段。即外壳(可编程)、原语生成器(固定)和域(可编程)。在外壳着色器中,可以为面片指定细分级别

如果将这些级别中的任何一个设置为0.0,则面片将被丢弃,并且不会进入几何体着色器


希望这会有所帮助:)

尽管从技术上讲,由于三角形到达几何体着色器,因此无法满足此问题,但您可以在几何体着色器本身中剔除三角形。这可能是人们阅读这个问题所寻求的解决方案,它是为我

我使用下面的着色器实现了四元体的线框绘制和消隐,其中每个四元体使用两个三角形绘制。使用

glPolygonMode(GL_FRONT_AND_BACK, GL_LINES) 
“消隐”包括每个四边形的对角线,这是不需要的,因此我使用几何体着色器将每个三角形转换为两条线。但是,现在消隐不起作用,因为几何体着色器只发射线。取而代之的是,消隐包含在几何体着色器的开头,只需将均匀消隐设置为-1、0或1,以实现所需的行为(注意,此消隐测试假定每个顶点的w坐标为正)

#版本430核心
平面布置图(三角形);
布局(线带,最大顶点=3)输出;
均匀整数剔除;
void main()
{
//提前返回,在此执行剔除
mat3 M=mat3(gl_在[0].gl_Position.xyz,gl_在[1].gl_Position.xyz,gl_在[2].gl_Position.xyz);
if(剔除*行列式(M)<0)
{
EndPrimitive();//是否需要?
返回;
}
gl\u Position=gl\u在[0]中。gl\u Position;
发射顶点();
gl_Position=gl_in[1]。gl_Position;
发射顶点();
gl_Position=gl_in[2]。gl_Position;
发射顶点();
EndPrimitive();
}

我的意思是,在几何阶段之前,在GPU上可以在1次绘图调用中进行面剔除。但我想你有点含蓄地回答了,我想,这是不可能的。虽然我很好奇,如果你认为CPU淘汰在当今硬件上不是一个可行的优化,那么是什么呢?你的意思是说,最好不要剔除人脸,或者有某种类型的GPU通过剔除,与抽签呼叫分开;我相信我已经回答了你的大部分问题。也可以通过将W坐标设置为0来剔除顶点着色器中的顶点,但这实际上不是性能优化。在这种情况下,它可能没有意义,因为您需要知道顶点所属的基本体的法线。
#version 430 core

layout (triangles) in;
layout (line_strip, max_vertices=3) out;

uniform int culling;

void main()
{
    // Perform culling here with an early return
    mat3 M = mat3(gl_in[0].gl_Position.xyz, gl_in[1].gl_Position.xyz, gl_in[2].gl_Position.xyz);
    if(culling * determinant(M) < 0)
    {
        EndPrimitive();  // Necessary?
        return;
    }
    
    gl_Position = gl_in[0].gl_Position;
    EmitVertex();
    
    gl_Position = gl_in[1].gl_Position;
    EmitVertex();
    
    gl_Position = gl_in[2].gl_Position;
    EmitVertex();
    
    EndPrimitive();
}