2015-01-08 18 views
6

Tôi đang học lập trình OpenGL với Hướng dẫn lập trình OpenGL cuốn sách. Nhưng tôi không thể chạy các ví dụ trong cuốn sách với Macbook của tôi. Luôn có hàng tá lỗi khi chạy ngay cả khi xử lý Tam giác mẫu đầu tiên. Tôi tự hỏi tôi nên làm gì để chạy các ví dụ trong Sách Đỏ với Xcode.Cách chạy các ví dụ trong Hướng dẫn lập trình OpenGL trên máy Mac bằng Xcode

[nền tảng thông tin]
Macbook Air, OS X 10.10, Xcode 6.1

[Tôi đã thử làm gì]
1. Tôi đã xóa appdelegate. * Và main.m, và sau đó tạo ra một tập tin cpp tam giác .cpp và sao chép mã nguồn vào nó. (Mã nguồn sẽ được đính kèm ở cuối)
2. Tôi đã thêm OpenGL.framework.
3. Tôi đã cài đặt glew theo cách thủ công và thêm đường dẫn tương ứng vào Đường dẫn tìm kiếm tiêu đề và Đường dẫn tìm kiếm thư viện. Và thêm -lGLEW vào các Cờ Liên kết Khác.
4. Tôi đã cài đặt freeglut theo cách thủ công, thêm đường dẫn tương ứng vào Đường dẫn Tìm kiếm Tiêu đề và Đường dẫn Tìm kiếm Thư viện và thêm -lGLUT vào Cờ Liên kết Khác, chỉ dưới hướng dẫn của hướng dẫn OpenGL của Lazy Foo.
5. Tôi đã thêm thư mục mã nguồn được đính kèm vào Sổ đỏ vào Đường dẫn tìm kiếm tiêu đề và Đường dẫn tìm kiếm thư viện để Xcode có thể tìm thấy "vgl.h" và "LoadShaders.h". Và LoadShaders.cpp đã được thêm vào dự án.

Lý do tôi đã làm bước 3 và 4 là làm cho biên dịch thành công, nếu không, tôi sẽ nhận được rất nhiều lỗi như:

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

Bằng cách này, tuy nhiên, biên dịch là OK, nhưng có một lỗi khi tôi chạy nó:

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 

Tôi thực sự tự hỏi cách đúng để chạy các ví dụ trong Sổ đỏ trên Mac OS X!

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(); 
} 

Trả lời

0

Nếu bạn không nhớ làm việc trong C# sau đó nhìn vào OpenTK, nó là một wrapper OpenGL cho Mono và Net. Tôi đã không thử nó với Xcode, nhưng nó hoạt động tốt trong Xamarin Studio.

Nếu bạn đi con đường Xamarin, có hai lựa chọn:

1) Tải the latest OpenTK release và tham khảo OpenTK.dll
2) Sử dụng các OpenTK kèm Xamarin, hướng dẫn here.

Tôi khuyên bạn nên tải xuống phiên bản bên ngoài, có vô số ví dụ hữu ích được bao gồm. Tuy nhiên, nếu bạn muốn sử dụng các tính năng hiện đại, bạn phải chỉ định rõ số phiên bản OpenGL trong hàm khởi tạo. Tuy nhiên, nếu bạn muốn sử dụng các tính năng hiện đại, bạn phải chỉ định rõ số phiên bản OpenGL trong hàm khởi tạo.

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

Ví dụ về Sổ đỏ sẽ không chạy trực tiếp trong OpenTK, nhưng các cuộc gọi GL giống nhau, cú pháp chỉ cần sửa đổi. Tôi thấy blog của Neo Kabuto là tốt nhất cho các hướng dẫn OpenTK, và sau một thời gian, bạn sẽ có thể viết lại mã Red Book trong TK.

Đây có thể không phải là câu trả lời bạn đang tìm kiếm, nhưng đó là cách tôi giải quyết vấn đề.

Các vấn đề liên quan