Opengl 几何体着色器GLSL的条件输出

Opengl 几何体着色器GLSL的条件输出,opengl,glsl,vbo,opengl-4,geometry-shader,Opengl,Glsl,Vbo,Opengl 4,Geometry Shader,我试图找出如何在几何体着色器中切换输出,特别是以下两种输出: layout(points, max_vertices = 1) out; // OUTPUT 1 layout(triangle_strip, max_vertices = 4) out; // OUTPUT 2 我正在对星团进行渲染,并使用几何体着色器中生成的精灵创建了一个包含100000多颗恒星的数据集。但是,只有当我们靠近目标恒星时,精灵的“光晕”才会出现 几何体着色器 #version 440 cons

我试图找出如何在几何体着色器中切换输出,特别是以下两种输出:

layout(points, max_vertices = 1) out;          // OUTPUT 1
layout(triangle_strip, max_vertices = 4) out;  // OUTPUT 2
我正在对星团进行渲染,并使用几何体着色器中生成的精灵创建了一个包含100000多颗恒星的数据集。但是,只有当我们靠近目标恒星时,精灵的“光晕”才会出现

几何体着色器

#version 440
const vec2 corners[4] = { 
    vec2(0.0, 1.0), 
    vec2(0.0, 0.0), 
    vec2(1.0, 1.0), 
    vec2(1.0, 0.0) 
};

layout(points) in;
layout(points, max_vertices = 1) out;
//layout(triangle_strip, max_vertices = 4) out;

uniform vec4 campos;

float spriteSize = 0.000005; // set here for now.
out vec2 texCoord;

void main(){
    float distToPoint = 1; //(1.f/((length(gl_in[0].gl_Position - campos)) ));

    if(distToPoint == 1){ // dumb condition just to illustrate my point
    // EMIT QUAD
        for(int i=0; i<4; ++i){
            vec4 pos    = gl_in[0].gl_Position;                 
            pos.xy     += spriteSize *(corners[i] - vec2(0.5)); 
            gl_Position = pos;                                  
            texCoord    = corners[i];                           
            EmitVertex();
        }
        EndPrimitive();
    }else{ 
    // EMIT POINT
        gl_Position = gl_in[0].gl_Position;
        EmitVertex();
        EndPrimitive();
    }
}
void main(void){
    ... // First I do a bunch of depth computation, irrelevant to this question
    gl_FragDepth = depth;

   // Here I want to switch between these two outputs! 

    //diffuse = texture2D(texture1, texCoord); // OUTPUT 1
   diffuse = vec4(Color, 1.0);                 // OUTPUT 2

}
我最近遇到了几何体着色器的,但在我的实例中找不到一个合适的例子来说明如何做到这一点


如果需要发布更多代码,请告诉我。

您无法切换几何体着色器中发出的基本体类型
ARB_transform_feedback3
允许您在变换反馈时设置多个输出流,但输出到VBO,唯一的输出模式是points。@ColonelThirtyTwo-那么我唯一的选择就是使用单独的着色器了?不过,肯定有比这更优雅的解决方案,对吗?^另外,是否可以只使用两个不同的几何体着色器并在运行时切换它们?怎么用?(顶点和片段着色器始终相同)是的,必须使用两个几何体着色器,并通过绘制调用指定哪个几何体指向哪个着色器,或者只是不在着色器中发射几何体。我想它可以让你在不同的程序中重用着色器对象,但我还没有用过。还请记住,可以将多个“文件”指定给
glShaderSource
,这样就不必在着色器之间重复代码。