Код OpenGL Работает в Windows, но не в Mac

0

Моя школа использует компьютеры с Windows, но у меня есть только домашний компьютер. Код отлично работает в Windows, но по какой-то причине я получаю ошибки, выполняемые в xCode. Я не был уверен, какие рамки включить, поэтому я добавил GLKit, Cocoa, GLUT и OpenGL. Я что-то упускаю?? Я хотел бы получить настройку Xcode, чтобы я мог работать над домашним заданием с тем же кодом, который будет работать на окнах. Вот код

#include <stdio.h>
#include <stdarg.h>
#include <math.h>
#define GL_GLEXT_PROTOTYPES
#ifdef __APPLE__
    #include <GLUT/glut.h>
#else
    #include <GL/glut.h>
#endif

#define GLUT_KEY_ESCAPE 27

const GLsizei windowWidth = 500;
const GLsizei windowHeight = 500;

GLfloat cubeRotateX = 45.0f;
GLfloat cubeRotateY = 45.0f;
bool keys[255];

GLvoid establishProjectionMatrix(GLsizei width, GLsizei height)
{
    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 200.0f);
}

GLvoid initGL(GLsizei width, GLsizei height)
{
    establishProjectionMatrix(width, height);

    glShadeModel(GL_SMOOTH);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glEnable(GL_PERSPECTIVE_CORRECTION_HINT);
}

GLvoid displayFPS(GLvoid)
{
    static long lastTime = glutGet(GLUT_ELAPSED_TIME);
    static int loops = 0;
    static GLfloat fps = 0.0f;

    int newTime = glutGet(GLUT_ELAPSED_TIME);

    if (newTime - lastTime > 100)
    {
        float newFPS = (float)loops / float(newTime - lastTime) * 1000.0f;
        fps = (fps + newFPS) / 2.0f;

        char title[80];
        sprintf_s(title, "OpenGL Demo - %.2f", fps);
        glutSetWindowTitle(title);

        lastTime = newTime;
        loops = 0;
    }
    loops++;
}

GLvoid drawScene(GLvoid)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(0, 0, -5.0f);
    glRotatef(cubeRotateX, 1.0, 0.0, 0.0);
    glRotatef(cubeRotateY, 0.0, 1.0, 0.0);

    glBegin(GL_QUADS);
    glColor3f(0.0f, 1.0f, 1.0f);
    glVertex3f( 1.0f,  1.0f, -1.0f);
    glVertex3f(-1.0f,  1.0f, -1.0f);
    glVertex3f(-1.0f,  1.0f,  1.0f);
    glVertex3f( 1.0f,  1.0f,  1.0f);

    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f( 1.0f, -1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f,  1.0f);
    glVertex3f( 1.0f, -1.0f,  1.0f);

    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f( 1.0f,  1.0f, 1.0f);
    glVertex3f(-1.0f,  1.0f, 1.0f);
    glVertex3f(-1.0f, -1.0f, 1.0f);
    glVertex3f( 1.0f, -1.0f, 1.0f);

    glColor3f(1.0f, 1.0f, 0.0f);
    glVertex3f( 1.0f,  1.0f, -1.0f);
    glVertex3f(-1.0f,  1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f( 1.0f, -1.0f, -1.0f);

    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(-1.0f,  1.0f,  1.0f);
    glVertex3f(-1.0f,  1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f,  1.0f);

    glColor3f(1.0f, 0.0f, 1.0f);
    glVertex3f( 1.0f,  1.0f,  1.0f);
    glVertex3f( 1.0f,  1.0f, -1.0f);
    glVertex3f( 1.0f, -1.0f, -1.0f);
    glVertex3f( 1.0f, -1.0f,  1.0f);
    glEnd();

    glFlush();

    glutSwapBuffers();

    displayFPS();
}
GLboolean checkKeys(GLvoid)
{
    const GLfloat speed = 1.0f;

    if ( keys[GLUT_KEY_ESCAPE] )
        return true;

    if (keys[GLUT_KEY_LEFT])
        cubeRotateY -= speed;
    if (keys[GLUT_KEY_RIGHT])
        cubeRotateY += speed;
    if (keys[GLUT_KEY_UP])
        cubeRotateX -= speed;
    if (keys[GLUT_KEY_DOWN])
        cubeRotateX += speed;

    return false;
}
GLvoid timerLoop(int value)
{
    if (checkKeys())
        exit(0);
    glutPostRedisplay();

    glutTimerFunc(1, timerLoop, 0);
}



GLvoid keyboardCB(unsigned char key, int x, int y)
{
    keys[key] = true;
}
GLvoid keyboardUpCB(unsigned char key, int x, int y)
{
    keys[key] = false;
}
GLvoid keyboardSpecialCB(int key, int x, int y)
{
    keys[key] = true;
}
GLvoid keyboardSpecialUpCB(int key, int x, int y)
{
    keys[key] = false;
}




int main(int argc, char** argv)
{
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE);

    int windowID = glutCreateWindow("OpenGL Cube Demo");
    glutReshapeWindow(windowWidth, windowHeight);

    initGL(windowWidth, windowHeight);

    glutDisplayFunc(drawScene);

    glutKeyboardFunc(keyboardCB);
    glutKeyboardUpFunc(keyboardUpCB);
    glutSpecialFunc(keyboardSpecialCB);
    glutSpecialUpFunc(keyboardSpecialUpCB);

    glutTimerFunc(1, timerLoop, 0);

    glutMainLoop();
    return 0;

}

Изображение 174551Изображение 174551

Почему это работает в visual studio, а не в Xcode??

Теги:
xcode
macos
opengl

1 ответ

1

Ошибки компилятора кажутся довольно ясными. Поверхностная причина, по которой это не работает, состоит в том, что этот код содержит Windows-isms, которые не переносимы.

  • C++ не позволяет typedef of void указывать пустой список параметров. Вы должны использовать void. Итак, просто изменили эти GLvoid на void s.

  • sprintf_s() - это функция, специфичная для Windows. Вы можете заменить его на snprintf(), но вам нужно добавить параметр после буфера, размер буфера. Итак, замените это:

    sprintf_s(title, ...);
    

    с:

    snprintf(title, sizeof(title), ...);
    
  • Функция exit() доступна кросс-платформенной, но вы должны включить правый заголовок. Добавьте #include <stdlib.h> в верхней части файла.

  • 0
    Спасибо! ты обалденный! Так что, если я изменю это, тогда это все еще будет работать на окнах? У меня нет возможности проверить это на Windows, и это то, что мой учитель будет оценивать.
  • 0
    Да, так и должно быть.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню