スポンサーリンク

GLSLを試す (9) Geometry Shader(3)- 頂点一つから三角形を生成

C++側(シェーダの設定)

前回のプログラムからプログラムのリンクの部分だけを以下のように書き換える。

https://suzulang.com/glsl-9-geometry-shader-1

//! @brief プログラムのリンクを行う(geometryシェーダ使用時)。
//! @details ジオメトリシェーダがある場合はglLinkProgramの前に設定を行わなければいけない。
//! 別に関数を用意した方がわかりやすいのでここではこれを使う
GLSLCompileCond link_program_with_geometry(
    GLuint* ProgramID,
    GLuint vertexShaderID,
    GLuint geometryShaderID,
    GLuint fragmentShaderID,
    std::string* error = nullptr) {

    GLint Result = GL_FALSE;
    int InfoLogLength;

    ////////////////////////////////////////
    // プログラムをリンクします。
    *ProgramID = glCreateProgram();

    glAttachShader(*ProgramID, vertexShaderID);
    glAttachShader(*ProgramID, geometryShaderID);
    glAttachShader(*ProgramID, fragmentShaderID);


    ////////////////////////////////////////
    // ジオメトリシェーダを使うときの設定をここでする
    // この作業は glAttachShaderとglLinkProgramの間に入れる
    glProgramParameteri(*ProgramID, GL_GEOMETRY_VERTICES_OUT, 3);//ジオメトリシェーダからの最大出力頂点数
    glProgramParameteri(*ProgramID, GL_GEOMETRY_INPUT_TYPE, GL_POINTS);//ジオメトリシェーダには頂点が入力される
    //glProgramParameteri(*ProgramID, GL_GEOMETRY_OUTPUT_TYPE, GL_POINTS);
    glProgramParameteri(*ProgramID, GL_GEOMETRY_OUTPUT_TYPE, GL_TRIANGLE_STRIP);

    glLinkProgram(*ProgramID);

    ////////////////////////////////////////
    // プログラムをチェックします。
    glGetProgramiv(*ProgramID, GL_LINK_STATUS, &Result);
    glGetProgramiv(*ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> ProgramErrorMessage((std::max)(InfoLogLength, int(1)));
    glGetProgramInfoLog(*ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);

    if (error) {
        *error = &ProgramErrorMessage[0];

        return GLSLCompileCond::LINK_ERROR;
    }

    return GLSLCompileCond::SUCCESS;
}

Geometry Shader

#version 460

layout (points) in; //入力は頂点単位
layout (triangle_strip) out; //出力も頂点単位

layout (max_vertices = 3) out;

//geometry shaderへの入力は配列で受け取らなければいけない
//ただし名前はvertex shader側のoutと一致させる
in vec4 vertexColor[]; 

// 出力は普通。名前はfragment shader側のinと一致させる
out vec4 vColor;

void main()
{
    // 第一頂点
    gl_Position = gl_in[0].gl_Position;
    vColor = vertexColor[0];
    EmitVertex();   
    // 第二頂点
    gl_Position = gl_in[0].gl_Position;
    gl_Position.x += 0.2;
    vColor = vertexColor[0]*0.5;
    EmitVertex();
    // 第三頂点
    gl_Position = gl_in[0].gl_Position;
    gl_Position.x += 0.2;
    gl_Position.y += 0.2;
    vColor = vertexColor[0]*0.2;
    EmitVertex();
    EndPrimitive();
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: