0

ジオメトリ シェーダーで出力を切り替える方法、具体的には次の 2 つの出力を見つけようとしています。

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

私は星団のレンダリングを行っており、ジオメトリ シェーダーで生成されたスプライトを使用して 100,000 個以上の星のデータセットを持っています。ただし、スプライトの「ハロー」は、ターゲットの星に近づいた場合にのみ表示されます。

ジオメトリ シェーダー

#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

}

最近、ジオメトリ シェーダーのストリームに遭遇しましたが、これが私のインスタンスでどのように行われるかを示す適切な例が見つかりません。

さらにコードを投稿する必要がある場合はお知らせください。

4

0 に答える 0