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 为什么核心配置文件不起作用?_C_Opengl - Fatal编程技术网

C 为什么核心配置文件不起作用?

C 为什么核心配置文件不起作用?,c,opengl,C,Opengl,这段代码在compatibility profile context version 4.3中运行良好,但当我切换到core时,不会绘制任何内容,即使我使用的所有GL函数都包含在core概要文件中。下面是代码的主要部分 glClearColor(0.f, 0.f, 0.f, 0.f); glClearDepth(-1.d); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_GREATER); glEnable(GL_CULL

这段代码在compatibility profile context version 4.3中运行良好,但当我切换到core时,不会绘制任何内容,即使我使用的所有GL函数都包含在core概要文件中。下面是代码的主要部分

    glClearColor(0.f, 0.f, 0.f, 0.f);
    glClearDepth(-1.d);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_GREATER);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    glFrontFace(GL_CCW);
    vs= glCreateShader(GL_VERTEX_SHADER);
    fs= glCreateShader(GL_FRAGMENT_SHADER);
    program= glCreateProgram();

    const char* vertex_shader_text=
        "#version 430 core\n"
        "in vec2 vPos;"
        "in vec3 vCol;"
        "out vec3 colour;"
        "void main() {"
        "colour = vCol;"
        "gl_Position = vec4(vPos, 1.0, 1.0);"
        "}";
    const char* fragment_shader_text=
        "#version 430 core\n"
        "in vec3 colour;"
        "out vec4 frag_colour;"
        "out vec4 frag_colour2;"
        "void main() {"
        "frag_colour = vec4(1.0, 1.0, 1.0, 0.0);"
        "frag_colour2 = vec4(colour, 0.0);"
        "}";
    glShaderSource(vs, 1, &vertex_shader_text, NULL);
    glShaderSource(fs, 1, &fragment_shader_text, NULL);
    glCompileShader(vs);
    glCompileShader(fs);
    glAttachShader(program, vs);
    glAttachShader(program, fs);

    glBindAttribLocation(program,0,"vPos");
    glBindAttribLocation(program,1,"vCol");
    glBindFragDataLocation(program,0,"frag_colour2");

    glLinkProgram(program);
    glUseProgram(program);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    float vertices[] =
    {
        -1.f, 1.f, 1.f, 0.f, 0.f,
        3.f-2.f*(float)sqrt(3.d), -1.f, 0.f, 1.f, 0.f,
        1.f, 2.f*(float)sqrt(3.d)-3.f, 0.f, 0.f, 1.f
    };
    GLuint vertex_buffer = 0;
    glGenBuffers(1, &vertex_buffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*) 0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*) (sizeof(float) * 2));

A:
    if (GetMessage(&msg, NULL, 0, 0) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    else return TRUE;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDrawArrays(GL_TRIANGLES,0,3);
    SwapBuffers(ghDC2);
    goto A;

确保在设置顶点属性之前创建并绑定顶点:

顶点数组对象VAO是一个OpenGL对象,它存储了提供顶点数据所需的所有状态,下面有一个小的异常。它存储顶点数据的格式以及缓冲区对象(见下文提供的顶点数据数组)。请注意,VAO不会复制、冻结或存储引用缓冲区的内容-如果您更改现有VAO引用的缓冲区中的任何数据,VAO的用户将看到这些更改


VAO在核心上下文中是必需的,但在兼容性方面是可选的。

goto!?除此之外,您使用的是什么平台,您在哪里初始化gl上下文?是否只更改着色器中的声明?还可以在创建着色器后检查错误,以查看它们是否编译正常。我使用windows 8,而上下文创建是在windows过程中完成的。我会检查错误,如果有错误我会告诉你的。没有,先生。glGetError命令返回了GL_NO_ERROR,这意味着没有发生错误。很抱歉,我在运行兼容性上下文时检查了错误。我会在核心模式下再次检查。谢谢你,先生。在启用属性和生成缓冲区之前,我添加了这3个命令:gluintvao;glGenVertexArrays1和vao;glBindVertexArrayvao;现在问题已经解决了。我猜vao可能是原因,但在启用属性数组后,我将这些命令放错了位置