由于搭建这个环境用了很久时间,走了无数弯路,现记录一下,以便查找复盘,后来者也可借鉴一下。
win10 codeblocks mingw glfw glew
1 使用动态库的方式,静态库由于GLFW本身的一些引用库问题,暂时未调通
2 具体步骤:
a) 下载glfw的源码,cmake,mingw
b) 使用cmake配置工程,注意选择share库
c) cmake配置生成工程后,使用codeblocks编译工程,得到动态库,动态库在src文件中
d) 由于使用动态库的方式,所以需要实际使用的文件有两个,一个是真实的库libglfw3dll.a,一个是编译环境和运行环境需要使用用的glfw3.dll,静态库文件libglfw3.a实际未使用到。
e) glfw3.dll需要随编译生成的exe文件放在同一文件夹下。
f) glew 由于编译环境问题,未直接使用源码编译,直接下载二进制文件
g) mingw使用另外下载的文件,未使用codeblocks自带的文件,注意需要修改codeblocks的配置。
h) codeblocks环境配置,这里耗费了太多时间,最终结果如下:
右键工程–>build options–>选工程(不是debug也不是release)–>linker settings–>填入使用的库及选项–>search directories–>填入相应的引用头文件目录–>linker–>填入相应的库文件目录
库文件结构如下:
此时环境配置结束。
测试例程:
main.c
//#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#define GLFW_DLL
#include <GLFW/glfw3.h>
#include "stdio.h"
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
glewInit();
// get version info
const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
const GLubyte* version = glGetString(GL_VERSION); // version as a string
printf("Renderer: %s\n", renderer);
printf("OpenGL version supported %s\n", version);
// tell GL to only draw onto a pixel if the shape is closer to the viewer
glEnable(GL_DEPTH_TEST); // enable depth-testing
glDepthFunc(GL_LESS); // depth-testing interprets a smaller value as "closer"
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
GLuint vbo;
glGenBuffers(1,&vbo);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
GLuint vao = 0;
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,NULL);
const char* vertex_shader =
"#version 400\n"
"in vec3 vp;"
"void main() {"
" gl_Position = vec4(vp, 1.0);"
"}";
const char* fragment_shader =
"#version 400\n"
"out vec4 frag_colour;"
"void main() {"
" frag_colour = vec4(0.5, 0.0, 0.5, 1.0);"
"}";
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs,1,&vertex_shader,NULL);
glCompileShader(vs);
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs,1,&fragment_shader,NULL);
glCompileShader(fs);
GLuint shader_programme = glCreateProgram();
glAttachShader(shader_programme,fs);
glAttachShader(shader_programme,vs);
glLinkProgram(shader_programme);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
// glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shader_programme);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES,0,3);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
编译后运行效果:
主要参考文档:
https://www.glfw.org/docs/latest/window_guide.html
https://antongerdelan.net/opengl/hellotriangle.html
https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/04%20Hello%20Triangle/