使用glCreateVertexArrays时出现黑屏

Getting black screen when using glCreateVertexArrays

本文关键字:glCreateVertexArrays 使用      更新时间:2023-10-16

我现在正在学习opengl。我买了一本名为OpenGL Superbible的书。但我没能幸存下来,正确地配置环境。我使用GLFW 3.2作为窗口工具包(如果这就是它的名字的话)和GLEW 2.0。

我正在尝试编译并使用着色器在屏幕上绘制。根据这本书,这应该在屏幕上画一个三角形。但事实并非如此。相反,它显示由glClearColor设置的清晰背景色。

这是代码:

#include <iostream>
#include <GLFWglfw3.h>
#include <GLglew.h>
GLuint CompileShaders();
int main(void) {
  // Initialise GLFW
  if (!glfwInit()) {
    fprintf(stderr, "Failed to initialize GLFWn");
    getchar();
    return -1;
  }
  // Open a window and create its OpenGL context
  GLFWwindow *window;
  window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL);
  if (window == NULL) {
    fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, "
                    "they are not 3.3 compatible. Try the 2.1 version of the "
                    "tutorials.n");
    getchar();
    glfwTerminate();
    return -1;
  }
  glfwMakeContextCurrent(window);
  // Initialize GLEW
  if (glewInit() != GLEW_OK) {
    fprintf(stderr, "Failed to initialize GLEWn");
    getchar();
    glfwTerminate();
    return -1;
  }
  // Ensure we can capture the escape key being pressed below
  glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
  GLuint RederingProgram = CompileShaders();
  GLuint VertexArrayObject;
  glCreateVertexArrays(1, &VertexArrayObject);
  glBindVertexArray(VertexArrayObject);
  int LoopCounter = 0;
  do {
    // Clear the screen. It's not mentioned before Tutorial 02, but it can cause
    // flickering, so it's there nonetheless.
    /*const GLfloat red[] = {
            (float)sin(LoopCounter++ / 100.0f)*0.5f + 0.5f,
            (float)cos(LoopCounter++ / 100.0f)*0.5f + 0.5f,
            0.0f, 1.0f
    };*/
    // glClearBufferfv(GL_COLOR, 0, red);
    // Draw nothing, see you in tutorial 2 !
    glUseProgram(RederingProgram);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    // Swap buffers
    glfwSwapBuffers(window);
    glfwPollEvents();
  } // Check if the ESC key was pressed or the window was closed
  while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
         glfwWindowShouldClose(window) == 0);
  // Close OpenGL window and terminate GLFW
  glfwTerminate();
  return 0;
}
GLuint CompileShaders() {
  GLuint VertexShader;
  GLuint FragmentShader;
  GLuint Program;
  static const GLchar *VertexShaderSource[] = {
      "#version 450 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 = vertices[gl_VertexID];    n",
      "}                                "
      " "
      "     n"};
  static const GLchar *FragmentShaderSource[] = {
      "#version 450 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.
  VertexShader = glCreateShader(GL_VERTEX_SHADER);
  glShaderSource(VertexShader, 1, VertexShaderSource, NULL);
  glCompileShader(VertexShader);
  // Create and compile fragment shader.
  FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  glShaderSource(FragmentShader, 1, FragmentShaderSource, NULL);
  glCompileShader(FragmentShader);
  // Create program, attach shaders to it, and link it
  Program = glCreateProgram();
  glAttachShader(Program, VertexShader);
  glAttachShader(Program, FragmentShader);
  glLinkProgram(Program);
  // Delete the shaders as the program has them now.
  glDeleteShader(FragmentShader);
  glDeleteShader(VertexShader);
  return Program;
}

我在视觉工作室2015工作。我有所有的库来开发一些opengl(我想),但有些是错误的。请帮帮我。顺便说一句,glCreateVertexArrays()函数只在Opengl 4.5及更高版本中,我知道,因为这本书是在Opengl 4.5中解释的。

我很快就会发疯,因为没有适合初学者的教程。学会这一点的人都是雄心勃勃的人。我在那些人面前鞠躬。

着色器不应该编译:

glShaderSource(VertexShader, 1, VertexShaderSource, NULL);

这告诉总账,它应该期望一个1GLchar指针的数组。然而,您的GLSL代码实际上被拆分为几个单独的字符串(注意逗号);

static const GLchar *VertexShaderSource[] = {
    "...GLSL-code..."
    "...GLSL-code..."
    "...GLSL-code...",  //  <- this comma ends the first string vertexShaderSource[0]
    "...GLSL-code..."   //  vertexShaderSource[1] starts here
    [...]

有两种可能的解决方案:

  1. 只需删除这些逗号,这样您的数组就只包含一个元素,该元素作为一个字符串指向整个GLSL源
  2. 告诉德国劳埃德船级社你的数据的真相:

    glShaderSoure(..., sizeof(vertexShaderSource)/sizeof(vertexShaderSource[0]), vertexShaderSource, ,,,)
    

除此之外,还应始终查询着色器和程序对象的编译和链接状态。同时查询着色器编译和程序链接信息日志。它们将包含人工可读消息,告诉您编译/链接失败的原因。

相关文章:
  • 没有找到相关文章