笔记:OpenGL SuperBible - First Triangle

来源:互联网 发布:java免费视频教程 编辑:程序博客网 时间:2024/05/21 08:55

 gl_VertexID:

  • the index of the vertex that is being processed at the time, a special input to the vertex shader.
  • The gl_VertexIDinput starts counting from the value given by the1st para ofglDrawArrays()and counts upwards one vertex at a time forcountvertices (the 3rd para of glDrawArrays()
  • built-in variable.
  • We can use this index to assign adifferent position to each vertex 

#version 430 corevoid main(void) {                // Declare a hard-coded array of positionsconst vec4 vertices[3] = vec4[3](vec4( 0.25, -0.25, 0.5, 1.0), vec4(-0.25, -0.25, 0.5, 1.0),vec4( 0.25, 0.25, 0.5, 1.0));                // Index into our array using gl_VertexID                gl_Position = vertices[gl_VertexID];            }

modify our rendering function to passGL_TRIANGLEStoglDrawArrays()instead ofGL_POINTS:

// Our rendering functionvoid render(double currentTime) {const GLfloat color[] = { 0.0f, 0.2f, 0.0f, 1.0f }; glClearBufferfv(GL_COLOR, 0, color);        // Use the program object we created earlier for rendering        glUseProgram(rendering_program);        // Draw one triangle        glDrawArrays(GL_TRIANGLES, 0, 3);    }

REFERENCE: Ch1, OpenGL SB 6th


附:

P.S. 原本按照教材上的代码,编译是通过的,但是图形始终没有显示。于是考虑应为shader那里的问题。在学习之前运行教材配备的代码时,就遇到这个情况,有一些程序能够正常运行,有一些则没有任何显示。于是我再去看了可以正确显示结果的代码,发现它们的那个OpenGL版本是写到version 410而非430(430那些的都无法正确运行)。因此,我将version 430 改为410 就OK了。

GLuint compile_shaders(void){    GLuint vertex_shader;    GLuint fragment_shader;    GLuint program;    // Source code for vertex shader    static const GLchar * vertex_shader_source[] = {        "#version 410 core \n"        " \n"        "void main(void) \n"        "{ \n"            "const vec4 vertices[3] = vec4[3](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"        //"    gl_Position = vec4(0.0, 0.0, 0.5, 1.0);        \n"        "      gl_Position = vertices[gl_VertexID]; \n"        "} \n"    };    // Source code for fragment shader    static const GLchar * fragment_shader_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"    };        // Create and compile vertex shader    vertex_shader = glCreateShader(GL_VERTEX_SHADER);    glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);    glCompileShader(vertex_shader);        // Create and compile fragment shader    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);    glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);    glCompileShader(fragment_shader);        // Create program, attach shaders to it, and link it    program = glCreateProgram();    glAttachShader(program, vertex_shader);    glAttachShader(program, fragment_shader);    glLinkProgram(program);        // Delete the shaders as the program has them now    glDeleteShader(vertex_shader);    glDeleteShader(fragment_shader);        return program;}
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;"><pre name="code" class="cpp">...    // Our rendering function    void render(double currentTime) {        const GLfloat color[] = { 0.0f, 0.2f, 0.0f, 1.0f };        glClearBufferfv(GL_COLOR, 0, color);        // Use the program object we created earlier for rendering        glUseProgram(rendering_program);        // Draw one triangle        glDrawArrays(GL_TRIANGLES, 0, 3);    }
...


0 0
原创粉丝点击