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