带有Mac OS X的OpenGL红皮书

马修·詹姆斯·布里格斯

我想在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:针对第一个评论,这是幼稚的努力。

  • 在Mac OS X 10.9.5上打开Xcode 5.1.1
  • 创建一个新的C ++命令行项目。
  • 粘贴main.cpp的内容和triangles.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语句以使用带引号的include而不是有角度的include。感觉这似乎更接近工作了,但是找不到LoadShader.h。请注意,OpenGL下载中的翻译单元称为LoadShaders(复数)。将triangles.cpp更改为引用LoadShaders.h可以解决包含问题,但是该转换单元的内容似乎不匹配从triangles.cpp调用的内容的签名。

gonglong

关于修复Matthew和Bames53评论中提到的黑窗问题

  1. 遵循bames53的答案
  2. 将着色器定义为字符串

    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 }
};
  1. 修改ShaderInfo的结构略有变化

typedef struct { GLenum type; const char* filename; GLuint shader; } ShaderInfo;

进入

typedef struct { GLenum type; const char* source; GLuint shader; } ShaderInfo;

  1. 修改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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Mac OS Cocoa NSOpenGLView中的红皮书中的第一个OpenGL程序

来自分类Dev

编译opengl红皮书9示例

来自分类Dev

了解OpenGL红皮书中的一段代码

来自分类Dev

OpenGL:C语言改编的红皮书示例中的不稳定渲染

来自分类Dev

在带有g ++ 4.8的Mac OS X上编译boost :: program_options(Mac端口)

来自分类Dev

如何从Linux到Mac OS X(带有XForwarding)在“ ssh -X”中运行Emacs?

来自分类Dev

Mac OS X Terminal中带有ÅÄÖ(utf-8)的Python正则表达式

来自分类Dev

Mac OS X Yosemite 10.10上带有Mamp Pro的Mcrypt

来自分类Dev

nginx:在Mac OS X上带有Curl / https的502 Bad Gateway

来自分类Dev

Mac OS X双启动,带有加密的Ubuntu LVM

来自分类Dev

Mac OS X双启动,带有加密的Ubuntu LVM

来自分类Dev

Mac OS X Yosemite 10.10上带有Mamp Pro的Mcrypt

来自分类Dev

带有Synergy 1.8.5 Client的Mac OS X 10.6.8无法单击仪表板或Spotlight

来自分类Dev

Mac OS X使用带有视图控制器的自动布局,并允许调整窗口大小

来自分类Dev

在Mac OS X上使用Git对带有docx2txt的Word .docx文件进行版本控制

来自分类Dev

带有Google App Engine设置的Mac OS-X Eclipse:启动Eclipse时JDK版本错误

来自分类Dev

如何在带有Clang的Mac OS X中从Float 128(尺寸16)中指定Float 80(尺寸10)?

来自分类Dev

在Mac OS X上使用Git对带有docx2txt的Word .docx文件进行版本控制

来自分类Dev

在带有rvm的Mac OS X上使用命令行gem'github-pages-health-check'失败

来自分类Dev

GCC C / C ++ MEX Matlab R2015 Mac OS X(带有OpenMP)不起作用

来自分类Dev

实施DDD(红皮书):为什么他使协作者成为价值对象?

来自分类Dev

红皮书毛皮示例未渲染毛皮(Linux / nvidia gtx675mx)

来自分类Dev

键盘映射-Mac OS X和Mac OS X 10.5+有什么区别?

来自分类Dev

带有Xcode命令行工具的Mac OS X中,哪里安装了clang-format和clang-format.py?

来自分类Dev

Mac OS X-将带有空格的路径名作为参数传递给bashscript,然后发出open Terminal命令

来自分类Dev

Mac OS X-将带有空格的路径名作为参数传递给bashscript,然后发出open Terminal命令

来自分类Dev

Mac OS X上ntfs硬盘驱动器上带有重音符号的文件名“无此文件或目录”

来自分类Dev

带有解析的OS X推送通知

来自分类Dev

CMake在带有Brew的OS X上找不到Boost

Related 相关文章

  1. 1

    Mac OS Cocoa NSOpenGLView中的红皮书中的第一个OpenGL程序

  2. 2

    编译opengl红皮书9示例

  3. 3

    了解OpenGL红皮书中的一段代码

  4. 4

    OpenGL:C语言改编的红皮书示例中的不稳定渲染

  5. 5

    在带有g ++ 4.8的Mac OS X上编译boost :: program_options(Mac端口)

  6. 6

    如何从Linux到Mac OS X(带有XForwarding)在“ ssh -X”中运行Emacs?

  7. 7

    Mac OS X Terminal中带有ÅÄÖ(utf-8)的Python正则表达式

  8. 8

    Mac OS X Yosemite 10.10上带有Mamp Pro的Mcrypt

  9. 9

    nginx:在Mac OS X上带有Curl / https的502 Bad Gateway

  10. 10

    Mac OS X双启动,带有加密的Ubuntu LVM

  11. 11

    Mac OS X双启动,带有加密的Ubuntu LVM

  12. 12

    Mac OS X Yosemite 10.10上带有Mamp Pro的Mcrypt

  13. 13

    带有Synergy 1.8.5 Client的Mac OS X 10.6.8无法单击仪表板或Spotlight

  14. 14

    Mac OS X使用带有视图控制器的自动布局,并允许调整窗口大小

  15. 15

    在Mac OS X上使用Git对带有docx2txt的Word .docx文件进行版本控制

  16. 16

    带有Google App Engine设置的Mac OS-X Eclipse:启动Eclipse时JDK版本错误

  17. 17

    如何在带有Clang的Mac OS X中从Float 128(尺寸16)中指定Float 80(尺寸10)?

  18. 18

    在Mac OS X上使用Git对带有docx2txt的Word .docx文件进行版本控制

  19. 19

    在带有rvm的Mac OS X上使用命令行gem'github-pages-health-check'失败

  20. 20

    GCC C / C ++ MEX Matlab R2015 Mac OS X(带有OpenMP)不起作用

  21. 21

    实施DDD(红皮书):为什么他使协作者成为价值对象?

  22. 22

    红皮书毛皮示例未渲染毛皮(Linux / nvidia gtx675mx)

  23. 23

    键盘映射-Mac OS X和Mac OS X 10.5+有什么区别?

  24. 24

    带有Xcode命令行工具的Mac OS X中,哪里安装了clang-format和clang-format.py?

  25. 25

    Mac OS X-将带有空格的路径名作为参数传递给bashscript,然后发出open Terminal命令

  26. 26

    Mac OS X-将带有空格的路径名作为参数传递给bashscript,然后发出open Terminal命令

  27. 27

    Mac OS X上ntfs硬盘驱动器上带有重音符号的文件名“无此文件或目录”

  28. 28

    带有解析的OS X推送通知

  29. 29

    CMake在带有Brew的OS X上找不到Boost

热门标签

归档