Xcode搭建OpenGL环境(m1芯片、Xcode13)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcode搭建OpenGL环境(m1芯片、Xcode13)相关的知识,希望对你有一定的参考价值。
参考技术A 首先,搭建前需要如下几个库:如果是M1芯片,编译会报这个错
此时只要在Bulid Settings -> Exclude Archiectures 添加 arm64即可
创建一个 c++ 类型的文件,命名为 main,创建的时候去掉勾选同时创建头文件的对勾。
如有一下报错
重新引入即可
运行结果
OpenGL——环境搭建
转载自:http://johnhany.net/2014/01/environment-for-opengl-with-vs2010/
OpenGL 简介
OpenGL(Open Graphics Library)是一个开放的、跨编程语言、跨平台的API库,提供了大量的针对图形硬件的软件接口,主要用于绘制高性能的二维和三维图形。它的一个子集OpenGL ES主要针对嵌入式系统,比如手机、平板等,目前也开始流行起来。
GLSL(OpenGL Shading Language)是OpenGL 2.0版本开始引入的编程语言,用来编写运行在GPU上的着色程序,以代替之前所采用的固定功能管线(fixed-function pipeline)。直到3.x版本起,固定功能管线被彻底弃用,而完全被基于着色器(shader)的新功能所代替。OpenGL 3.0是最后一个同时存在新老两种功能的版本。
目前OpenGL最新版本是4.4,GLSL的最新版本是4.4。
由于OpenGL本身只包含涉及渲染的核心函数,而不包括平台相关的UI、文件输入输出、键盘鼠标交互等功能,在不同平台上一般采用不同的扩展库来辅助开发。在UNIX、Linux和Mac OS X平台上一般采用GLUT库实现图形界面,但已经很久没有更新了;在Windows平台上,freeglut会更实用一些。因为调用OpenGL的函数时需要频繁地调用和管理函数指针,可以使用GLEW代替这些繁琐的操作,而且GLEW还会根据你的平台决定使用哪些扩展。
检查兼容性
OpenGL版本众多,而且各显卡厂商也有自己开发的扩展库。要想使用某个版本进行开发,既需要显卡本身支持所需的功能,又需要驱动程序能兼容这个版本。决定使用哪一个版本之前,先要用GPU Caps Viewer检查一下支持的OpenGL和GLSL的最高版本和具体支持哪些扩展。我的笔记本比较老,仅能支持OpenGL 3.0和GLSL 1.3。
准备文件
在http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip下载GLUT;
在https://sourceforge.net/projects/glew/files/glew/1.10.0/glew-1.10.0-win32.zip/download下载GLEW。
可以在http://www.transmissionzero.co.uk/software/freeglut-devel/下载freeglut。为了尽可能减少干扰因素,下文的样例程序没有用freeglut,而仅使用GLUT库。
把解压得到的glutdlls37beta文件夹中的glut.h,和glew-1.10.0-win32\\glew-1.10.0\\include\\GL文件夹中的glew.h、glxew.h、wglew.h共4个文件拷贝到C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Include\\gl目录下。(粗体的2个文件是必需的)
把解压得到的glutdlls37beta文件夹中的glut.lib、glut32.lib,和glew-1.10.0-win32\\glew-1.10.0\\lib\\Release\\Win32文件夹中的glew32.lib、glew32s.lib,还有glew-1.10.0-win32\\glew-1.10.0\\lib\\Release MX\\Win32文件夹中的glew32mx.lib、glew32mxs.lib共6个文件拷贝到C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Lib目录下。(粗体的3个文件是必需的)
把解压得到的glutdlls37beta文件夹中的glut.dll、glut32.dll,和glew-1.10.0-win32\\glew-1.10.0\\bin\\Release\\Win32文件夹中的glew32.dll拷贝到C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\bin目录下。(粗体的2个文件是必需的)
如果发现这样运行下面的样例代码时提示缺少lib或dll文件,可以参考这篇文档修改添加文件的位置。
所需的文件也可以在这里下载。
如果想使用freeglut,其.h、.lib和.dll文件的位置与GLUT和GLEW是相同的。
配置工程
打开Visual Studio 2010,新建一个Visual C++的Win32 Console Application,选项使用默认的,即Application Type为Console Application,Additional Options选Precompiled Header,其他选项都不勾选。
打开项目Properties窗口,找到Configuration Properties -> Linker -> Input ->Additional Dependencies,添加glew32.lib。如果使用了freeglut,还要添加freeglut.lib。
如果还使用了freeglut库,还需要在Configuration Properties -> VC++ Directories -> Include Directories中增加 C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Include\\freeglut。
样例代码
把下面的代码粘贴到main.cpp文件(如果使用了 fleeglut,需要把第 8 行的“gl/glut.h”改为“freeglut.h”):
#include <stdafx.h>
#include <stdio.h>
#include <stdlib.h>
#include <gl/glew.h>
#ifdef __APPLE__
# include <gl/glut.h>
#else
# include <gl/glut.h>
#endif
static struct
GLuint vertex_buffer, element_buffer, color_buffer;
GLuint vertex_shader, fragment_shader, program;
//用于保存CPU端的object名称
struct
GLint position;
GLint inColor;
attributes;
//用于保存GPU端attribute变量的地址
names;
static const GLfloat position_data[] =
0.0, 0.6,
-0.6, -0.4,
0.6, -0.4
;
static const GLfloat color_data[] =
1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 1.0
;
static const GLushort element_data[] = 0, 1, 2 ;
static void infoLog(GLuint object, PFNGLGETSHADERIVPROC glGet__iv, PFNGLGETSHADERINFOLOGPROC glGet__InfoLog)
GLint log_length;
char *log;
glGet__iv(object, GL_INFO_LOG_LENGTH, &log_length);
log = (char *)malloc(log_length);
glGet__InfoLog(object, log_length, NULL, log);
fprintf(stderr, "%s", log);
free(log);
void *readShader(const char *filename, GLint *length)
FILE *f = fopen(filename, "r");
void *buffer;
if (!f)
fprintf(stderr, "Unable to open %s for reading\\n", filename);
return NULL;
fseek(f, 0, SEEK_END);
*length = ftell(f);
fseek(f, 0, SEEK_SET);
buffer = malloc(*length+1);
*length = fread(buffer, 1, *length, f);
fclose(f);
((char*)buffer)[*length] = '\\0';
return buffer;
static GLuint initShader(GLenum type, const char *filename)
GLint length;
GLchar *source = (GLchar *)readShader(filename, &length);
GLuint shader;
GLint shader_ok;
if (!source)
return 0;
shader = glCreateShader(type);
//创建shader object
glShaderSource(shader, 1, (const GLchar**)&source, &length);
//导入shader的代码
//count - string的行数
//length - 指向包含string每行字数的数组
free(source);
glCompileShader(shader);
//编译shader代码
glGetShaderiv(shader, GL_COMPILE_STATUS, &shader_ok);
//查询shader的状态,导出可能的编译错误
if (!shader_ok)
fprintf(stderr, "Failed to compile %s:\\n", filename);
infoLog(shader, glGetShaderiv, glGetShaderInfoLog);
glDeleteShader(shader);
getchar();
return shader;
static void installShaders(void)
names.vertex_shader = initShader(GL_VERTEX_SHADER, "HelloWorld-vs.glsl");
names.fragment_shader = initShader(GL_FRAGMENT_SHADER, "HelloWorld-fs.glsl");
GLint program_ok;
names.program = glCreateProgram();
glAttachShader(names.program, names.vertex_shader);
glAttachShader(names.program, names.fragment_shader);
//把shader依附在同一个program上,以连接两个shader
glLinkProgram(names.program);
//链接program,在GPU端创建相应可执行文件,并初始化uniform变量及其地址
glGetProgramiv(names.program, GL_LINK_STATUS, &program_ok);
//查询program的状态,并导出可能的错误
if (!program_ok)
fprintf(stderr, "Failed to link shader program:\\n");
infoLog(names.program, glGetProgramiv, glGetProgramInfoLog);
glDeleteProgram(names.program);
getchar();
glUseProgram(names.program);
//激活program后才能为shader指定uniform变量的值
static void initBuffers(void)
names.attributes.position = glGetAttribLocation(names.program, "position");
names.attributes.inColor = glGetAttribLocation(names.program, "inColor");
//获取GPU端attribute变量的地址保存在本地变量中,用于值的传递
glGenBuffers(1, &names.vertex_buffer);
//产生1个buffer object的名称,并分配显存空间
glBindBuffer(GL_ARRAY_BUFFER, names.vertex_buffer);
//把产生的buffer object与相应target绑定,以改变其值
glBufferData(GL_ARRAY_BUFFER, sizeof(position_data), position_data, GL_STATIC_DRAW);
//GL_STATIC_DRAW其他可用参数:
//STATIC - 长时间不更改的值 DYNAMIC - 需要频繁改变的值 STREAM - 需要偶尔重写整个buffer的值
//DRAW - 保存于GPU用于绘制的值 READ - 保存于CPU用于读取的值 COPY - 折衷
glVertexAttribPointer(names.attributes.position, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*2, (void*)0);
glEnableVertexAttribArray(names.attributes.position);
glGenBuffers(1, &names.color_buffer);
glBindBuffer(GL_ARRAY_BUFFER, names.color_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(color_data), color_data, GL_STATIC_DRAW);
glVertexAttribPointer(names.attributes.inColor, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*4, (void*)0);
glEnableVertexAttribArray(names.attributes.inColor);
glGenBuffers(1, &names.element_buffer);
glBindBuffer(GL_ARRAY_BUFFER, names.element_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(element_data), element_data, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, names.element_buffer);
static void idleFunc(void)
static void displayFunc(void)
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glDrawElements(GL_TRIANGLE_STRIP, 3, GL_UNSIGNED_SHORT, (void*)0);
glutSwapBuffers();
int main(int argc, char** argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(400, 400);
glutCreateWindow("Hello World");
glutIdleFunc(&idleFunc);
glutDisplayFunc(&displayFunc);
glewInit();
if (!GLEW_VERSION_2_0)
fprintf(stderr, "OpenGL 2.0 not available\\n");
getchar();
//与glew扩展库相关的函数要在glewInit()后执行
installShaders();
initBuffers();
glutMainLoop();
return 0;
在工程内新建一个名为HelloWorld-vs.glsl的文件,内容如下:
#version 130
attribute vec2 position;
attribute vec4 inColor;
varying vec4 outColor;
void main()
gl_Position = vec4(position, 0.0, 1.0);
outColor = inColor;
再新建一个名为HelloWorld-fs.glsl的文件,内容如下:
#version 130
varying vec4 outColor;
void main()
gl_FragColor = outColor;
运行结果
以上是关于Xcode搭建OpenGL环境(m1芯片、Xcode13)的主要内容,如果未能解决你的问题,请参考以下文章
M1芯片XCode 12编译模拟器Architecture报错问题