无法在OpenGL上绘制三角形

问题描述 投票:0回答:1

我遵循了 LearnOpenGL 指南,在最后部分,当它应该绘制三角形时,它只是没有。

没有编译或运行时错误,我只是得到空窗口。由于我是初学者,我不知道如何跟踪问题,例如检查缓冲区内的内容。

我的主要文件:

#include <stdio.h>
#include <stdlib.h>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include "shader.h"

#define ASSERT(x, str) if (!(x)) {printf(str); exit(1);}
#define WIDTH  800
#define HEIGHT 800

typedef unsigned int uint;
typedef uint8_t u8;
typedef uint16_t u16;
typedef int8_t i8;
typedef int16_t i16;
typedef int32_t i32;
typedef float f32;
typedef double f64;

// ---

typedef struct {
  GLFWwindow* window;
} Canvas;

Canvas canvas;

f32 vertices[] = {
  0.25, 0.25, 0,
  0.75, 0.25, 0,
  0.50, 0.75, 0
};

// ---

void processInput(GLFWwindow* window) {
  if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
    glfwSetWindowShouldClose(window, 1);
}

int main() {
  // Start OpenGL
  glfwInit();
  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

  // Create a window
  canvas.window = glfwCreateWindow(WIDTH, HEIGHT, "", NULL, NULL);
  ASSERT(canvas.window, "Failed to create a window");
  glfwMakeContextCurrent(canvas.window);
  ASSERT(gladLoadGLLoader((GLADloadproc)glfwGetProcAddress), "Failed loading glad");
  glViewport(0, 0, WIDTH, HEIGHT);

  // Bind VBO and insert vertices into it
  uint VBO;
  glGenBuffers(1, &VBO);
  glBindBuffer(GL_ARRAY_BUFFER, VBO);
  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

  // Compile vertex shader
  uint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
  glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
  glCompileShader(vertex_shader);

  i32 success;
  glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
  ASSERT(success, "Error compiling vertex shader");

  // Compile vertex shader
  uint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
  glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);
  glCompileShader(fragment_shader);

  glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
  ASSERT(success, "Error compiling fragment shader");

  // Create shader program
  uint shader_program = glCreateProgram();
  glAttachShader(shader_program, vertex_shader);
  glAttachShader(shader_program, fragment_shader);
  glLinkProgram(shader_program);
  glDeleteShader(vertex_shader);
  glDeleteShader(fragment_shader);

  glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
  ASSERT(success, "Error linking shaders");
  
  glUseProgram(shader_program);

  // Link vertex
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(f32), (void*) 0);
  glEnableVertexAttribArray(0);

  // Create VAO
  uint VAO;
  glGenVertexArrays(1, &VAO);
  glBindVertexArray(VAO);

  glDrawArrays(GL_TRIANGLES, 0, 3);
  glfwSwapBuffers(canvas.window);




  // Just a test area where I placed every necessary stuff
  glBindVertexArray(VAO);
  glBindBuffer(GL_ARRAY_BUFFER, VBO);
  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(f32), (void*) 0);
  glEnableVertexAttribArray(0);
  glUseProgram(shader_program);
  glBindVertexArray(VAO);
  glDrawArrays(GL_TRIANGLES, 0, 3);
  






  // Main loop
  while(!glfwWindowShouldClose(canvas.window)) {
    processInput(canvas.window);
    glfwPollEvents();    
  }

  glfwTerminate();
  return 0;
}

我的着色器:

const char* vertex_shader_source = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;"
"void main() {"
"   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1);"
"}\0";

const char* fragment_shader_source = "#version 330 core\n"
"out vec4 color;"
"void main() {"
"   color = vec4(1, 1, 1, 1);"
"}\0";```

I just hope this is something really dumb instead of a problem with that glad (glad is a black-box for me)
c opengl graphics
1个回答
0
投票

在使用

glGenVertexArrays
指定顶点之前,您必须生成并绑定 VAO (
glBindVertexArray
,
glVertexAttribPointer
)。当定义通用顶点属性数据数组
glVertexAttribPointer
时,必须绑定相应的缓冲区对象和顶点数组对象。
glVertexAttribPointer
将绑定到
GL_ARRAY_BUFFER
目标的缓冲区 ID 存储在当前绑定的顶点数组对象的状态向量中。

uint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

uint VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(f32), (void*) 0);
glEnableVertexAttribArray(0);
© www.soinside.com 2019 - 2024. All rights reserved.