OpenGL程序没有';不要画三角形 我在C++中遵循OpenGL教程,不知为什么,完全相同的代码对我来说不起作用。 它应该显示一个三角形,但它什么也不显示,只是一个空白屏幕。 代码如下: #include<iostream> #define GLEW_STATIC #include"GL/glew.h" #include"GLFW/glfw3.h" static unsigned int compileShader(unsigned int type, const std::string& shader) { unsigned int id = glCreateShader(type); const char* src = shader.c_str(); glShaderSource(id, 1, &src, NULL); glCompileShader(id); int result; glGetShaderiv(id, GL_COMPILE_STATUS, &result); if (!result) { char log[512]; glGetShaderInfoLog(id, 512, NULL, log); std::cout << "Compiling shader error:\n" << log << std::endl; } return id; } static unsigned int createShader(const std::string& vertexShader, const std::string& fragmentShader) { unsigned int program = glCreateProgram(); unsigned int vs = compileShader(GL_VERTEX_SHADER, vertexShader); unsigned int fs = compileShader(GL_FRAGMENT_SHADER, fragmentShader); glAttachShader(program, vs); glAttachShader(program, fs); glLinkProgram(program); int result; glGetProgramiv(program, GL_LINK_STATUS, &result); if (!result) { char log[512]; glGetProgramInfoLog(program, 512, NULL, log); std::cout << "linking shader error:\n" << log << std::endl; } glValidateProgram(program); glDeleteShader(vs); glDeleteShader(fs); return program; } void keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mode) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); } int main() { int width = 0, height = 0; glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); GLFWwindow* window = glfwCreateWindow(500, 500, "Test", nullptr, nullptr); glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; glewInit(); glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height); glfwSetKeyCallback(window, keyCallBack); float triangle[] = { -0.5f, -0.5f, 0.0f, 0.5f, 0.5f, -0.5f }; GLuint buffer = 0; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0); glEnableVertexAttribArray(0); std::string vertexShader = "#version 330 core\n" "layout (location = 0) in vec4 position;\n" "void main()\n" "{\n" "gl_Position = position;\n" "}\n"; std::string fragmentShader = "#version 330 core\n" "out vec4 color;\n" "void main()\n" "{\n" "color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n"; unsigned int program = createShader(vertexShader, fragmentShader); glUseProgram(program); while(!glfwWindowShouldClose(window)) { glfwPollEvents(); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLES, 0, 3); glfwSwapBuffers(window); } glfwTerminate(); return 0; } #包括 #定义GLEW_静态 #包括“GL/glew.h” #包括“GLFW/glfw3.h” 静态无符号整数编译器标头(无符号整数类型,常量std::字符串和着色器) { unsigned int id=glCreateShader(类型); const char*src=shader.c_str(); glShaderSource(id,1,&src,NULL); glCompileShader(id); int结果; glGetShaderiv(id、GL\u编译状态和结果); 如果(!结果){ 字符日志[512]; glGetShaderInfoLog(id,512,NULL,log); std::cout

