C++ opengl程序可以';t渲染三角形

C++ opengl程序可以';t渲染三角形,c++,opengl,C++,Opengl,我根据两个教程修改了三角形程序: 和 但是我只能渲染没有三角形的窗口。我的代码如下: #include <iostream> #include <string.h> #include <GL/glew.h> #include <GL/freeglut.h> GLuint VBO; GLuint shaderProgram;

我根据两个教程修改了三角形程序: 和 但是我只能渲染没有三角形的窗口。我的代码如下:

          #include <iostream>
          #include <string.h>
          #include <GL/glew.h>
          #include <GL/freeglut.h>
          GLuint VBO;
          GLuint shaderProgram;
          const GLchar* vertexShaderSource = "#version 330 core\n"
              "layout (location = 0) in vec3 position;\n"
              "void main()\n"
              "{\n"
              "gl_Position = vec4(position.x, position.y, position.z, 1.0);\n"
              "}\0";
          const GLchar* fragmentShaderSource = "#version 330 core\n"
              "out vec4 color;\n"
              "void main()\n"
              "{\n"
              "color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
              "}\n\0";

   void RenderSceneCB()
   {   GLuint VAO;
       glClear(GL_COLOR_BUFFER_BIT);
       glUseProgram(shaderProgram);

       glBindVertexArray(VAO);
       glBindBuffer(GL_ARRAY_BUFFER, VBO);
       glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
       glEnableVertexAttribArray(0);
       glDrawArrays(GL_TRIANGLES, 0, 3);

       glDisableVertexAttribArray(0);

       glutSwapBuffers();
   }


   void InitializeGlutCallbacks()
   {
       glutDisplayFunc(RenderSceneCB);
   }

   void CreateVertexBuffer()
   {
       GLfloat Vertices[] = {
           -0.5f, -0.5f, 0.0f, // Left  
            0.5f, -0.5f, 0.0f, // Right 
            0.0f,  0.5f, 0.0f  // Top   
       };
       glGenBuffers(1, &VBO);
       glBindBuffer(GL_ARRAY_BUFFER, VBO);
       glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
   }

   void shader() {
       // Build and compile our shader program
       // Vertex shader
       GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
       glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
       glCompileShader(vertexShader);
       // Check for compile time errors
       GLint success;
       GLchar infoLog[512];
       glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
       if (!success)
       {
           glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
           std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" <<               infoLog << std::endl;
       }
       // Fragment shader
       GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
       glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
       glCompileShader(fragmentShader);
       // Check for compile time errors
       glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
       if (!success)
       {
           glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
           std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
       }
       // Link shaders
       shaderProgram = glCreateProgram();
       glAttachShader(shaderProgram, vertexShader);
       glAttachShader(shaderProgram, fragmentShader);
       glLinkProgram(shaderProgram);
       // Check for linking errors
       glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
       if (!success) {
           glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
           std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
       }
       glDeleteShader(vertexShader);
       glDeleteShader(fragmentShader);
   }

   int main(int argc, char** argv)
   {   glutInitContextVersion (3, 3);
       glutInit(&argc, argv);
       glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
       glutInitWindowSize(1024, 768);
       glutInitWindowPosition(100, 100);
       glutCreateWindow("Triangle"); 
       InitializeGlutCallbacks();
       // Must be done after glut is initialized!
       glewExperimental = GL_TRUE;
       GLenum res = glewInit();
       if (res != GLEW_OK) {
         std::cout << "Error: '%s'\n" << glewGetErrorString(res) << std::endl;
         return 1;
       }
       glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

       CreateVertexBuffer();

       shader();

       glutMainLoop();

       return 0;
   }
#包括
#包括
#包括
#包括
GLuint VBO;
GLuint着色器程序;
const GLchar*vertexShaderSource=“#版本330核心\n”
“布局(位置=0)在vec3位置;\n”
“void main()\n”
“{\n”
gl_位置=vec4(位置.x,位置.y,位置.z,1.0);\n
"}\0";
const GLchar*fragmentShaderSource=“#版本330核心\n”
“输出vec4颜色;\n”
“void main()\n”
“{\n”
color=vec4(1.0f,0.5f,0.2f,1.0f);\n
“}\n\0”;
void rendersceneb()
{GLuint VAO;
glClear(GLU颜色缓冲位);
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glBindBuffer(GL_数组_BUFFER,VBO);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,0);
GlenableVertexAttributeArray(0);
gldrawArray(GL_三角形,0,3);
glDisableVertexAttributeArray(0);
glutSwapBuffers();
}
void InitializeGlutCallbacks()
{
glutDisplayFunc(RenderSceneCB);
}
void CreateVertexBuffer()
{
GLfloat顶点[]={
-0.5f,-0.5f,0.0f,//左
0.5f,-0.5f,0.0f,//对
0.0f、0.5f、0.0f//顶部
};
glGenBuffers(1,&VBO);
glBindBuffer(GL_数组_BUFFER,VBO);
glBufferData(GLU数组缓冲区、大小(顶点)、顶点、GLU静态图);
}
void着色器(){
//构建并编译我们的着色器程序
//顶点着色器
GLuint vertexShader=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader,1和vertexShaderSource,NULL);
glCompileShader(顶点着色器);
//检查编译时错误
辉煌的成功;
GLchar信息日志[512];
glGetShaderiv(顶点着色器、GL\u编译状态和成功);
如果(!成功)
{
glGetShaderInfoLog(vertexShader,512,NULL,infoLog);

std::难道你忘了创建VAO吗?哦,谢谢。我在glBindVertexArray(VAO)之前添加了一个GLGEnVertexArray(1,&VAO);它可以工作。如果你只添加那一行,你会在每一帧泄漏一个VAO…@immibis你能指导如何更改以使其更好吗?或者创建一次VAO而不是每一帧(这样总共只有一个VAO),或在完成后删除VAO?您忘了创建VAO?哦,谢谢。我在glBindVertexArray(VAO)之前添加了一个GLGEnVertexArray(1,&VAO);并且它可以工作。如果您只添加该行,您将在每一帧泄漏一个VAO…@immibis您可以指导如何更改以使其更好吗?或者创建一次VAO,而不是每一帧(这样总共只有一个VAO),或者在完成VAO后删除它?