您的位置:首页 > 运维架构

opengl tessellation 举例

2017-05-05 00:22 381 查看
#include <sb7.h>

class tessellatedtri_app : public sb7::application

{

    void init()

    {

        static const char title[] = "OpenGL SuperBible - Tessellated Triangle";

        sb7::application::init();

        memcpy(info.title, title, sizeof(title));

    }

    virtual void startup()

    {

        static const char * vs_source[] =

        {

            "#version 410 core                                                 \n"

            "                                                                  \n"

            "void main(void)                                                   \n"

            "{                                                                 \n"

            "    const vec4 vertices[] = vec4[](vec4( 0.25, -0.25, 0.5, 1.0),  \n"

            "                                   vec4(-0.25, -0.25, 0.5, 1.0),  \n"

            "                                   vec4( 0.25,  0.25, 0.5, 1.0)); \n"

            "                                                                  \n"

            "    gl_Position = vertices[gl_VertexID];                          \n"

            "}                                                                 \n"

        };

        static const char * tcs_source[] =

        {

            "#version 410 core                                                                 \n"

            "                                                                                  \n"

            "layout (vertices = 3) out;                                                        \n"

            "                                                                                  \n"

            "void main(void)                                                                   \n"

            "{                                                                                 \n"

            "    if (gl_InvocationID == 0)                                                     \n"

  
4000
          "    {                                                                             \n"

            "        gl_TessLevelInner[0] = 5.0;                                               \n"

            "        gl_TessLevelOuter[0] = 5.0;                                               \n"

            "        gl_TessLevelOuter[1] = 5.0;                                               \n"

            "        gl_TessLevelOuter[2] = 5.0;                                               \n"

            "    }                                                                             \n"

            "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;     \n"

            "}                                                                                 \n"

        };

        static const char * tes_source[] =

        {

            "#version 410 core                                                                 \n"

            "                                                                                  \n"

            "layout (triangles, equal_spacing, cw) in;                                         \n"

            "                                                                                  \n"

            "void main(void)                                                                   \n"

            "{                                                                                 \n"

            "    gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) +                       \n"

            "                  (gl_TessCoord.y * gl_in[1].gl_Position) +                       \n"

            "                  (gl_TessCoord.z * gl_in[2].gl_Position);                        \n"

            "}                                                                                 \n"

        };

        static const char * fs_source[] =

        {

            "#version 410 core                                                 \n"

            "                                                                  \n"

            "out vec4 color;                                                   \n"

            "                                                                  \n"

            "void main(void)                                                   \n"

            "{                                                                 \n"

            "    color = vec4(0.0, 0.8, 1.0, 1.0);                             \n"

            "}                                                                 \n"

        };

        program = glCreateProgram();

        GLuint vs = glCreateShader(GL_VERTEX_SHADER);

        glShaderSource(vs, 1, vs_source, NULL);

        glCompileShader(vs);

        GLuint tcs = glCreateShader(GL_TESS_CONTROL_SHADER);

        glShaderSource(tcs, 1, tcs_source, NULL);

        glCompileShader(tcs);

        GLuint tes = glCreateShader(GL_TESS_EVALUATION_SHADER);

        glShaderSource(tes, 1, tes_source, NULL);

        glCompileShader(tes);

        GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);

        glShaderSource(fs, 1, fs_source, NULL);

        glCompileShader(fs);

        glAttachShader(program, vs);

        glAttachShader(program, tcs);

        glAttachShader(program, tes);

        glAttachShader(program, fs);

        glLinkProgram(program);

        glGenVertexArrays(1, &vao);

        glBindVertexArray(vao);

        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

    }

    virtual void render(double currentTime)

    {

        static const GLfloat green[] = { 0.0f, 0.25f, 0.0f, 1.0f };

        glClearBufferfv(GL_COLOR, 0, green);

        glUseProgram(program);

        glDrawArrays(GL_PATCHES, 0, 3);

    }

    virtual void shutdown()

    {

        glDeleteVertexArrays(1, &vao);

        glDeleteProgram(program);

    }

private:

    GLuint          program;

    GLuint          vao;

};

DECLARE_MAIN(tessellatedtri_app)

生成的图形如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: