当前位置: 首页 > 知识库问答 >
问题:

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

巴博耘
2023-03-14

我正在尝试使用本教程学习c语言的OpenGL编程。我使用的是macbook pro,运行OSX-Yosemite版本10.10.3。我的openGL版本是3.3。

我正在使用GLFW和GLEW库。

我正在编译(和链接)我的代码从我的终端使用以下命令:g triangleTest.cpp-o triangleTest-lglfw3-lglew-框架Cocoa-框架OpenGL-框架IOKit-框架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();    
}

代码是编译和运行的(从终端),一个黑色窗口没有三角形,但有正确的名称和大小。该窗口工作正常,可以像打开一样四处移动和关闭,但不会绘制三角形。

共有2个答案

方绪
2023-03-14

忘了那个网站吧,非常丑陋和黑暗。Reddit有一个人为初学者编写了一小份非常有用的教程列表。只要去那里,选择一个,我保证每天8个小时,在大约一周的时间里,你会有一个立方体随着纹理旋转,也许还有一些光线!)所以,试一试:列出一些很酷的现代Opengl教程,这些教程可以在Mac上使用。

卢聪
2023-03-14

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

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

然后,在调用VertexAttributePointer时,属性应该是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处没有属性

 类似资料:
  • 我使用OpenGL进行2D渲染,并希望使用实际像素坐标。我的意思是,我希望(0,0)位于窗口的左上角,而(宽度,高度)位于窗口右下角(其中宽度和高度是窗口的像素尺寸)。为了做到这一点,我使用了一个投影矩阵,该矩阵由glOrtho生成,然后传递给顶点着色器: 我使用的是LWJGL,它没有glm的绑定,所以我使用上面的OpenGL调用获得2D正交矩阵。我重置了投影矩阵,这样它就不会影响我以后的绘图调用

  • 问题内容: 我尝试将本教程与Golang一起使用:http : //www.opengl- tutorial.org/beginners-tutorials/tutorial-2-the-first- triangle/ go-version打开窗口并使背景变蓝,但是不显示三角形。C版本确实显示了它。这是Go中的代码: 这是c中有效的代码: 也许我给了vertexAttrib.AttribPoin

  • 我试图为OpenGL工作设置一个跨平台代码库,下面的代码在我硬盘的Windows7分区上绘制得很好。然而,在小牛,我只得到一个黑屏,不知道为什么。我已经尝试了指南和相关问题中建议的所有东西,但到目前为止都没有效果!希望我只是遗漏了一些明显的东西,因为我对OpenGL还很陌生。 通过Xcode编译,使用2013年Macbook Mini,Intel HD Graphics 5000。可能还值得注意的

  • 我是OpenGL编程的完全初学者,正在努力学习learnopengl的突破教程。但是他想把球画成一个实际的圆,而不是像乔伊建议的那样使用纹理四维。然而,谷歌为“画圈opengl 3.3”或类似短语向我抛出的每一个结果似乎都至少有几年历史了,并且使用的API版本甚至比那个版本还要旧:-( 我发现的最接近的事情是这个SO问题,但是当然OP只需要使用一个自定义的对象来抽象一些细节,而没有分享他/她的实现

  • 我是最新版本的OpenGL的新手,我试图通过以下教程来学习它:http://open.gl/drawing 然而,我正在使用LWJGL的最新版本,并尽最大努力将其OpenGL与教程一样使用。然而,应该绘制的白色三角形却不是。 这是我的代码: 我的着色器与本教程的着色器相同,但无论如何都会为了便于阅读而发布它们: 。蓄意杀伤 .vert 代码运行,但都是黑色的。有什么想法吗?

  • 在我的呈现器类上: 函数在呈现器类中更改坐标: 当我移动手指时,没有线,只有一条移动的小线...我怎样才能画出整条线,并在我不断移动手指的同时保持线描?当我再次触屏时,也开始新的一行。