今天奔着编过能跑的原则配置了OpenGL超级宝典的环境
版本说明
Mac OS X : 12.1
GLFW : 3.3.6
GLEW : 2.1.0
环境配置
- 配置cmake,后面用来部署GLFW用的。
- 配置Command Line Tool,也是用来编GLFW的,不然cmake会失败
$ xcode-select --install
- GLFW+GLEW环境配置,GLFW+GLAD环境配置有详细教程,我就偷个懒不再赘述
- 创建好Command Line Tool工程,配置searchpath时header search paths不能设置为递归,我本机环境很混乱,配置递归后会导致各种莫名其妙的编译错误
- 设置compile sources为Objective-C++,我这边出现了unknown type name 'NSString’的错误,这样设置就可以了
- 将书上的资源拷贝进来,在书上目录前一页有本书的配套资源下载教程(我看的是译版,如果有大佬看原版请忽略),下载地址,或者去异步社区搜索opengl超级宝典,然后点击配套资源就可以看到资源下载链接,这里有点坑要登陆才能跳转下载链接
- 拷贝配置资源里的一些代码到自己的项目里,我这边的文件目录如下
- 为了编译通过我把一些报错的尖括号的include改为双引号,这里需要一个一个改好
- 可能是我的卡只支持到410,大家可以在appstore下载glview查看自己的opengl版本号,glCreateVertexArrays是4.5才有所以不能用,只能用glGenVertexArrays替换,shader的version不能和书上一样为450,我这里用的是330,下面附一份代码
#include "sb7.h"
GLuint compile_shaders(void)
{
GLuint vertex_shader;
GLuint fragment_shader;
GLuint program;
// static const GLchar * vertex_shader_source[] =
// {
// "#version 450 core \n"
// " \n"
// "void main(void) \n"
// "{ \n"
// " gl_Position = verc4(0.0, 0.0, 0.5, 1.0); \n"
// "} \n"
// };
static const GLchar * vertex_shader_source[] =
{
"#version 330 core \n"
"void main(void)\n"
"{\n"
" const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0),\n"
" vec4(-0.25, -0.25,0.5, 1.0),\n"
" vec4(0.25, 0.25, 0.5, 1.0));\n"
" gl_Position = vertices[gl_VertexID];\n"
"}\n"
};
static const GLchar * fragment_shader_source[] =
{
"#version 330 core\n"
"out vec4 color;\n"
"void main(void)\n"
"{\n"
" color = vec4(0.0, 0.8, 1.0, 1.0);\n"
"}\n"
};
vertex_shader = glCreateShader(GL_VERTEX_SHADER); //创建一个空的着色器对象,参数表明是哪种着色器,一般着色器有六种
glShaderSource(vertex_shader, 1, vertex_shader_source, NULL); //将着色器源代码传递给着色器对象,以便保留该源代码的副本
glCompileShader(vertex_shader);//对着色器对象中包含的任何源代码进行编译
GLchar* infoLog = new GLchar[1000];
GLsizei length;
glGetShaderInfoLog(vertex_shader, 1000, &length, infoLog);
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
glCompileShader(fragment_shader);
program = glCreateProgram(); //创建一个程序对象,我们可以将着色器对象附加到该对象
glAttachShader(program, vertex_shader); //将顶点着色器对象附加到该程序对象中
glAttachShader(program, fragment_shader); //将片元着色器对象附加到该程序对象中
glLinkProgram(program); //将所有附加到程序对象的着色器对象链接到一起
// glDeleteShader(vertex_shader); //删除着色器对象,一旦着色器链接到一个程序对象后,程序将包含二进制代码,并不再需要着色器
// glDeleteShader(fragment_shader);
return program;
}
class my_application2 : public sb7::application
{
private:
GLuint rendering_program;
GLuint vertex_array_object;
public:
void startup()
{
rendering_program = compile_shaders();
// glCreateVertexArrays(1, &vertex_array_object); //这个会报错,不知道为啥,应该和部署版本有关
glGenVertexArrays(1, &vertex_array_object);//创建顶点数组对象
glBindVertexArray(vertex_array_object);//绑定顶点数组对象
}
void shutdown()
{
glDeleteVertexArrays(1, &vertex_array_object);
glDeleteProgram(rendering_program);//删除程序对象
glDeleteVertexArrays(1, &vertex_array_object);//删除顶点数组对象
}
void render(double currentTime)
{
// const GLfloat color[] = {
// (float)sin(currentTime) * 0.5f + 0.5f,
// (float)cos(currentTime) * 0.5f + 0.5f,
// 0.0f, 1.0f
// };
const GLfloat color[] = {0.0f, 0.0f, 0.0f, 1.0f};
glClearBufferfv(GL_COLOR, 0, color);
// glPointSize(40.0f);
glUseProgram(rendering_program); //设置OpenGL使用程序对象进行渲染
// glDrawArrays(GL_POINTS, 0, 1);//绘制命令
glDrawArrays(GL_TRIANGLES, 0, 3);//绘制命令
}
};
DECLARE_MAIN(my_application2);
下面是运行结果