Opengl 顶点着色器中的边界框

Opengl 顶点着色器中的边界框,opengl,vertex-shader,Opengl,Vertex Shader,目前,我有一个简单的着色器,可以将静态网格渲染到场景中。我想知道是否有可能在我的顶点着色器中有第二个输出,该输出在应用投影后为我的对象提供2D边界框。大概是这样的: #version 330 core in vec4 Vertex_ms; in vec4 Normal_ms; out vec4 Normal_ws; uniform mat4 Proj; uniform mat4 View; uniform mat4 Model; uniform out vec2 topRight; un

目前,我有一个简单的着色器,可以将静态网格渲染到场景中。我想知道是否有可能在我的顶点着色器中有第二个输出,该输出在应用投影后为我的对象提供2D边界框。大概是这样的:

#version 330 core

in vec4 Vertex_ms;
in vec4 Normal_ms;

out vec4 Normal_ws;

uniform mat4 Proj;
uniform mat4 View;
uniform mat4 Model;

uniform out vec2 topRight;
uniform out vec2 bottomLeft;

void main() {
    gl_Position = Proj * View * Model * Vertex_ms;
    topRight = max(gl_Position.xy, topRight);
    bottomLeft = min(gl_Position.xy, bottomLeft);

    Normal_ws = Model * Normal_ms;
}

这不起作用,因为我无法编写制服,但目的是,我可以对projectet顶点进行缩减,以获得一个边界框。

OpenGL-4.3向GLSL添加了一些允许实现这一点的函数,即所有以
原子…
开头的函数。当然,这些都需要具有OpenGL-4.3功能的实现,即最新一代的GPU

对你最有用的是和


但是,请注意,使用这些会带来严重的性能惩罚。更好的解决方案是提前计算边界体积,然后对其进行变换。如果您正在考虑可变形网格,请记住,对于任何给定的变形,这些网格将保持在特定的边界内。

OpenGL-4.3在GLSL中添加了一些允许实现这一点的函数,即所有以
原子…
开头的函数。当然,这些都需要具有OpenGL-4.3功能的实现,即最新一代的GPU

对你最有用的是和


但是,请注意,使用这些会带来严重的性能惩罚。更好的解决方案是提前计算边界体积,然后对其进行变换。如果您正在考虑可变形网格,请记住,对于任何给定的变形,这些网格将保持在特定的边界内。

好的,谢谢您提供的信息。你知道我是否可能使用一个变换反馈缓冲区来写出我的投影坐标,然后在缓冲区上使用reduce操作来获得我的边界坐标吗?当然可以实现。但这也是GPU效率极低的任务之一。GPU是多对多机器,其中每个输入数据元组产生一个输出数据元组。减少是一个多对少的操作,在这类任务中,GPU的性能通常优于常规CPU。在您的情况下,一个优化的解决方案肯定是可能的,因为对于n个顶点,只需要进行log2(n)比较,这实际上可以并行化。但老实说,我真的很想看看,如果做BB计算真的必须实时完成,或者如果它可以离线完成。非常感谢你,我会接受你的答案。顺便说一句,我真正的问题不是关于边界框,它们只是简单得多的解释。好的,谢谢你提供的信息。你知道我是否可能使用一个变换反馈缓冲区来写出我的投影坐标,然后在缓冲区上使用reduce操作来获得我的边界坐标吗?当然可以实现。但这也是GPU效率极低的任务之一。GPU是多对多机器,其中每个输入数据元组产生一个输出数据元组。减少是一个多对少的操作,在这类任务中,GPU的性能通常优于常规CPU。在您的情况下,一个优化的解决方案肯定是可能的,因为对于n个顶点,只需要进行log2(n)比较,这实际上可以并行化。但老实说,我真的很想看看,如果做BB计算真的必须实时完成,或者如果它可以离线完成。非常感谢你,我会接受你的答案。顺便说一句,我真正的问题不是关于边界框,它们只是简单得多的解释。