如何使用Xcode在Mac上的OpenGL编程指南中运行示例

时间:2015-01-08 08:20:19

标签: xcode opengl

我正在学习OpenGL编程指南中的OpenGL编程。但我不能用我的Macbook运行书中的例子。甚至在处理第一个示例三角形时,总会有很多错误。我想知道如何使用Xcode在Red Book中运行示例。

[平台信息]
Macbook Air,OS X 10.10,Xcode 6.1

[我尝试了什么]
1.我删除了AppDelegate。*和main.m,然后创建了一个cpp文件triangles.cpp并将源代码复制到其中。(源代码将附在最后)
2.我添加了OpenGL.framework 3.我手动安装了glew,并添加了相应的路径到标题搜索路径和库搜索路径。并将-lGLEW添加到其他链接器标志中 4.我手动安装了freeglut,添加了相应的路径搜索路径和库搜索路径,并将-lGLUT添加到其他链接器标志,只是在Lazy Foo的OpenGL教程的指导下。
5.我将附加到红皮书的源代码目录添加到标题搜索路径和库搜索路径中,以便Xcode可以找到“vgl.h”和“LoadShaders.h”。并且LoadShaders.cpp已添加到项目中。

我做第3步和第4步的原因是让编译成功,否则,我会收到很多错误,例如:

Undefined symbols for architecture x86_64:
      "_glutInitContextProfile", referenced from:
          _main in main.o

然而,通过这种方式,编译没问题,但是当我运行它时出错:

X Error of failed request:  BadRequest (invalid request code or no such operation)
  Major opcode of failed request:  34 (X_UngrabKey)
  Serial number of failed request:  29
  Current serial number in output stream:  29
Program ended with exit code: 1

我真的很想知道在Mac OS X上运行Red Book中的示例的正确方法是什么!

triangles.cpp:

#include <iostream>
using namespace std;

#include "vgl.h"
#include "LoadShaders.h"

enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers};
enum Attrib_IDs { vPosition = 0};

GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];

const GLuint NumVertices = 6;

void init(void)
{
    glGenVertexArrays(NumVAOs, VAOs);
    glBindVertexArray(VAOs[Triangles]);

    GLfloat vertices[NumVertices][2] = {
        {-0.90, -0.90},
        {0.85, -0.90},
        {-0.90, 0.85},
        {0.90, -0.85},
        {0.90, 0.90},
        {-0.85, 0.90}
    };

    glGenBuffers(NumBuffers, Buffers);
    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    ShaderInfo shaders[] = {
        {GL_VERTEX_SHADER, "triangles.vert"},
        {GL_FRAGMENT_SHADER, "triangles.frag"},
        {GL_NONE, NULL}
    };

    GLuint program = LoadShaders(shaders);
    glUseProgram(program);

    glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
    glEnableVertexAttribArray(vPosition);
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(VAOs[Triangles]);
    glDrawArrays(GL_TRIANGLES, 0, NumVertices);

    glFlush();
}

int main(int argc, char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512, 512);
    glutInitContextVersion(4, 3);
    glutInitContextProfile(GLUT_CORE_PROFILE);
    glutCreateWindow(argv[0]);

    if(glewInit())
    {
        cerr << "Unable to initialize GLEW ... exiting" << endl;
        exit(EXIT_FAILURE);
    }

    init();
    glutDisplayFunc(display);
    glutMainLoop();
}

1 个答案:

答案 0 :(得分:0)

如果您不介意使用C#,那么请查看OpenTK,它是Mono和.Net的OpenGL包装器。我没有尝试使用Xcode,但它在Xamarin Studio中运行得非常好。

如果你去Xamarin路线,有两种选择:

1)下载the latest OpenTK release并参考OpenTK.dll
2)使用Xamarin附带的OpenTK,说明here

我建议下载外部版本,包含大量有用的示例。

值得注意的是,在MacOS上,GameWindow构造函数默认使用OpenGL 2.1(不在Windows上),因此如果要使用现代功能,则必须在构造函数中明确指定OpenGL版本号。 / p>

public Game() : base(800, 600, new GraphicsMode(new ColorFormat(8), 3, 3, 4), "Welcome To Hell", GameWindowFlags.Default, DisplayDevice.Default, 3, 0, GraphicsContextFlags.Default)
{
}

Red Book示例不会直接在OpenTK中运行,但GL调用是相同的,语法只需要修改。我发现Neo Kabuto的博客最适合OpenTK教程,在没有时间之后,你将能够用TK重写红皮书代码。

这可能不是你想要的答案,但这就是我解决问题的方法。