1

我正在为大学做一些 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 测试

我下面评论中的代码有效。

4

3 回答 3

2

您似乎没有初始化您的矩阵 - 既不是投影,也不是模型视图。

即使默认矩阵偶然地对您的目的来说是合理的,您也会不断地应用翻译,这将很快导致无论如何事情都在屏幕外。

于 2013-03-11T21:36:34.140 回答
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;
}
于 2013-03-12T11:37:50.617 回答
0

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

GLuint vertex_array;
glGenVertexArrays(1, &vertex_array);
glBindVertexArray(vertex_array);
于 2013-04-12T00:07:32.817 回答