【发布时间】:2016-03-26 22:17:42
【问题描述】:
我想在 Mac OS X 上使用 Xcode 完成 OpenGL 红皮书The OpenGL Programming Guide, 8th edition。
我无法运行第一个代码示例 triangles.cpp。我已经尝试包含 Xcode 附带的 GLUT 和 GL 框架,并且我已经搜索了足够多的内容,发现我不太可能自己解决这个问题。
假设我全新安装了 Mac OS X,并且我使用 Xcode 命令行工具全新安装了 Xcode,能够运行三角形的分步说明是什么。 cpp 在那个环境中?
与this 问题不同,我的偏好是不 使用 Cocoa、Objective-C 或 Swift。我的偏好是只留在 C++/C 中。只有当我可以一步一步地遵循它并最终得到一个正在运行的 triangles.cpp 程序时,答案才是正确的。
我的首选是 Mac OS X 10.9,但正确答案可以假设为 10.9、10.10 或 10.11。
谢谢。
///////////////////////////////////////////////////////////////////////
//
// triangles.cpp
//
///////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
#include "vgl.h"
#include "LoadShader.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;
//---------------------------------------------------------------------
//
// init
//
void
init(void)
{
glGenVertexArrays(NumVAOs, VAOs);
glBindVertexArray(VAOs[Triangles]);
GLfloat vertices[NumVertices][2] = {
{ -0.90, -0.90 }, // Triangle 1
{ 0.85, -0.90 },
{ -0.90, 0.85 },
{ 0.90, -0.85 }, // Triangle 2
{ 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);
}
//---------------------------------------------------------------------
//
// display
//
void
display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAOs[Triangles]);
glDrawArrays(GL_TRIANGLES, 0, NumVertices);
glFlush();
}
//---------------------------------------------------------------------
//
// main
//
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]);
glewExperimental = GL_TRUE;
if (glewInit()) {
cerr << "Unable to initialize GLEW ... exiting" << endl;
exit(EXIT_FAILURE);
}
init();
glutDisplayFunc(display);
glutMainLoop();
}
编辑 1: 回应第一条评论,这是天真的努力。
- 在 Mac OS X 10.9.5 上打开 Xcode 5.1.1
- 创建一个新的 C++ 命令行项目。
- 用 triangles.cpp 的内容粘贴 main.cpp 的内容。
- 单击项目 -> 构建阶段 -> 将二进制文件与库链接
- 添加 OpenGL.framework 和 GLUT.framework
结果:“/Users/xxx/Desktop/Triangles/Triangles/main.cpp:10:10: 'vgl.h' 文件未找到”
编辑 2: 添加了 vgh 翻译单元和 LoadShaders 翻译单元,还将 libFreeGlut.a 和 libGlew32.a 添加到我的项目编译/链接中。将所有 OpenGL Book 的 Include 内容移至我的项目源目录。必须更改几个包含语句以使用带引号的包含而不是有角度的包含。感觉这更接近工作,但找不到 LoadShader.h。请注意,OpenGL 下载中的翻译单元称为 LoadShaders(复数)。将 triangles.cpp 更改为引用 LoadShaders.h 修复了包含问题,但该翻译单元的内容似乎与从 triangles.cpp 调用的内容的签名不匹配。
【问题讨论】:
-
您面临的问题是什么?是否存在编译器错误或链接器错误?还没开始吗?
-
我不倾向于用我的锤子来解决这个问题(我目前无法验证它是否解决了问题)但我认为这个问题已经回答了here。跨度>
-
查看this answer,问题可能与您的包含有关。试试
#include <OpenGL/vgl.h> -
我现在正在关注这些线索,同时请不要关闭这个问题。这些链接都不是让它工作的分步指南,这可能对其未来的其他人有价值。
-
我认为对 LoadShaders() 的调用应该只是
LoadShaders(shaders)。shaders已经是ShaderInfo*类型。