glew glfw opengl 之间的关系

glew glfw 搭建opengl 环境时遇到的一些问题记录

windows 
即使完全正确配置了 glfw glew 头文件,lib 文件,dll文件后,依然无法调用 gl 相关函数,如glViewport()
一旦调用就会报 gl 函数链接错误 

原因:
win32 下必须 link opengl32.lib.

起初我误以为 glew.lib 只要链接好,就可以 调用 gl 相关的函数了。实际上不是这样的,gl函数还是需要 opengl32.lib 链接进去才可以调用。
glfw,glew,opengl 3个库的作用分别如下

glfw:负责创建窗口,处理消息循环
glew:在调用 opengl 相关函数时,不必每次都用 函数指针的方式,检查 机器是否支持 此 gl  函数
opengl:真正的 gl 相关函数,还是需要 link 这个库


今天在搭建环境时,由于没有链接 opengl32.lib (我以为 glew32.lib 链接了就可以调用 opengl相关函数了),导致gl 相关的函数调用不了,卡了很久。还是对 这些库各自的分工职能理解不清晰所致。


mac
mac下 也有 glew ,glfw 库,并且可以通过 brew install glew,brew install glfw 简单的获取到。
但是工程头文件目录,库文件引用 还是要每个工程各自设置.

mac 下 与 opengl32.lib 对应的 gl 库是  OpenGL.framework
如果 引用 OpenGL.framework,则出现的错误 与 windows 下 不 链接 opengl32.lib 的报错是一样的: 无法链接 gl 相关的函数 (比如 glviewport)


mac 下的 glewInit() 必须在 opengl context 创建之后,即 必须在 glfwMakContextCurrent(window)之后。否则 glewInit() 无法创建成功,一些高版本的 gl 函数在调用时,会出现 运行时报错 EXC_BAD_ACCESS


windows 下虽然 glewInit() 调用在前,不会报错,但是用到 gl 一些高版本的函数时,比如 glGenBuffers() ,也会运行时报错


所以,正确的时机调用 glewInit() 是使用 opengl 高版本函数的 必要条件。


另外 :
windows,mac 环境下 ,glew 的头文件都需要在 glfw 之前,否则会无法编译通过.


#define GLEW_STATIC // 根据 glew32s.lib glew32.lib 链接库不同 ,可以选择是否打开这个宏
#include
#include


mac环境下,必须加上下面这一行,否则 glfw 无法正常 create window

    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPATGL_TRUE);



附代码:


#define GLEW_STATIC
#include 
#include 


#include 
using namespace std;

int main()
{
	//glewInit();

	//glewIsSupported("GL_VERSION_2_0");


	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPATGL_TRUE);
	GLFWwindow* window = glfwCreateWindow(200, 200, "m30", nullptr, nullptr);
	if (window == nullptr)
	{
		cout << "Failed to create GLFW window" << endl;
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);

	int width, height;
	glfwGetFramebufferSize(window, &width, &height);


	glewInit();
	glViewport(0, 0, width, height);
	//glViewport(0, 0, width, height);
	GLuint buffer[1];
	glGenBuffers(1, buffer);

	glGetString(0);
	
	

	while (!glfwWindowShouldClose(window))
	{
		//cout << "m30" << endl;
		glfwPollEvents();
		glfwSwapBuffers(window);
	}
	glfwTerminate();
	return 0;
}




总结:


glfw库: 用于处理 各个平台 的 窗口创建,事件循环.通常可以替换成为其他,比如glut,freeglut 等界面库
(是不是也可以替换成 SDL ?)

opengl库: 提供基本的 gl 函数的支持.opengl 库是写 opengl 程序时所必须的。


glew库: 提供高版本 gl 函数的支持。如果不嫌麻烦的话,也可以手写函数指针,来判断各个 opengl 高版本函数是否支持,但是 glew 库 做了 大大的简化,使得 opengl 各个版本的函数像原生函数一样,可以随意调用。
glew库暂时不知道有没有其他 库 可以替换.










你可能感兴趣的:(折腾)