无法使用 GLEW (mac,c++) 在 openGL 中绘制任何内容

Posted

技术标签:

【中文标题】无法使用 GLEW (mac,c++) 在 openGL 中绘制任何内容【英文标题】:Can't draw anything in openGL using GLEW (mac,c++) 【发布时间】:2015-06-28 15:40:00 【问题描述】:

我正在尝试使用This tutorial 学习 C++ 中的 OpenGL 编程。我正在使用运行 OSX-Yosemite 版本 10.10.3 的 macbook pro。我的 openGL 版本是 3.3。

我正在使用库 GLFW 和 GLEW。

我正在使用以下命令从我的终端编译(和链接)我的代码:g++ triangleTest.cpp -o triangleTest -lglfw3 -lglew -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo(我不是在 Xcode 中编写)。

这个程序的目标是在黑色背景上制作一个白色三角形,代码如下:

// Include standard headers
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
#include <GL/glew.h>
#include<GLFW/glfw3.h>
GLFWwindow* window;

// An array of 3 vectors which represents 3 vertices
static const GLfloat g_vertex_buffer_data[] = 
   -1.0f, -1.0f, 0.0f,
   1.0f, -1.0f, 0.0f,
   0.0f,  1.0f, 1.0f,
;

int main()

    // Initialise GLFW
    if( !glfwInit() )
    
        fprintf( stderr, "Failed to initialize GLFW\n" );
        return -1;
    

    glfwWindowHint(GLFW_SAMPLES, 4); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);


    std::cout<<"GLFW3 initialized\n";


    window = glfwCreateWindow(640, 480, "I am a triangle", NULL, NULL);

     if (!window)
     
         glfwTerminate();
         std::cout<<"Window initialization failed\n";
        return 1;   
     

    std::cout<<"Window initialized\n";

    glfwMakeContextCurrent(window);

    if (glewInit() != GLEW_OK) 
        std::cout<<"Failed to initialize GLEW try again\n";
        return 1;
    


    // This will identify our vertex buffer
    GLuint vertexbuffer;
    // Generate 1 buffer, put the resulting identifier in vertexbuffer
    glGenBuffers(1, &vertexbuffer); 
    // The following commands will talk about our 'vertexbuffer' buffer
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    // Give our vertices to OpenGL.
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);






    glfwSwapInterval(1);

     while (!glfwWindowShouldClose(window))

        // Clear the screen
        glClear( GL_COLOR_BUFFER_BIT );

        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
        glVertexAttribPointer(
            1,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
            3,                  // size
            GL_FLOAT,           // type
            GL_TRUE,           // normalized?
            0,                  // stride
            (void*)0            // array buffer offset
        );

        // Draw the triangle !
        glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle

        glDisableVertexAttribArray(0);

        glfwSwapBuffers(window);
        glfwPollEvents();
     


    glfwTerminate();    

代码已编译并运行(从终端),出现一个没有三角形但名称和大小正确的黑色窗口。窗口工作完美,可以像预期的那样移动和关闭,但没有绘制三角形。

【问题讨论】:

您似乎只遵循了教程中的一些步骤。您将需要上面的部分(创建 VAO)和下面的部分(创建着色器)。在您完成整个事情之前,这通常不会起作用。 【参考方案1】:

查看教程,您似乎缺少 VAO。具体来说, 您应该在初始化 GLEW 后添加这些行。

GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

那么,在你调用 VertexAttribPointer 时,你的属性应该是 0,而不是 1。所以调用应该是这样的

glVertexAttribPointer(
        0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        3,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
);

这使它与属性的索引匹配,因为索引 1 处没有属性

【讨论】:

这还不够。发布的代码中完全缺少着色器。 我试图使示例尽可能简单,通过删除所有内容,我认为着色器只是为三角形提供颜色,而 VAO 并不重要,我添加了两者,现在这是工作。谢谢 感谢顶点数组的生成是我的代码中缺少的部分,现在已经完成gist.github.com/eduardonunesp/e3462d0ae04baa85ba65bb8cdaa4f2d0【参考方案2】:

忘记那个网站,非常丑陋和黑暗。 有一个来自 Reddit 的人为初学者编制了一份非常有用的教程的小清单。只要去那里,选择一个,我向你保证,每天 8 小时,在大约一周内,你将有一个带有纹理的立方体旋转,也许还有一些光! =) 所以试试吧: List of cool Modern Opengl tutorials this tutorials 在 Mac 上工作。

【讨论】:

以上是关于无法使用 GLEW (mac,c++) 在 openGL 中绘制任何内容的主要内容,如果未能解决你的问题,请参考以下文章

未绘制三角形。 C++/GLEW/SDL [关闭]

opengl 库glew

使用osxfuse开发无法为mac保存microsoft office2011文件

无法使用 GLFW3 初始化 GLew

无法将 Glew 与 Cmake 链接

为啥即使在搜索路径中列出了 GLEW 动态库,Xcode 也无法找到它?