OpenGL 代码适用于 Windows 但不适用于 Mac
Posted
技术标签:
【中文标题】OpenGL 代码适用于 Windows 但不适用于 Mac【英文标题】:OpenGL code Works in Windows but not Mac 【发布时间】:2013-10-06 15:50:03 【问题描述】:我的学校使用 windows 电脑,但我家里只有 mac。 该代码在 Windows 中运行良好,但由于某种原因,我在 xCode 中运行它时出错。 我不确定要包含哪些框架,所以我添加了 GLKit、Cocoa、GLUT 和 OpenGL。 我错过了什么吗? 我想设置 Xcode,这样我就可以使用与 Windows 相同的代码来做作业。 这是代码
#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;
为什么它在 Visual Studio 中有效,而在 Xcode 中无效?
【问题讨论】:
“由于某种原因,我在 xCode 中运行它时出错。” - 我们需要知道这些错误是什么。 【参考方案1】:编译器的错误看起来很清楚。它不起作用的表面原因是因为此代码包含不可移植的 Windows 主义。
C++ 不允许 void
的 typedef 指示空参数列表。您必须使用 void
本身。因此,只需将那些 GLvoid
s 更改为 void
s。
sprintf_s()
是一个特定于 Windows 的函数。你可以用snprintf()
替换它,但是你必须在缓冲区之后添加一个参数,它是缓冲区的大小。所以,替换这个:
sprintf_s(title, ...);
与:
snprintf(title, sizeof(title), ...);
exit()
函数可跨平台使用,但您必须包含正确的标题。在文件顶部附近添加#include <stdlib.h>
。
【讨论】:
谢谢!你太棒了!所以如果我改变它那么它仍然可以在 Windows 上工作吗?我无法在 Windows 上对其进行测试,这就是我的老师将要评分的内容。 @iEpic 是的,snprintf()
在 standard 中,只记得在退出时包含 <cstdio>
和 <cstdlib>
。请注意,<c*****>
标头中的函数位于 std::
命名空间中。以上是关于OpenGL 代码适用于 Windows 但不适用于 Mac的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL ES 2.0 适用于 Windows 和 Linux,但不适用于 Mac
OpenGL代码适用于GLFW,但不适用于Qt OpenGL
Opengl Array Texture,适用于原始数据,但不适用于图像数据
部分视图部分适用于 JQuery,但不完全适用于 C# ASP.Net MVC 5