OpenGL / OSX / GLFW:窗口颜色除外

时间:2013-03-11 21:19:27

标签: c opengl glfw

我正在为大学做一些OpenGL / C工作(我在WebGL方面有经验)。下面的代码主要基于gltut教程(不能在OSX上运行 - 需要OGL 3.3)和NeHe教程。我的问题是,无论如何,唯一绘制的是初始窗口填充任何一种颜色(更改while循环中的颜色,因此循环正常运行)。然而,三角形和四边形根本不出现。我在过去的5个小时里一直在对它进行故障排除,而且当我开始时我就没有了。任何帮助将不胜感激!

使用:OpenGL3.2,最新的GLFW(2.7.7)

使用编译: gcc main.c -I / usr / local / include -I / opt / X11 / include -L / usr / local / lib -I / opt / X11 / lib -w -framework OpenGL -framework Cocoa -framework IOKit -lglfw -o test

以下评论中的代码有效。

3 个答案:

答案 0 :(得分:2)

您似乎没有初始化您的矩阵 - 无论是投影还是模型视图。

即使默认矩阵是偶然的,对你的目的来说是合理的,你也会继续应用翻译,这很快就会导致事情出现在屏幕外。

答案 1 :(得分:0)

下面的固定代码(3.2 OGL上下文位被注释,因为它们不起作用 - 如上所述的空白屏幕):

//c-libs
#include <stdlib.h>

//opengl
#include <OpenGL/gl3.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>

//glfw
#define GLFW_INCLUDE_GL3  /* don't drag in legacy GL headers. */
#define GLFW_NO_GLU       /* don't drag in the old GLU lib - unless you must. */
#include <GL/glfw.h>



int init() {
    //init glfw
    if( !glfwInit() )
        return -1;


    //DOES NOT WORK
    //set to version 3.2 & use core profile
    //glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
    //glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
    //glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    //glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    /* Create a windowed mode window and its OpenGL context */
    if (!glfwOpenWindow(1000, 500, 5, 6, 5, 0, 0, 0, GLFW_WINDOW))
        return -1;

    glfwSetWindowTitle( "My Amazing Super Fantastic Window" );


    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float aspect_ratio = ((float)1000) / 500;
    glFrustum(.5, -.5, -.5 * aspect_ratio, .5 * aspect_ratio, 1, 50);
    glMatrixMode(GL_MODELVIEW);

    return 1;
}

int main(int argc, char *argv[])
{
    if( !init() )
        return -1;

    /* Loop until the user closes the window */
    int running = GL_TRUE;
    while (1)
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        // reset view matrix
        glLoadIdentity();
        // move view back a bit
        glTranslatef(0, 0, -30);
        // by repeatedly rotating the view matrix during drawing, the
        // squares end up in a circle
        int i = 0, squares = 15;
        float red = 1, blue = 1, green = 1;
        for (; i < squares; ++i){
            glRotatef(360.0/squares, 0, 0, 1);
            glBegin(GL_QUADS); {
                glColor3f(red, green, blue);
                glVertex2i(1, 11);
                glColor3f(red * .8, green * .8, blue * .8);
                glVertex2i(-1, 11);
                glColor3f(red * .5, green * .5, blue * .5);
                glVertex2i(-1, 9);
                glColor3f(red * .8, green * .8, blue * .8);
                glVertex2i(1, 9);
            } glEnd();
        }


        /* Swap front and back buffers and process events */
        glfwSwapBuffers();
    }

    return 0;
}

答案 2 :(得分:0)

我遇到了同样的问题。我必须在我的VBO之前创建一个VAO,现在它可以在OS X上运行。

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