一个u盘里的网吧系统管理软件件

opengl 程序到底是如何写的? - 建站 - IT精英团
当前位置:&>&&>&
opengl 程序到底是如何写的?
时间: 15:46:08&&
编辑:涛涛&&
&初学opengl 的人和我有一样的感受,看了那么多OPENGL的书 只是让我添加GLU GLUT &GLEW GLFW这些东西到底是什么? 我们学opengl 而opengl竟然什么也没有.大家一定很纳闷.
& 当初学三个月opengl,也没有理解清楚.opengl到底是什么?如果我打个浅显比喻:opengl就c++ 就是语法,在绘图里不是c++语法 这个语法就是opengl ,就是绘图描述 渲染 处理 ,他有自己的语法,类型和自己的操作命令,就如同你学会了c++ 你能做什么 什么也做不了,必须靠工具,靠外部框架,GLUT GLEW GLFW QT 都是.我们在windows 下绘图使用graphics.h &在VS下使用easyx.h &我们要包含glut.h 也就是说他是一个封装了opengl图形操作函数的图形库 只要调用GLUT里的函数就可以绘图,
//------------------GLEW &opengl 的扩展库 安装使用--------------------------------------------------------
&OpenGL扩展库是一个简单的工具,有助于C / C++开发者编写可移植的应用程序扩展和初始化。目前支持多种操作系统,包括Windows,Linux和Solaris,达尔文,IRIX。
OpenGL扩展
点击上面的链接下载最新的GLEW(支持OpenGL&3.0),解压,将&/bin/glew32.dll&拷贝到&c:/windows/system32&下面,将&/lib/glew32.lib&拷贝到VC安装目录下的&lib&目录下(如:/Microsoft&Visual&Studio&9.0/VC/lib/下),将&/include/glew.h&和&/include/wglew.h&拷贝到&VC&安装目录下的&/include/gl/&目录下(如:/Microsoft&Visual&Studio&9.0/VC/include/gl/下)。在程序中我们只需要在包含gl,glu&或&glut.h&之前包含&glew.h就可以了(注意:一定要先包含&glew.h),在在代码中加上这么一句:&&&
#pragma&comment&(lib,&&glew32.lib&)&&&&
#include&&GL/glew.h&&&
#include&&GL/glut.h&&&&
#progrma&comment(lib,&&glew32.lib&)&&&
在创建OpenGL渲染context之后,调用&glewInit();&初始化glew就可以了。
//---------------------GLFW 安装--------------------------------------------------
GLFW&- 很遗憾,没有找到FW的确切含义,Wiki上没有,GLFW主页也没有。猜测F表示for,W表示Window
GLFW一个轻量级的,开源的,跨平台的library。支持OpenGL及OpenGL ES,用来管理窗口,读取输入,处理事件等。因为OpenGL没有窗口管理的功能,所以很多热心的人写了工具来支持这些功能,比如早期的glut,现在的freeglut等。那么GLFW有何优势呢?glut太老了,最后一个版本还是90年代的。freeglut完全兼容glut,算是glut的代替品,功能齐全,但是bug太多。稳定性也不好(不是我说的啊),GLFW应运而生。
1. 打开Visual Studio 2012,新建一个Console程序
2. 右键单击project选择properties,打开属性页面
3. 在VC++Directories-Include Directories中写入glfw的头文件目录,我这里是 ../glfw-3.0.4.bin.WIN32/include
4. 在VC++ Directories-Library Directory中写入glfw的库文件目录,我这里是 ../glfw-3.0.4.bin.WIN32/lib-msvc110
5. 在Linker - Input - Additional Dependencies中填入glfw3dll.lib
注意:如果使用静态链接,那么上面第五步中glfw3dll.lib应该换成glfw3.lib,并且在工程属性页面中C/C++ - Code Generation 将 Runtime Library 设置为 /Mt 或者 /Mtd
#include&&GLFW/glfw3.h&int&main(void)
&&&&GLFWwindow*&&&&&/*&Initialize&the&library&*/
&&&&if&(!glfwInit())&&&&&&&&return&-1;&&&&/*&Create&a&windowed&mode&window&and&its&OpenGL&context&*/
&&&&window&=&glfwCreateWindow(480,&320,&&Hello&World&,&NULL,&NULL);&&&&if&(!window)
&&&&&&&&glfwTerminate();&&&&&&&&return&-1;
&&&&}&&&&/*&Make&the&window's&context&current&*/
&&&&glfwMakeContextCurrent(window);&&&&/*&Loop&until&the&user&closes&the&window&*/
&&&&while&(!glfwWindowShouldClose(window))
&&&&{&&&&&&&&/*&Draw&a&triangle&*/
&&&&&&&&glBegin(GL_TRIANGLES);
&&&&&&&&glColor3f(1.0,&0.0,&0.0);&&&&//&Red
&&&&&&&&glVertex3f(0.0,&1.0,&0.0);
&&&&&&&&glColor3f(0.0,&1.0,&0.0);&&&&//&Green
&&&&&&&&glVertex3f(-1.0,&-1.0,&0.0);
&&&&&&&&glColor3f(0.0,&0.0,&1.0);&&&&//&Blue
&&&&&&&&glVertex3f(1.0,&-1.0,&0.0);
&&&&&&&&glEnd();&&&&&&&&/*&Swap&front&and&back&buffers&*/
&&&&&&&&glfwSwapBuffers(window);&&&&&&&&/*&Poll&for&and&process&events&*/
&&&&&&&&glfwPollEvents();
&&&&glfwTerminate();&&&&return&0;
代码很简单,看注释即可,无需多解释。如果一切正常,屏幕上会出现一个窗口,里面有一个五颜六色的三角形。
常见错误及解决办法
使用一个库无非包含三个步骤:
包含头文件
链接库文件
提供运行时dll文件
只要这三个步骤正确了,基本不会出问题。
1&&& error C1083: Cannot open include file: 'GLFW/glfw3.h': No such file or directory
2&&& IntelliSense: cannot open source file &GLFW/glfw3.h&
3&&& IntelliSense: identifier &GLFWwindow& is undefined
4&&& IntelliSense: identifier &window& is undefined
5&&& IntelliSense: identifier &glfwInit& is undefined
6&&& IntelliSense: identifier &glfwCreateWindow& is undefined
7&&& IntelliSense: identifier &NULL& is undefined
8&&& IntelliSense: identifier &glfwTerminate& is undefined
9&&& IntelliSense: identifier &glfwMakeContextCurrent& is undefined
10&&& IntelliSense: identifier &glfwWindowShouldClose& is undefined
11&&& IntelliSense: identifier &glfwSwapBuffers& is undefined
12&&& IntelliSense: identifier &glfwPollEvents& is undefined
13&&& IntelliSense: identifier &glfwTerminate& is undefine
这显然是头文件没有找到,导致下面所有glfw相关的类型都找不到定义。需要正确设置头文件的路径,注意只要包含到include目录一级即可,比如\glfw-3.0.4.bin.WIN32\include
Error&& &1&& &error LNK2019: unresolved external symbol _glfwInit referenced in function _main
Error&& &2&& &error LNK2019: unresolved external symbol _glfwTerminate referenced in function _main
Error&& &3&& &error LNK2019: unresolved external symbol _glfwCreateWindow referenced in function _main
Error&& &4&& &error LNK2019: unresolved external symbol _glfwWindowShouldClose referenced in function _main
Error&& &5&& &error LNK2019: unresolved external symbol _glfwPollEvents referenced in function _main
Error&& &6&& &error LNK2019: unresolved external symbol _glfwMakeContextCurrent referenced in function _main
Error&& &7&& &error LNK2019: unresolved external symbol _glfwSwapBuffers referenced in function _main
Error&& &8&& &error LNK1120: 7 unresolved externals
这个错误发生在链接阶段,说明是库文件(.lib)文件找不到,需要在项目的属性页面中设置lib文件,在Visual Studio中右键单击Project,选择Properties - Configuration Propterties - Linker - Input - Additional Dependencies,单击右侧的下三角进入编辑页面,将glfw3dll.lib加入其中即可。
注意:gflw提供了不同版本的库文件,如果你使用的是Visual Studio 2012,请使用lib-msvc110下面的库文件,如果是Visual Studio 2013,那么则需要使用lib-msvc120下面的库文件。lib文件有两个,一个是glfw3.lib,一个是glfw3dll.lib,前者是静态链接用的(链接此文件后,运行时无需dll文件,但是程序体积会变大),后者是动态链接用的(配合dll使用),不要搞混
看过本文的人还看过
一个文化艺术垂直电子商务网站。
一个文化艺术垂直电子商务网站。
优秀网页设计联盟(SDC),是有着良好职业交流氛围的网页设计行业联盟。与优设哥
鲁春利的工作笔记,好记性不如烂笔头通过微信小程序访问https的域名时报错:说明:S
一直办公用win7系统习惯了,最近买了个IdeaPad-100s-14IBR搞头疼了,用了半个小时
CopyRight (C)
网站名称 版权所有. All Rights Reserved.备案号:初学opengl 的人和我有一样的感受,看了那么多OPENGL的书 只是让我添加GLU GLUT
GLEW GLFW这些东西到底是什么? 我们学opengl 而opengl竟然什么也没有.大家一定很纳闷.
当初学三个月opengl,也没有理解清楚.opengl到底是什么?如果我打个浅显比喻:opengl就c++ 就是语法,在绘图里不是c++语法 这个语法就是opengl ,就是绘图描述 渲染 处理 ,他有自己的语法,类型和自己的操作命令,就如同你学会了c++ 你能做什么 什么也做不了,必须靠工具,靠外部框架,GLUT GLEW GLFW QT 都是.我们在windows 下绘图使用graphics.h
在VS下使用easyx.h
我们要包含glut.h 也就是说他是一个封装了opengl图形操作函数的图形库 只要调用GLUT里的函数就可以绘图,//------------------GLEW
opengl 的扩展库 安装使用-------------------------------------------------------- OpenGL扩展库是一个简单的工具,有助于C / C++开发者编写可移植的应用程序扩展和初始化。目前支持多种操作系统,包括Windows,Linux和Solaris,达尔文,IRIX。OpenGL扩展
点击上面的链接下载最新的GLEW(支持OpenGL 3.0),解压,将 /bin/glew32.dll 拷贝到 c:/windows/system32 下面,将 /lib/glew32.lib 拷贝到VC安装目录下的 lib 目录下(如:/Microsoft Visual Studio 9.0/VC/lib/下),将 /include/glew.h 和 /include/wglew.h 拷贝到 VC 安装目录下的 /include/gl/ 目录下(如:/Microsoft Visual Studio 9.0/VC/include/gl/下)。在程序中我们只需要在包含gl,glu 或 glut.h 之前包含 glew.h就可以了(注意:一定要先包含 glew.h),在在代码中加上这么一句:
#pragma comment (lib, "glew32.lib")
#include &GL/glew.h&
#include &GL/glut.h&
#progrma comment(lib, "glew32.lib")
在创建OpenGL渲染context之后,调用 glewInit(); 初始化glew就可以了。//---------------------GLFW 安装-------------------------------------------------- - 很遗憾,没有找到FW的确切含义,Wiki上没有,GLFW主页也没有。猜测F表示for,W表示Window一个轻量级的,开源的,跨平台的library。支持OpenGL及OpenGL ES,用来管理窗口,读取输入,处理事件等。因为OpenGL没有窗口管理的功能,所以很多热心的人写了工具来支持这些功能,比如早期的glut,现在的freeglut等。那么GLFW有何优势呢?glut太老了,最后一个版本还是90年代的。freeglut完全兼容glut,算是glut的代替品,功能齐全,但是bug太多。稳定性也不好(不是我说的啊),GLFW应运而生。1. 打开Visual Studio 2012,新建一个Console程序2. 右键单击project选择properties,打开属性页面3. 在VC++Directories-Include Directories中写入glfw的头文件目录,我这里是 ../glfw-3.0.4.bin.WIN32/include4. 在VC++ Directories-Library Directory中写入glfw的库文件目录,我这里是 ../glfw-3.0.4.bin.WIN32/lib-msvc1105. 在Linker - Input - Additional Dependencies中填入glfw3dll.lib注意:如果使用静态链接,那么上面第五步中glfw3dll.lib应该换成glfw3.lib,并且在工程属性页面中C/C++ - Code Generation 将 Runtime Library 设置为 /Mt 或者 /Mtd#include &GLFW/glfw3.h&int main(void)
GLFWwindow*
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(480, 320, "Hello World", NULL, NULL);
if (!window)
glfwTerminate();
return -1;
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
/* Draw a triangle */
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(-1.0, -1.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(1.0, -1.0, 0.0);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
glfwTerminate();
}代码很简单,看注释即可,无需多解释。如果一切正常,屏幕上会出现一个窗口,里面有一个五颜六色的三角形。常见错误及解决办法使用一个库无非包含三个步骤:包含头文件链接库文件提供运行时dll文件只要这三个步骤正确了,基本不会出问题。错误一1
error C1083: Cannot open include file: 'GLFW/glfw3.h': No such file or directory2
IntelliSense: cannot open source file "GLFW/glfw3.h"3
IntelliSense: identifier "GLFWwindow" is undefined4
IntelliSense: identifier "window" is undefined5
IntelliSense: identifier "glfwInit" is undefined6
IntelliSense: identifier "glfwCreateWindow" is undefined7
IntelliSense: identifier "NULL" is undefined8
IntelliSense: identifier "glfwTerminate" is undefined9
IntelliSense: identifier "glfwMakeContextCurrent" is undefined10
IntelliSense: identifier "glfwWindowShouldClose" is undefined11
IntelliSense: identifier "glfwSwapBuffers" is undefined12
IntelliSense: identifier "glfwPollEvents" is undefined13
IntelliSense: identifier "glfwTerminate" is undefine这显然是头文件没有找到,导致下面所有glfw相关的类型都找不到定义。需要正确设置头文件的路径,注意只要包含到include目录一级即可,比如\glfw-3.0.4.bin.WIN32\include错误二Error
error LNK2019: unresolved external symbol _glfwInit referenced in function _mainError
error LNK2019: unresolved external symbol _glfwTerminate referenced in function _mainError
error LNK2019: unresolved external symbol _glfwCreateWindow referenced in function _mainError
error LNK2019: unresolved external symbol _glfwWindowShouldClose referenced in function _mainError
error LNK2019: unresolved external symbol _glfwPollEvents referenced in function _mainError
error LNK2019: unresolved external symbol _glfwMakeContextCurrent referenced in function _mainError
error LNK2019: unresolved external symbol _glfwSwapBuffers referenced in function _mainError
error LNK1120: 7 unresolved externals这个错误发生在链接阶段,说明是库文件(.lib)文件找不到,需要在项目的属性页面中设置lib文件,在Visual Studio中右键单击Project,选择Properties - Configuration Propterties - Linker - Input - Additional Dependencies,单击右侧的下三角进入编辑页面,将glfw3dll.lib加入其中即可。注意:gflw提供了不同版本的库文件,如果你使用的是Visual Studio 2012,请使用lib-msvc110下面的库文件,如果是Visual Studio 2013,那么则需要使用lib-msvc120下面的库文件。lib文件有两个,一个是glfw3.lib,一个是glfw3dll.lib,前者是静态链接用的(链接此文件后,运行时无需dll文件,但是程序体积会变大),后者是动态链接用的(配合dll使用),不要搞混
如果您想留下此文,您可以将其发送至您的邮箱(将同时以邮件内容&PDF形式发送)
相关文章推荐
(Ctrl+Enter提交) &&
已有0人在此发表见解
&在& 09:52收藏到了
&&在信息爆炸的时代,您的知识需要整理,沉淀,积累!Lai18为您提供一个简单实用的文章整理收藏工具,在这里您可以收藏对您有用的技术文章,自由分门别类,在整理的过程中,用心梳理自己的知识!相信,用不了多久,您收藏整理的文章将是您一生的知识宝库!
· 蜀ICP备号-1OPENGL学习(1)
OPENGL简介
通俗来讲OPENGL就是一套图形API的集合,其实不单单是这样,它也是API执行的规范。OPENGL整体其实是一个巨大的状态机(State Machine),根据一系列变量的值来确定OPENGL的行为,这些不同的状态我们统称为OPENGL上下文(Context)。OPENGL里面含有很多不同的Object。每个对象都代表一个状态,通过设置很多对象,来让OPENGL执行不同的功能。
OPENGL环境安装
我的环境是:Win10+vs2015+GTX970M+OPENGL3.3,要想在电脑上可以跑OPENGL的程序,首先需要配置OPENGL需要的一些扩展库
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。首先我们需要下载这样的一个库需要用到里面的include文件夹里面的内容和编译之后生成的库。(其实这个库最好还是在自己的电脑上亲自编译一下,这样可能会避免以后出现的不必要的错误,我们可以使用一个叫做CMake的东西来做这些事情,首先我们打开下载的CMake的GUI启动方式,然后我们在glfw文件夹下面创建一个叫做build的文件夹,这个文件夹存放CMake生成的lib库文件要以及其他的文件,然后把glfw目录作为源目录,目标目录选为build,然后Configure,Configure,Generate)生成完毕之后你可以在build目录之后看到GLFW.sln,用vs打开,然后运行,生成库文件glfw3.lib(因为我们用的OPENGL3.3),这个库文件在src的Debug目录下。好了,生成了这些我们所要的文件之后我们就需要导入vs以便让我们的项目可以顺利运行。
找到IDE或者编译器的/lib和/include文件夹,添加GLFW的include文件夹里的文件到IDE的/include文件夹里去。用类似的方法,将glfw3.lib添加到/lib文件夹里去。虽然这样能工作,但这不是推荐的方式,因为这样会让你很难去管理库和include文件,而且重新安装IDE或编译器可能会导致这些文件丢失。推荐的方式是建立一个新的目录包含所有的第三方库文件和头文件,并且在你的IDE或编译器中指定这些文件夹。我个人会使用一个单独的文件夹,里面包含Libs和Include文件夹,在这里存放OpenGL工程用到的所有第三方库和头文件。这样我的所有第三方库都在同一个位置(并且可以共享至多台电脑)。然而这要求你每次新建一个工程时都需要告诉IDE/编译器在哪能找到这些目录。
然后我们用vs新建一个Visual C++的空项目,我们进入项目的属性里面
然后选择VC++ Directories(VC++ 目录)选项卡(如下图)。在下面的两栏添加目录:
这里你可以把自己的目录加进去,让工程知道到哪去搜索。你需要手动把目录加在后面(这样的方式是对上面的2的设置方法)
对于1来说需要在Linker(链接器)选项卡里的Input(输入)选项卡里添加glfw3.lib这个文件:
要链接一个库我们必须告诉链接器它的文件名。库名字是glfw3.lib,我们把它加到Additional Dependencies(附加依赖项)字段中
现在GLFW库的安装已经完成了。
2.OpenGL库
对于windows系统来说安装vs的时候OpenGl32.lib已经包含在Microsoft SDK里面了,我们只需要把opengl32.lib写进Additional
Dependencies(附加依赖项)字段中就可以了。
glew库的安装和glfw差不多,把include文件夹里面的内容放到vs安装目录下的include里面。然后把glew32s.lib放入lib文件夹里面,最后在项目的Additional
Dependencies(附加依赖项)写进去就可以了。
这个是OpenGL的数学库,这个库安装起来要方便许多,只需要把里面的include文件夹里面的内容放到vs的include里面就可以了。
以上就是基本库的安装,接下来我们创建一个空窗口的程序。
#include &iostream&
#define GLEW_STATIC
#include &GL/glew.h&
#include &GLFW/glfw3.h&
int main()
glfwInit();//初始化GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//声明opengl的主版本号和次版本号
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//声明opengl为核心模式
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);//窗口不可变换大小
//接下来创建一个窗口对象
GLFWwindow* window = glfwCreateWindow(800, 600, &zzj's opengl&, nullptr, nullptr);
if (window == nullptr)
std::cout && &Failed to create GLFW window& && std::
glfwTerminate();//结束窗口,释放资源
return -1;
glfwMakeContextCurrent(window);//将当前窗口设置主线程的上下文
glewExperimental = GL_TRUE;//这是初始化opengl指针
if (glewInit() != GLEW_OK)
std::cout && &Failed to initialize GLEW& && std::
return -1;
int width,
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);//设置窗口的维度
while (!glfwWindowShouldClose(window))
glfwPollEvents();//检查触发事件
glfwSwapBuffers(window);//交换颜色缓冲,重绘
glfwTerminate();//释放资源
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23916次
积分:1294
积分:1294
排名:千里之外
原创:101篇
转载:24篇
(5)(27)(14)(5)(2)(7)(20)(1)(1)(3)(5)(2)(9)(2)(1)(1)(22)扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 444|回复: 4
“你好 三角形”
搭建并运行OpenGL 4
7排名<font color="#FF昨日变化1主题帖子积分
蛮牛币2964
在线时间192 小时
发表于 前天&11:28
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
本帖最后由 manew_JR 于
11:42 编辑
“你好 三角形”搭建并运行OpenGL 4
Anton Gerdelan. Last Updated 2 October 2016
本文旨在对于OpenGL4程序中所有关键的部分进行一个简短的概述,并不涉及到其他具体的细节。如果你以前用过其他的API(抑或其他老版本的OpenGL),现在只是想略微看看其中的不同之处,那么本文比较适合你。如果你以前从未进行过图形编程相关工作,那么本文也算是一个比较不错的开始去做一些可改变的“起作用”的事情。接下去的文章将会重新回过头来审视每一个部分的具体细节。
获取主OpenGL库
你需要的主要库是libGL。当然也有一套比较便利的函数库libGLU,不过你应该不太可能会用到。OpenGL 可能有那么点奇怪因为你并不需要从网站上下载库。Khronos 只提供规范的接口,然而具体的实现还是要硬件厂商或者其他开发者自己完成。你需要一个非常先进的图形处理器来支持OpenGL 4.x版本。即使这样,在没有驱动之前你仍然无法实现最新的内容。
获得最新的libgl:
o& && &&&Linux - 缺省情况下使用MESA,但貌似有点缓慢,现在只支持到OpenGL3.0。要获取OpenGL4.0,请切换到专有的硬件驱动下(使用MESA的Nvidia, AMD或者Intel)或者自行从对应厂商的网站上下载。
o& && &&&Mac - Apple has its own OpenGL implementation, and this comes with each version of OS X. Apple provides OpenGL Capabilities Tables. If you can get OpenGL 3.2 or newer then you can do most things from OpenGL 4.
o& && &&&Mac - Apple有它自己的OpenGL实现,附在各个版本的OS X中。Apple提供了OpenGL Capabilities Tables。如果你能获取到OpenGL3.2或者更新的版本,那么基本上OpenGL4能干的事情,你都能干了。
用GLFW与GLEW开始GL环境
GLFW 是一个辅助库来帮助我们开始OpenGL“环境”,几乎可以说是对所有操作系统适用。该环境是OpenGL的一个运行副本,与操作系统的一个窗口挂钩。注意:本教程所使用的GLFW已更新至3.0版本,其中的某些接口可能与早期版本有些微的出入。
从网站上下载的编译库并不适合我,于是我自行从源码开始重新构建了编译库。你可能也需要这么做。
文档告诉我们如果我们要使用动态链接库则需要在包含头文件前加入#define:
#define GLFW_DLL
#include &GLFW/glfw3.h&
还有一个库叫做GLEW ,保证我们GL的库是最新的,系统路径中的并不是最古老的版本。它也是GL的扩展。如果你尝试在没有GLEW的时候编译,你将会在窗口中看到一连串的未认证的GL函数及常量 - 那意味着你正在使用90年代的微软GL。如果你正在使用MinGW那么你就需要自行编译这个库。就像GLFW一样,网页中的二进制文件并不是完全可信任的 - 所以在本地重新构建一次以取得最好的结果。
将GLEW包含在GLFW之前以使用最新的GL库:
#include &GL/glew.h&
#define GLFW_DLL
#include &GLFW/glfw3.h&
我已经上传了两者在Windows MinGW's GCC编译器下的构建:
o& && &&&GLFW3 Win32 MinGW .dll
o& && &&&GLEW Win32 MinGW .dll
好的我们现在可以写一个小程序,这会启动GL环境并且打印版本然后退出。你可能会想要在你的终端编译并运行这个程序来保证迄今为止一切都是正常运转的,并且确保你的显卡驱动是能支持OpenGL4的。
#include &GL/glew.h& // include GLEW and new version of GL on Windows
#include &GLFW/glfw3.h& // GLFW helper library
#include &stdio.h&
int main() {
&&// start GL context and O/S window using the GLFW helper library
&&if (!glfwInit()) {
& & fprintf(stderr, &ERROR: could not start GLFW3\n&);
& & return 1;
&&// uncomment these lines if on Apple OS X
&&/*glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
&&glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
&&glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
&&glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);*/
&&GLFWwindow* window = glfwCreateWindow(640, 480, &Hello Triangle&, NULL, NULL);
&&if (!window) {
& & fprintf(stderr, &ERROR: could not open window with GLFW3\n&);
& & glfwTerminate();
& & return 1;
&&glfwMakeContextCurrent(window);
&&// start GLEW extension handler
&&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&
&&/* OTHER STUFF GOES HERE NEXT */
&&// close GL context and any other GLFW resources
&&glfwTerminate();
&&return 0;
如果你是Apple OS X系统的话那么上面的代码中那4行不要注释掉,我们会在下一教程中涉及到这些。简单来说就是它会让我们得到Apple上最新的OpenGL版本,在Mavericks上可能是4. 1或者3.3,在更前的系统上可能是3.2。在其他系统上可能更倾向于选择3.2而不是最新的版本。为了提升对于更新版本的OpenGL的支持,我们可以在启动GLEW之前写上标志glewExperimental = GL_TRUE;
请确保你的GLFW 以及 GLEW库路径正确无误。我将我工程下的GLEW 与 GLFW的include文件夹拷到了同一个文件夹下,所以我的include 文件夹包含了两个文件夹,一个是GLFW一个是GL。我使用MinGW编译以下内容:
g++ -o hellot.exe main.cpp glfw3dll.a libglew32.dll.a -I include -L./ -lglew32 -lglfw3 -lopengl32
我把GLFW以及GLEW库文件放到了我本地文件夹下,并告诉它指向-L./动态库。它会自己在系统路径中找到opengl32库。在Linux下你可能需要通过资源库来安装,并且你并不需要-I或者-L路径。你甚至都不需要glfw3dll.a与libglew32.dll.a文件。OpenGL库会被libGL调用。在Linux下我使用以下命令:
g++ -o hellot main.cpp -lglfw -lGL -lGLEW
当然,你可以使用gcc或者其他C语言编译器来将它当做纯C编译。我个人比较倾向于在里面稍微加一点C++的小技巧;我把它叫做“C++--”。
如果你在链接库的时候遇到了点,那我建议先把带有库的示例build一遍,并且阅读一下对应操作系统下相关的安装说明。是否拥有了你编译器需要的正确的库版本?是不是build了debug或者release版本?-库是否在你IDE菜单中的正确位置?你build了32位的还是64位的?-库是不是匹配?如果还是无法正常工作,尝试从源码开始重新构建你自己的库-我自己就是这么干的,对于GLFW和GLEW都是。
如果我在命令行运行hellot.exe,那么我会得到:
QQ Photo58.jpg (36.22 KB, 下载次数: 2)
前天&11:25 上传
上面的信息是告诉我,我的Windows驱动能达到OpenGL4.3.在Mac上可能是3.2或者3.3.不过没事,我们可以做一些小小的改动然后几乎就能运行版本4上的全部内容。我回将它们指出来。
在顶点缓存中定义一个三角形
好,让我们用三个点定义一个三角形。稍后我们可以考虑做一下转换和视角,但是现在让我们在平面区域上画一个出来。x和y从-1到1,z=0.
QQ Photo11.jpg (51.35 KB, 下载次数: 1)
前天&11:25 上传
先在草稿纸上画好草图总是有帮助的。上图是我定义的三角形,以顺时针方向给出点,符合x和y轴从-1到1的范围。
我们会在一个较大的浮点数组内包含这些点。我们先从顶点开始,然后沿着顺时针继续。顺序应该始终保持相同的转向,我们稍后才能定义哪一边是前面哪一边是背面。我们可以开始着手在上面注释着/* OTHER STUFF GOES HERE NEXT */的下面写。
float points[] = {
& &0.0f,&&0.5f,&&0.0f,
& &0.5f, -0.5f,&&0.0f,
&&-0.5f, -0.5f,&&0.0f
我们会将这块内存拷贝到显卡中被称作顶点缓冲对象(VBO)的单元。这样做之后我们会“产生”一个空的缓存,在OpenGL的状态机中通过“binding”将它作为当前的缓冲,然后将这些点拷贝到当前缓冲。
GLuint vbo = 0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), points, GL_STATIC_DRAW);
最后一行告诉GL,缓冲是9个浮点数大小,并且给予第一个值地址。
接下去是不平常的一步。大多数网格会使用一个或更多顶点缓冲对象去保存顶点,贴图坐标和顶点法线等等。在较早的GL实现中我们不得不绑定每一个并且定义好他们的内存分布,每次我们都要重新绘制mesh。为了简化它,我们用一个新玩意儿叫做vertex array objects顶点数组对象 (VAO),它记录了我们使用的所有的顶点缓冲,以及每一个的内存分布,每个mesh我们只要设置一次。每当我们要绘制的时候,我们所要做的只是绑定VAO然后绘制。
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
这就是我们所说的GL创建的新VAO。之后设置一个无符号整型来定义它。我们绑定它,让他集中到状态机上。这让我们可以获得第一个属性0;我们只使用一个单独的顶点缓冲,所以我们知道属性将会被设为0。glVertexAttribPointer 函数定义了我们第一个顶点缓存的布局;“0”意味着将属性布局定义为0。“3”意味着缓冲中的变量是由三个浮点数组成的vec3 。
你也许应该尝试编译一下来确保到目前为止都没有错误。
我们需要用到OpenGL着色语言(GLSL)来编写shader程序,定义如何从顶点数组对象(VAO)绘制我们的图形。你会看到VAO中的属性指针能匹配上我们在shader中输入的属性。
这段shader程序由最简单的两部分组成;顶点着色器展示了这个三角形应该在哪里显示,片元着色器表示了用什么颜色。这两部分都是在纯文本中写的,看上去很像C语言程序。从纯文本文件中载入是一个很好的选择;我在这里硬编码它们只是想节省点网的资源罢了。
const char* vertex_shader =
&#version 400\n&
&void main() {&
&&&gl_Position = vec4(vp, 1.0);&
第一行确定了要使用的着色语言的版本,我们在这里用的是4.0.0。如果你用的是OpenGL3,请将“400”改成“150”;“150”兼容OpenGL3.2,而“330”则兼容OpenGL3.3。我的顶点着色器有一个输入变量,vec3 (由三个浮点数组成的向量),与VAO属性指针匹配。这意味着在我们缓冲中的那9个浮点数中,每三个就会有一个顶点着色器 - 意思就是会有三个顶点着色器同时运行,每个对应一个顶点。输出变量gl_Position期望返回一个四维浮点数。你应该能看到我并没有改动什么,只是将1加到了vp中。而1只是表示“不计算任何视角”。
const char* fragment_shader =
&#version 400\n&
&out vec4 frag_&
&void main() {&
&&&frag_colour = vec4(0.5, 0.0, 0.5, 1.0);&
又来了,如果你是在OpenGL3.2或3.3上的话,你需要修改第一行片元着色器。我的片元着色器在每个形状表面的像素片段上只会执行一次。我们还没有告诉GL现在画的是个三角形(可能只是两条线)。你可以先把它想象成一个三角形,在这个形状中我们有比顶点着色器更多的片元着色器在运行。片元着色器的工作就是-为每个片段设置颜色。于是它会输出一个四维的向量来表示由RGBA组成的颜色,每个值的范围都是0到1。我们并没有使用alpha值,那么问题来了,你能猜到这是什么颜色么?
在使用着色器之前我们先要将条件等加载进GL着色器然后编译它们。
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);
现在,这些编译过的着色器必须被整合成一个单独的可执行的GPU着色器程序。我们创建一个空的“程序”,然后附在着色器上,并将它们连接起来。
GLuint shader_programme = glCreateProgram();
glAttachShader(shader_programme, fs);
glAttachShader(shader_programme, vs);
glLinkProgram(shader_programme);
我们进行循环绘制,每次迭代绘制一次屏幕,每帧渲染。窗口关闭的时候循环结束。之后我们会询问GLFW,ESC键是否被按下了。
while(!glfwWindowShouldClose(window)) {
&&// wipe the drawing surface clear
&&glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
&&glUseProgram(shader_programme);
&&glBindVertexArray(vao);
&&// draw points 0-3 from the currently bound VAO with current in-use shader
&&glDrawArrays(GL_TRIANGLES, 0, 3);
&&// update other events like input handling
&&glfwPollEvents();
&&// put the stuff we've been drawing onto the display
&&glfwSwapBuffers(window);
首先我们清理绘制的表面,接着我们设置应该能够被用于之后进行的所有绘制操作的着色器程序。我们设置VAO(注意不是VBO)作为整个绘制过程中使用的输入变量(在本例中就是那几个顶点)。然后我们就可以开始绘制了,我们想要进入三角形模式(一个三角形有三个顶点),并且从0开始绘制三个点。GLFW3要求我们手动调用glfwPollEvents()来升级类似按下按钮那样的非图形事件。最后我们将交换表面放到屏幕上,以及下一个绘制表面的屏幕(我们有两个绘制缓冲)。完成了!
QQ Photo34.jpg (30.24 KB, 下载次数: 1)
前天&11:25 上传
o& && &&&从文本文件中加载shader信息test_vs.glsl与test_fs.glsl (有良好的命名习惯会很方便)
o& && &&&在片元着色器中改变三角形的颜色。
o& && &&&尝试将形状移动到顶点着色器中 类似vec4(vp.x, vp.y + 1.0, vp.z, 1.0);
o& && &&&做一个四边形!尝试在顶点列表里再加一个三角形的数据进去使其形成一个四边形。你会改动几个变量当你设置缓冲以及绘制图形时。哪个变量是你需要去跟踪每个三角形的?(提示:不是很多...)
o& && &&&尝试绘制 GL_LINE_STRIP或 GL_LINES 或GL_POINTS而不是三角形。线的位置是你所期望的么?默认绘制的点有多大?
o& && &&&尝试在渲染循环之前通过glClearColor()改变背景颜色。有时候,灰底是个不错的选择;0.6f, 0.6f, 0.8f, 1.0f.
o& && &&&现在我想看到两条龙!尝试创建第二个VAO,然后画两个图形(记得绑定)
o& && &&&尝试创建第二个着色器程序,并用不同的颜色绘制第二个形状(记住“使用”第二个着色器程序)
常见的错误
首先,如果你在执行glGenVertexArrays()的过程中崩溃了,尝试在初始化GLEW之前加一行glewExperimental = GL_TRUE。如果你是在Mac机器上,尝试把我们“提示”使用版本的那段代码打开。
在OpenGL中,你的错误大多数都是出在用错了API(并不属于绝大多数的一目了然的API... 谨慎使用)。这些错误通常发生在着色器中。下一篇文章我们将看到输出一些在着色器编译的时候发现的错误,并输出所有在顶点着色器与片元着色器匹配连接的过程中出现的问题。这基本上就能定位到你所有的错误了,所以当你在诊断一个问题的时候这会是你停靠的第一个港湾。
GL函数参数错误
用C的时候也很容易犯一些小错误。GL使用了很多[无符号] 整型(又叫作“GLunit”)来确定处理变量比如顶点缓冲,顶点数组,着色器以及着色器程序等等。GL也使用了很多枚举类型比如GL_TRIANGLES,枚举也能当成整型来用。这就意味着如果你将它们混淆起来了(打个比方,将函数参数放错位置等),GL会认为你给予了有效的数据但是没有编译。换句话说,在检查错误方面,对于强类型语言的使用上的支持太差了。这些错误通常会导致黑屏或者“没效果”,然后这就很让人难过了。唯一的方法就是你需要仔细检查GL函数的每一个原型来确保你所给出的参数是正确的。我经常犯的错误是将位置信息与其他索引混淆起来(比如在设置纹理时就经常发生)而这恰恰很难定位。
GL状态机错误
另外一个非常棘手的问题是,错误的源头在于在调用某个函数之前不知道将状态机设置到了那个状态。我试着在它们发生的时候将它们指出来。从我们上述的代码中举例的话,就是glDrawArrays 函数。它将使用最近绑定的顶点数组,以及最近使用的着色器程序去绘制图形。如果我想要画一组不同的缓冲,我们就需要在绘制之前再次绑定。如果在状态机中没有有效的缓冲或者是着色器,那么,程序就会崩溃。
我们将着眼于起始代码的更多细节-尤其是记录有用的调试信息。我们将会讨论着色器的功能以及硬件的架构。我们将用不止一个顶点缓冲来创建更多复杂的对象,并且从文件中加载几何结构。
原文链接:
每日推荐:
3196/300排名<font color="#FF昨日变化143主题帖子积分
偶尔光临, 积分 196, 距离下一级还需 104 积分
偶尔光临, 积分 196, 距离下一级还需 104 积分
在线时间34 小时
发表于 前天&15:06
受教了,正在深入学习OpenGL中,加油
每日推荐:
4301/500排名<font color="#FF昨日变化27主题帖子积分
四处流浪, 积分 301, 距离下一级还需 199 积分
四处流浪, 积分 301, 距离下一级还需 199 积分
在线时间45 小时
发表于 前天&15:45
不错不错。谢谢分享
每日推荐:
4395/500排名<font color="#FF昨日变化44主题帖子积分
四处流浪, 积分 395, 距离下一级还需 105 积分
四处流浪, 积分 395, 距离下一级还需 105 积分
在线时间135 小时
发表于 昨天&09:37
不错谢谢分享
每日推荐:
4311/500排名<font color="#FF昨日变化44主题帖子积分
四处流浪, 积分 311, 距离下一级还需 189 积分
四处流浪, 积分 311, 距离下一级还需 189 积分
在线时间100 小时
发表于 昨天&09:43
学习学习学习学习
每日推荐:
经过游戏蛮牛认证的蛮牛小翻译
认证开发者
经过游戏蛮牛认证的独立开发者

我要回帖

更多关于 网吧系统管理软件 的文章

 

随机推荐