C++ OpenGL GLFW,三角形不渲染
我一直在尝试在macOS上渲染三角形,但没有效果 这是我的密码:C++ OpenGL GLFW,三角形不渲染,c++,opengl,glsl,glfw,vao,C++,Opengl,Glsl,Glfw,Vao,我一直在尝试在macOS上渲染三角形,但没有效果 这是我的密码: #include <iostream> #include <glm/glm.hpp> #include <GL/glew.h> #include <GLFW/glfw3.h> void OnError(int errorCode, const char* msg){ throw std::runtime_error(msg); } int main(){ glfw
#include <iostream>
#include <glm/glm.hpp>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
void OnError(int errorCode, const char* msg){
throw std::runtime_error(msg);
}
int main(){
glfwSetErrorCallback(OnError);
if (!glfwInit()){
throw std::runtime_error("glfwInit failed");
}
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(512, 512, "Title", NULL, NULL);
if (!window){
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK){
glfwTerminate();
return -1;
}
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
float points[] = {
0.0, 0.5, 0.0,
-0.5, -0.5, 0.0,
0.5, -0.5, 0.0
};
GLuint vbo = 0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
GLuint vao = 0;
glGenBuffers(1, &vao);
glBindVertexArray(vao);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
const char* vertex_shader =
"#version 410\n"
"in vec3 vp;"
"void main(){"
" gl_Position = vec4(vp, 1.0);"
" };";
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vertex_shader, NULL);
glCompileShader(vs);
const char* fragment_shader =
"#version 410\n"
"out vec4 frag_colour;"
"void main(){"
" frag_colour = vec4(0.0, 1.0, 0.0, 1.0);"
" };";
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fragment_shader, NULL);
glCompileShader(fs);
GLuint shader_program = glCreateProgram();
glAttachShader(shader_program, fs);
glAttachShader(shader_program, vs);
glLinkProgram(shader_program);
while (!glfwWindowShouldClose(window)){
//glViewport(0, 0, 512, 512);
//glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shader_program);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glfwSwapBuffers(window);
glfwPollEvents();
glClear(GL_COLOR_BUFFER_BIT);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
#包括
#包括
#包括
#包括
void OnError(int errorCode,const char*msg){
抛出std::运行时错误(msg);
}
int main(){
glfwSetErrorCallback(OneError);
如果(!glfwInit()){
抛出std::运行时_错误(“glfwInit失败”);
}
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);
glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_核心配置文件);
glfwWindowHint(GLFW_上下文_版本_专业,3);
glfwWindowHint(GLFW_上下文_版本_小调,2);
glfwWindowHint(GLFW_可调整大小,GL_为FALSE);
GLFWwindow*window=glfwCreateWindow(512,512,“标题”,NULL,NULL);
如果(!窗口){
glfwTerminate();
返回-1;
}
glfwMakeContextCurrent(窗口);
glewExperimental=GL_TRUE;
如果(glewInit()!=GLEW\u确定){
glfwTerminate();
返回-1;
}
glEnable(GLU深度试验);
glDepthFunc(GL_LESS);
浮点[]={
0.0, 0.5, 0.0,
-0.5, -0.5, 0.0,
0.5, -0.5, 0.0
};
GLuint vbo=0;
glGenBuffers(1,&vbo);
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GLU数组缓冲区、大小(点)、点、GLU静态图);
GLuint vao=0;
glGenBuffers(1,&vao);
glBindVertexArray(vao);
glDisableVertexAttributeArray(0);
glBindBuffer(GL_数组_BUFFER,vbo);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,NULL);
常量字符*顶点着色器=
“#版本410\n”
“在vec3 vp中;”
“void main(){”
“gl_位置=向量4(vp,1.0);”
" };";
GLuint vs=glCreateShader(GL_顶点_着色器);
glShaderSource(vs,1,&vertex_着色器,NULL);
glCompileShader(vs);
常量字符*片段着色器=
“#版本410\n”
“输出矢量4 frag_颜色;”
“void main(){”
frag_color=vec4(0.0,1.0,0.0,1.0)
" };";
GLuint fs=glCreateShader(GL_片段_着色器);
glShaderSource(fs,1,&fragment_着色器,NULL);
glCompileShader(fs);
GLuint shader_program=glCreateProgram();
glAttachShader(shader_程序,fs);
glAttachShader(shader_程序,vs);
GLLINK程序(shader_程序);
而(!glfwWindowShouldClose(窗口)){
//glViewport(0,0,512,512);
//glClearColor(1.0f、1.0f、1.0f、1.0f);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glUseProgram(shader_程序);
glBindVertexArray(vao);
gldrawArray(GL_三角形,0,3);
glBindVertexArray(0);
glfwSwapBuffers(窗口);
glfwPollEvents();
glClear(GLU颜色缓冲位);
GlenableVertexAttributeArray(0);
glBindBuffer(GL_数组_BUFFER,vbo);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);
gldrawArray(GL_三角形,0,3);
glDisableVertexAttributeArray(0);
glfwSwapBuffers(窗口);
glfwPollEvents();
}
glfwTerminate();
返回0;
}
顶点数组对象名称必须由以下内容生成,而不是由以下内容生成:
glGenBuffers(1,&vao)代码>
glgenvertexarray(1,&vao);
状态顶点数组规范和启用状态存储在顶点数组对象中。创建对象名称并绑定(创建)顶点数组对象。然后可以指定并启用顶点阵列:
GLuint-vao=0;
glGenVertexArrays(1和vao);
glBindVertexArray(vao);
GlenableVertexAttributeArray(0);
glBindBuffer(GL_数组_BUFFER,vbo);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,NULL);
在绘制几何体之前,绑定顶点阵列对象就足够了:
while(!glfwWindowShouldClose(窗口))
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glUseProgram(shader_程序);
glBindVertexArray(vao);
gldrawArray(GL_三角形,0,3);
glBindVertexArray(0);
glfwSwapBuffers(窗口);
glfwPollEvents();
}
注意,在应用程序中会创建一个核心配置文件(GLFW\u OPENGL\u core\u profile
)。这导致默认顶点数组对象(0)无效。
类似于和更改顶点数组对象状态的说明。如果调用此函数时未绑定命名顶点数组对象,则会导致无效的_操作错误
此外,您还创建了一个3.2核心概要OpneGL上下文。与OpenGL 3.2相对应的GLSL版本为1.50。
更改顶点和片段着色器中的版本规范:
#版本410
#版本150
最后一个三角形:
我建议检查着色器编译是否成功以及程序对象链接是否成功
如果着色器编译成功,可通过和参数GL\u COMPILE\u STATUS
进行检查。e、 g:
#包括
#包括
bool CompileStatus(GLuint着色器)
{
闪烁状态=GL_TRUE;
glGetShaderiv(着色器、GL\u编译状态和状态);
如果(状态==GL\U FALSE)
{
闪烁logLen;
glGetShaderiv(着色器、GL\u INFO\u LOG\u LENGTH和logLen);
标准:向量log(logLen);
葛思哲写的;
glGetShaderInfoLog(shader,logLen,&write,log.data());
std::cout为什么glDisableVertexAttributeArray(0)
。你必须启用它。谢谢,这可能是问题的一部分。我仍然无法让它很难工作。好吧,我可能误解了你的意思。这是我当前的代码:哦,对不起,它仍然不难工作。我做错了什么?@Theelf111你的hardaware无法处理#版本410
。更改为#版本150
>。查看答案。我修复了它,问题是着色器代码中“}”之后的“;”。