opengl tessellation 举例

xiaoxiao2021-02-27  133

#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"             "    {                                                                             \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)

生成的图形如下所示:

转载请注明原文地址: https://www.6miu.com/read-12520.html

最新回复(0)