首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenGL 4中创建第二个VAO并绘制两个形状

在OpenGL 4中创建第二个VAO并绘制两个形状
EN

Stack Overflow用户
提问于 2015-05-09 04:16:22
回答 2查看 864关注 0票数 1

我正在尝试解决Anton的OpenGL 4 Tutorials一书中的实验。在第一章的实验中,它要求创建第二个VAO来绘制两个形状而不是一个形状,但我不知道如何做到这一点,第二个如何同时显示?

代码语言:javascript
复制
    #include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main () {
    // start GL context and O/S window using the GLFW helper library
    if (!glfwInit ()) {
        fprintf (stderr, "ERROR: could not start GLFW3\n");
        return 1;
    } 
    GLFWwindow* window = glfwCreateWindow (640, 480, "Hello Triangle", NULL, NULL);
    if (!window) {
        fprintf (stderr, "ERROR: could not open window with GLFW3\n");
        glfwTerminate();
        return 1;
    }
    glfwMakeContextCurrent (window);

    // start GLEW extension handler
    glewExperimental = GL_TRUE;
    glewInit ();

    // get version info
    const GLubyte* renderer = glGetString (GL_RENDERER); // get renderer string
    const GLubyte* version = glGetString (GL_VERSION); // version as a string
    printf ("Renderer: %s\n", renderer);
    printf ("OpenGL version supported %s\n", version);

    // tell GL to only draw onto a pixel if the shape is closer to the viewer
    glEnable (GL_DEPTH_TEST); // enable depth-testing
    glDepthFunc (GL_LESS); // depth-testing interprets a smaller value as "closer"

    GLfloat points[] = {
    0.0f,  0.5f,  0.0f,
    0.5f, -0.5f,  0.0f,
    -0.5f, -0.5f,  0.0f,
    0.0f,  0.5f,  0.0f,
    0.5f,  0.5f,  0.0f,
    0.5f, -0.5f,  0.0f
    };

    GLuint vbo = 0;
    glGenBuffers (1, &vbo);
    glBindBuffer (GL_ARRAY_BUFFER, vbo);
    glBufferData (GL_ARRAY_BUFFER, 18 * sizeof (float), points, GL_STATIC_DRAW);

    GLuint vao = 0;
    glGenVertexArrays (1, &vao);
    glBindVertexArray (vao);
    glEnableVertexAttribArray (0);
    glBindBuffer (GL_ARRAY_BUFFER, vbo);
    glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

    //second vao
    GLuint vao_two = 0;
    glGenVertexArrays(1, &vao_two);
    glBindVertexArray(vao_two);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

    const char* vertex_shader =
    "#version 400\n"
    "in vec3 vp;"
    "in vec3 vp2;"
    "void main() {"
    " gl_Position = vec4(vp.x, vp.y + 0.2, vp.z, 1.0);"
    " gl_Position2 = vec4(vp2.x, vp2.y - 0.9, vp2.z, 1.0);"
    "}";

    const char* fragment_shader =
    "#version 400\n"
    "out vec4 frag_colour;"
    "void main () {"
    "  frag_colour = vec4 (0.0, 1.0, 0.0, 1.0);"
    "}";

    GLuint vs = glCreateShader (GL_VERTEX_SHADER);
    glShaderSource (vs, 1, &vertex_shader, NULL);
    glCompileShader (vs);

    GLuint fs = glCreateShader (GL_FRAGMENT_SHADER);
    glShaderSource (fs, 1, &fragment_shader, NULL);
    glCompileShader (fs);

    GLuint shader_programme = glCreateProgram();
    glAttachShader (shader_programme, fs);
    glAttachShader (shader_programme, vs);
    glLinkProgram(shader_programme);

    glClearColor(0.6f, 0.6f, 0.6f, 0.0f);

    while (!glfwWindowShouldClose (window)) {
        // wipe the drawing surface clear
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glUseProgram (shader_programme);
        glBindVertexArray (vao);
        // draw points 0-3 from the currently bound VAO with current in-use shader
        glDrawArrays (GL_TRIANGLES, 0, 6);

        glBindVertexArray (vao_two);
        glDrawArrays (GL_TRIANGLES, 0, 6);

        // update other events like input handling 
        glfwPollEvents ();
        // put the stuff we've been drawing onto the display
        glfwSwapBuffers (window);
    }
    // close GL context and any other GLFW resources
    glfwTerminate();
    return 0;
}
EN

回答 2

Stack Overflow用户

发布于 2015-05-31 02:57:59

实际上,您绘制的是两个不同的形状,因为您在两个顶点属性对象(vao和vao_two)中使用相同的顶点缓冲区对象,它们具有相同的坐标并且重叠。尝试制作两个具有不同坐标的点的GLfloat数组,并将每个点的属性设置为不同的顶点缓冲区对象,然后将每个顶点缓冲区对象设置为不同的顶点属性对象,那么您的形状将是不同的。

票数 1
EN

Stack Overflow用户

发布于 2018-10-22 17:42:13

首先绑定缓冲区,然后绘制它们:

代码语言:javascript
复制
    glBindVertexArray(vao);
    glBindVertexArray(vao2);
    glDrawArrays(GL_TRIANGLES, 0, 6);

或者,您可以先绘制第一个形状,然后绘制第二个形状:

代码语言:javascript
复制
    glBindVertexArray(vao);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glBindVertexArray(vao2);
    glDrawArrays(GL_TRIANGLES, 3, 3);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30132179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档