三角形未在GLFW3中呈现

时间:2018-08-21 04:32:36

标签: c opengl glfw

我最近下载了GLFW3,因为它比我所听到的要好于GLUT。我设法找到一个窗口来显示和更改透明颜色,但我不知道为什么我在绘图调用中没有渲染任何内容。在这种情况下,它是一个三角形。我正在XCode 9.2上运行此代码,这是我现在拥有的代码:

#define GLFW_INCLUDE_GLCOREARB
#include <stdio.h>
#include <stdlib.h>
#include <GLFW/glfw3.h>

static const GLfloat vertex_buffer_data[] = {
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f,
};

int main(int argc, const char * argv[]) {
    GLuint VertexBufferID;
    GLFWwindow* window;

    /* Initialize the library */
    if ( !glfwInit() )
    {
        return -1;
    }

#ifdef __APPLE__
    /* We need to explicitly ask for a 3.2 context on OS X */
    glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint (GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#endif

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow( 400 , 400, "Hello World", NULL, NULL );
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    glGenBuffers(1, &VertexBufferID);
    glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer_data), vertex_buffer_data, GL_STATIC_DRAW);
    //Edit in
    **program = initShaders(VSHADER_SOURCE, FSHADER_SOURCE);**

    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        //set clear color
        glClearColor(0.0, 0.0, 0.0, 1.0);
        //clear window
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the buffers
        //Draw
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
        //got error 0x502 on line below
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

        //Edit in
        **glUseProgram(program);**

        glDrawArrays(GL_TRIANGLES, 0, 3);
        glDisableVertexAttribArray(0);

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

这可能是个小错误,但我看不到。

编辑:根据我的告诉,在这里必需着色器。我不知道如何在GLUT中摆脱它。我想这是一个较旧的版本。这是我正在使用的着色器程序。

"#version 330 core\n"
"layout(location = 0) in vec3 vertexPosition_modelspace;\n"
"void main()\n"
"{\n"
"   gl_Position.xyz = vertexPosition_modelspace;\n"
"   gl_Position.w = 1.0;\n"
"}\n";

"#version 330 core\n"
"out vec3 color;\n"
"void main()\n"
"{\n"
"   color = vec3(1, 0, 0);\n"
"}\n";

我还应该提到,我也一直在关注本教程以寻求帮助。 http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/

对于错误,我在glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);中发现了一个错误,代码为502,显然是GL_INVALID_OPERATION,在这种情况下我不知道这是什么意思。

1 个答案:

答案 0 :(得分:1)

glBufferData的第二个参数是缓冲区的目标类型,而不是命名的缓冲区对象本身glBufferData使用绑定到指定目标的命名缓冲区对象:

glBufferData(
    GL_ARRAY_BUFFER,            // GL_ARRAY_BUFFER instead of VertexBufferID
    sizeof(vertex_buffer_data),
    vertex_buffer_data,
    GL_STATIC_DRAW); 

如果要使用OpenGL Core profile context,则必须使用shader program,这不是可选的。
此外,您必须创建一个名为Vertex Array Object,因为核心配置文件上下文中不存在默认的顶点数组对象(0)

在OpenGL中进行渲染的现代方法是使用Shader程序。

如果您不想使用着色器程序,则必须使用兼容性上下文,并且必须使用glVertexPointer使用不期望的方式定义顶点数据数组,并且必须启用客户端的glEnableClientState( GL_VERTEX_ARRAY )顶点坐标功能。

glfwWindowHint (GLFW_OPENGL_PROFILE, 
    GLFW_OPENGL_COMPAT_PROFILE); // instead of GLFW_OPENGL_CORE_PROFILE

.....

glGenBuffers(1, &VertexBufferID);
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
glBufferData(GL_ARRAY_BUFFER, 
    sizeof(vertex_buffer_data), vertex_buffer_data, GL_STATIC_DRAW); 

.....

glEnableClientState( GL_VERTEX_ARRAY );
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
glVertexPointer(3, GL_FLOAT, 0, (void*)0); 
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableClientState( GL_VERTEX_ARRAY );