2013-03-11 2 views
1

Я занимаюсь разработкой OpenGL/C для университета (у меня есть опыт работы в WebGL). Код, приведенный ниже, в основном основан на учебниках gltut (которые не будут работать на OSX - нужны OGL 3.3) и NeHe. Моя проблема в том, что бы ни было, единственное, что нарисовано, это начальное окно, заполненное одним цветом (изменение цвета в цикле while работает, поэтому цикл работает правильно). Однако треугольник и квадроцикл вообще не появляются. Я исправлял это в течение последних 5 часов, и я не больше, чем когда начал. Любая помощь будет принята с благодарностью!OpenGL/OSX/GLFW: ничего, кроме цвета окна

Использование: OpenGL3.2, последнее GLFW (2.7.7)

Компиляция с помощью: НКУ main.c -I/USR/местные/включают -I/Opt/X11/включают -L/USR/local/lib -I/opt/X11/lib -w -framework OpenGL -framework Cocoa -framework IOKit -lglfw -o test

Код в моих комментариях ниже работает.

+0

Вы можете попробовать рисунок его один раз, а затем делать 'в то время как (1);' Это может быть просто, что постоянно перерисовывать не давая ему шанс показать на экране. (Возможно, вы захотите использовать FreeGLUT или что-то вместо этого так). –

+0

Основной профиль на OS X не поддерживает команды немедленного/фиксированного конвейера. –

+0

Если у вас возникли проблемы или вам нужно что-то ссылаться, я работаю над портированием руководств NeHe для glfw, вы можете найти подробную информацию на моем [сайте] (http://www.pjreddie.com/projects/nehe-tutorials -Использование-glfw /). – pjreddie

ответ

2

Кажется, что вы не инициализируете свои матрицы - ни проекция, ни модель.

И даже если матрицы по умолчанию были, по вашему мнению, разумными для ваших целей, то вы постоянно применяете переводы, что очень быстро приведет к тому, что все будет вне экрана.

+0

Спасибо! Не могу поверить, что я пропустил это - слишком много часов смотрел на него – Fizzadar

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; 
} 
0

Я столкнулся с той же проблемой. Я должен был создать ВАО перед моим ВБО-х, и теперь он работает на OS X.

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