Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL GLFW,三角形不渲染_C++_Opengl_Glsl_Glfw_Vao - Fatal编程技术网

C++ OpenGL GLFW,三角形不渲染

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

我一直在尝试在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(){
    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
>。查看答案。我修复了它,问题是着色器代码中“}”之后的“;”。