笔记:OpenGL SuperBible - First Triangle

这篇博客介绍了在OpenGL中使用顶点着色器的内置变量gl_VertexID来处理每个顶点的索引,从而为每个顶点赋予不同的位置。作者在尝试绘制三角形时遇到显示问题,发现是因为GLSL版本的问题。将版本从430改为410后,代码成功运行并显示了预期的图形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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 core
void main(void) {
                // Declare a hard-coded array of positions
const 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_TRIANGLESto glDrawArrays()instead of GL_POINTS:

// 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);
    }

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);
    }
...

 
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值