我想在Mac OS X上使用Xcode来学习《 OpenGL红皮书》,《 OpenGL编程指南》,第8版。
我无法运行第一个代码示例triangles.cpp。我尝试过包括Xcode随附的GLUT和GL框架,并且进行了充分的搜索,发现我不太可能自己解决这个问题。
假设我已全新安装Mac OS X,并且已使用Xcode命令行工具全新安装了Xcode,那么在该环境中能够运行triangles.cpp的逐步说明是什么?
与这个问题不同,我更倾向于不使用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:针对第一个评论,这是幼稚的努力。
结果:“ / Users / xxx / Desktop / Triangles / Triangles / main.cpp:10:10:找不到'vgl.h'文件”
编辑2:添加了vgh转换单元和LoadShaders转换单元,还向我的项目编译/链接添加了libFreeGlut.a和libGlew32.a。将所有OpenGL Book的“包含”内容移到我的项目源目录中。必须更改几个include语句以使用带引号的include而不是有角度的include。感觉这似乎更接近工作了,但是找不到LoadShader.h。请注意,OpenGL下载中的翻译单元称为LoadShaders(复数)。将triangles.cpp更改为引用LoadShaders.h可以解决包含问题,但是该转换单元的内容似乎不匹配从triangles.cpp调用的内容的签名。
关于修复Matthew和Bames53评论中提到的黑窗问题
将着色器定义为字符串
const char * pTriangleVert =“在vec4 vPosition中的#version 410 core \ n \ layout(location = 0); \ n \ void \ n \ main()\ n \ {\ n \ gl_Position = vPosition; \ n \}”;
const char * pTriangleFrag =“ #version 410 core \ n \ out vec4 fColor; \ n \ void \ n \ main()\ n \ {\ n \ fColor = vec4(0.0,0.0,1.0,1.0); \ n \ }“;
我的iMac支持OpenGl 4.1,因此我将版本更改为410
ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, pTriangleVert},
{ GL_FRAGMENT_SHADER, pTriangleFrag },
{ GL_NONE, NULL }
};
typedef struct { GLenum type; const char* filename; GLuint shader; } ShaderInfo;
进入
typedef struct { GLenum type; const char* source; GLuint shader; } ShaderInfo;
修改loadShader函数稍微注释一下有关从文件读取着色器的代码
/*
const GLchar* source = ReadShader( entry->filename );
if ( source == NULL ) {
for ( entry = shaders; entry->type != GL_NONE; ++entry ) {
glDeleteShader( entry->shader );
entry->shader = 0;
}
return 0;
}
glShaderSource( shader, 1, &source, NULL );
delete [] source;*/
进入
glShaderSource(shader,1,&entry-> source,NULL);
您最好打开调试,以防某些着色器编译错误
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句