如何使用 OpenGL 在屏幕上显示一个三角形?

how can I make a triangle appear on the screen using OpenGL?

我正在尝试使用 OpenGL 在屏幕上显示一个三角形,但是当我 运行 代码时,出现黑屏

我目前正在使用我在互联网上找到的指南(这里是 link:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/)。

这是代码:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

int larghezza = 1024;
int altezza = 768;

int main (){
    glewExperimental = true;
    if (!glfwInit() )
    {
        fprintf (stderr, "non è stato possibile inizzializzare glfw\n");
        return -1;
    }
    glfwWindowHint(GLFW_SAMPLES, 4);// 4x antialiasing
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);// utilizza OpenGL 4.1
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//NON VOGLIO VECCHIE VERSIONI DI OPENGL

    GLFWwindow* window; // crea una finestra
    window = glfwCreateWindow(larghezza, altezza, "FINESTRA 1", NULL, NULL);
    if (!window){
        fprintf (stderr, "Non è stato possibile aprire la finestra!\n");
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window); //inizzializza GLEW
    glewExperimental = true;
    if (glewInit() != GLEW_OK){
        fprintf (stderr, "non è stato possibile inizzializzare GLEW");
        return -1;
    }

    glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);

    do {
        glClear(GL_COLOR_BUFFER_BIT);



        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    while( glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS &&
          glfwWindowShouldClose(window) == 0 );

    GLuint VertexArrayID;
    glGenVertexArrays(1, &VertexArrayID);
    glBindVertexArray(VertexArrayID);
    static const GLfloat g_vertex_buffer_data[] = {
        -1.0f, -1.0f, 0.0f,
        1.0f, -1.0f, 0.0f,
        0.0f,  1.0f, 0.0f,
    };
    GLuint vertexbuffer;
    // Generate 1 buffer, put the resulting identifier in vertexbuffer
    glGenBuffers(1, &vertexbuffer);
    // The following commands will talk about our 'vertexbuffer' buffer
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    // Give our vertices to OpenGL.
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(
                          0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
                          3,                  // size
                          GL_FLOAT,           // type
                          GL_FALSE,           // normalized?
                          0,                  // stride
                          (void*)0            // array buffer offset
                          );
    // Draw the triangle !
    glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle
    glDisableVertexAttribArray(0);
}

我该如何解决?

glDrawArrays() 调用应该在主渲染事件循环中。特别是在 do {} 块中。

问:如果在 do{} 循环中未调用绘图调用,为什么这段代码会呈现?

当您按下 Escape 按钮时,它会在隐藏缓冲区中绘制,绘制完成后基本上会切换到屏幕上。由于在 glDrawArrays() 调用后不进行交换,因此您永远不会看到它。

不知道你用的是什么教程网站

但是,我建议使用此站点中的适当教程 - learnopengl.com。即使通过“入门”部分也足以成为一个很好的介绍。