OpenGL程序没有';不要画三角形 我在C++中遵循OpenGL教程,不知为什么,完全相同的代码对我来说不起作用。 它应该显示一个三角形,但它什么也不显示,只是一个空白屏幕。 代码如下: #include<iostream> #define GLEW_STATIC #include"GL/glew.h" #include"GLFW/glfw3.h" static unsigned int compileShader(unsigned int type, const std::string& shader) { unsigned int id = glCreateShader(type); const char* src = shader.c_str(); glShaderSource(id, 1, &src, NULL); glCompileShader(id); int result; glGetShaderiv(id, GL_COMPILE_STATUS, &result); if (!result) { char log[512]; glGetShaderInfoLog(id, 512, NULL, log); std::cout << "Compiling shader error:\n" << log << std::endl; } return id; } static unsigned int createShader(const std::string& vertexShader, const std::string& fragmentShader) { unsigned int program = glCreateProgram(); unsigned int vs = compileShader(GL_VERTEX_SHADER, vertexShader); unsigned int fs = compileShader(GL_FRAGMENT_SHADER, fragmentShader); glAttachShader(program, vs); glAttachShader(program, fs); glLinkProgram(program); int result; glGetProgramiv(program, GL_LINK_STATUS, &result); if (!result) { char log[512]; glGetProgramInfoLog(program, 512, NULL, log); std::cout << "linking shader error:\n" << log << std::endl; } glValidateProgram(program); glDeleteShader(vs); glDeleteShader(fs); return program; } void keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mode) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); } int main() { int width = 0, height = 0; glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); GLFWwindow* window = glfwCreateWindow(500, 500, "Test", nullptr, nullptr); glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; glewInit(); glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height); glfwSetKeyCallback(window, keyCallBack); float triangle[] = { -0.5f, -0.5f, 0.0f, 0.5f, 0.5f, -0.5f }; GLuint buffer = 0; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0); glEnableVertexAttribArray(0); std::string vertexShader = "#version 330 core\n" "layout (location = 0) in vec4 position;\n" "void main()\n" "{\n" "gl_Position = position;\n" "}\n"; std::string fragmentShader = "#version 330 core\n" "out vec4 color;\n" "void main()\n" "{\n" "color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n"; unsigned int program = createShader(vertexShader, fragmentShader); glUseProgram(program); while(!glfwWindowShouldClose(window)) { glfwPollEvents(); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLES, 0, 3); glfwSwapBuffers(window); } glfwTerminate(); return 0; } #包括 #定义GLEW_静态 #包括“GL/glew.h” #包括“GLFW/glfw3.h” 静态无符号整数编译器标头(无符号整数类型,常量std::字符串和着色器) { unsigned int id=glCreateShader(类型); const char*src=shader.c_str(); glShaderSource(id,1,&src,NULL); glCompileShader(id); int结果; glGetShaderiv(id、GL\u编译状态和结果); 如果(!结果){ 字符日志[512]; glGetShaderInfoLog(id,512,NULL,log); std::cout,c++,opengl,vertex-buffer,vertex-array-object,C++,Opengl,Vertex Buffer,Vertex Array Object,该问题是由GLFW\u OPENGL\u CORE\u PROFILE引起的。如果使用CORE PROFILE,则必须使用命名的,因为默认VAO(0)无效 使用兼容性配置文件: glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_COMPAT_配置文件); 或在指定顶点属性数据数组之前创建VAO: GLuint-VAO; glGenVertexArrays(1和VAO); glBindVertexArray(VAO); glvertexattributepo

该问题是由
GLFW\u OPENGL\u CORE\u PROFILE
引起的。如果使用CORE PROFILE,则必须使用命名的,因为默认VAO(0)无效

使用兼容性配置文件:

glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_COMPAT_配置文件);
或在指定顶点属性数据数组之前创建VAO:

GLuint-VAO;
glGenVertexArrays(1和VAO);
glBindVertexArray(VAO);
glvertexattributepointer(0,2,GL_FLOAT,GL_FALSE,sizeof(FLOAT)*2,0);
GlenableVertexAttributeArray(0);

该问题是由
GLFW\u OPENGL\u CORE\u配置文件引起的。如果使用核心配置文件,则必须使用命名的,因为默认VAO(0)无效

使用兼容性配置文件:

glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_COMPAT_配置文件);
或在指定顶点属性数据数组之前创建VAO:

GLuint-VAO;
glGenVertexArrays(1和VAO);
glBindVertexArray(VAO);
glvertexattributepointer(0,2,GL_FLOAT,GL_FALSE,sizeof(FLOAT)*2,0);
GlenableVertexAttributeArray(0);

您是否正在检查
glError
?据我所知,您缺少核心配置文件中必须的VAO。@BDL I已删除对glfwWindowHint()的所有调用现在它可以工作了。但是我不明白为什么没有它们它可以工作。它可以工作是因为在现代OpenGL中你必须使用VAO。在旧版本中不是这样。当你删除“核心”时,你会恢复到不需要VAOs的旧OpenGL版本。我强烈建议你保留核心配置文件并集成VAO。(应该是2-3行代码)。您是否正在检查
glError
?据我所知,您缺少核心配置文件中必需的VAO。@BDL I已删除对glfwWindowHint()的所有调用现在它可以工作了。但是我不明白为什么没有它们它可以工作。它可以工作是因为在现代OpenGL中你必须使用VAO。在旧版本中不是这样。当你删除“核心”时,你会恢复到不需要VAOs的旧OpenGL版本。我强烈建议你保留核心配置文件并集成VAO。(应为2-3行代码)。