【OpenGL】初识OpenGL4.0
这篇文章主要是根据《OpenGL Shading Language Cookbook》一书翻译整理而得,介绍了环境的安装和一些基础知识。下面涉及到的库也可以到这里下载(Windows版)。
2014年9月26日更新:
擦!每次弄OpenGL光配置都弄得很头大。。。由于换了Mac电脑,下面补充了Mac下的注意事项(这时候突然觉得Windows这么方便。。。)
-----------------------------------------------------------------分割线-------------------------------------------------------------------
什么是GLSL
- QGLFormat format;
- format.setVersion(4,0);
- format.setProfile(QGLFormat::CoreProfile);
- QGLWidget *myWidget = new QGLWidget(format);
GLEW
安装GLEW
- 下载 GLEW源码。
- 解压 GLEW。
- 打开命令行窗口,使用"cd"命令进入解压后的 GLEW 目录。
- 执行"make"命令,编译 GLEW。(注:要执行 make 命令,必须先确保 XCode 安装了 Command Line Tools)。
- 执行"sudo -s",进入管理员权限。
- 执行"make install",将 GLEW 的头文件和库文件分别复制到 /usr/include 和 /usr/include/GL 目录中。
- 在 Qt 工程中,右击项目图标,在弹出的快捷菜单中选择"Add Library..."命令。在弹出的向导对话框中选择"External Library",指定 GLEW 库文件和头文件的目录位置,在"Platform"中只勾选"Mac"一项。完成 GLEW 库的导入。
- 在 Qt 工程中,右击项目图标,在弹出的快捷菜单中选择"Add Library..."命令。在弹出的向导对话框中选择"System Library",指定 OpenGL.framework 的目录位置(在 /System/Library/Frameworks 目录下),在"Platform"中只勾选"Mac"一项。完成 OpenGL.framework 库的导入。
- 在 Qt 工程中,右击项目图标,在弹出的快捷菜单中选择"Add Library..."命令。在弹出的向导对话框中选择"System Library",指定 QtOpenGL.framework 的目录位置(在 Qt 安装目录的 lib 目录下),在"Platform"中只勾选"Mac"一项。完成 QtOpenGL.framework 库的导入。因为即使不使用
QtOpenGL 库中的 API,在使用 Qt 窗口框架时,还是会用到 QGLWidget 类的。
使用GLEW
- #include <GL/glew.h>
- #include <GL/gl.h>
- #include <GL/glu.h>
在初始化GL后、调用任何OpenGL代码前,加入以下代码:
- GLenum err = glewInit();
- if( GLEW_OK != err )
- {
- fprintf(stderr, "Error initializing GLEW: %s\n",
- glewGetErrorString(err) );
- }
其他库
使用GLM库进行数学运算
安装GLM
使用GLM
- #include <glm/glm.hpp>
- #include <glm/gtc/matrix_transform.hpp>
- #include <glm/gtx/transform2.hpp>
然后你就可以使用glm命名空间进行编码了。下面是一个例子:
- glm::vec4 position = glm::vec4( 1.0f, 0.0f, 0.0f, 1.0f );
- glm::mat4 view = glm::lookAt( glm::vec3(0.0,0.0,5.0),
- glm::vec3(0.0,0.0,0.0),
- glm::vec3(0.0,1.0,0.0) );
- glm::mat4 model = glm::mat4(1.0f);
- model = glm::rotate( model, 90.0f, glm::vec3(0.0f,1.0f,0.0) );
- glm::mat4 mv = view * model;
- glm::vec4 transformed = mv * position;
不要使用下面的代码来引入glm的命名空间:
- using namespace glm;
这通常会引起命名空间的冲突。相反,你应该使用下面的代码来包含某一个符号:
- #include <glm/glm.hpp>
- using glm::vec3;
- using glm::mat4;
使用GLM作为OpenGL的输入
- #include <glm/glm.hpp>
- #include <glm/gtc/matrix_transform.hpp>
- ...
- glm::mat4 proj = glm::perspective( viewAngle, aspect,
- nearDist, farDist );
- glUniformMatrix4fv(location, 1, GL_FALSE, &proj[0][0]);
更多文档可以详见http://glm.g-truc.net(需要翻墙)。
使用GLFW进行窗口管理
【OpenGL】初识OpenGL4.0的更多相关文章
- 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)
0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...
- 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)
在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...
- Beginning OpenGL ES 2.0 with GLKit Part 1
Update 10/24/12: If you’d like a new version of this tutorial fully updated for iOS 6 and Xcode 4.5, ...
- OpenGL ES 3.0 基础知识
首先要了解OpenGL的图形管线有哪些内容,再分别去了解其中的相关的关系: 管线分别包括了顶点缓冲区/数组对象,定点着色器,纹理,片段着色器,变换反馈,图元装配,光栅化,逐片段操作,帧缓冲区.其中顶点 ...
- OpenGL ES 3.0 点,线,三角形绘制形式总结
OpenGL ES 3.0 顶点 -1, 1, 0, -0.5f, 0, 0, 0, -1, 0, -1, 0, 0, 0.5f, 0, 0, 1, -1, ...
- Android OpenGL ES 3.0 纹理应用
本文主要演示OpenGL ES 3.0 纹理演示.接口大部分和2.0没什么区别,脚本稍微有了点变化而已. 扩展GLSurfaceView package com.example.gles300; im ...
- OpenGL ES 2.0 混合
混合技术 混合技术就是将俩个片元调和,主要用于将通过各项测试准备进入帧缓冲的片元(源片元)与原有片元按照设定的比例加权计算出最终片元的颜色值. OpenGL ES 2.0中是通过设置混合因子来指定两个 ...
- OpenGL研究2.0 计算圆
OpenGL研究2.0 计算圆 DionysosLai2014-06-18 在游戏中.常常有些地方涉及到一些圆的轨迹计算,例如一些转轴类的游戏,人物一般在角色转轴上面运动.这时,我们就要时刻计算角色的 ...
- WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起
WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTM ...
随机推荐
- css 判断是iphone4s iphone5 加载不同样式
@media (device-height:480px) and (-webkit-min-device-pixel-ratio:2){/* 兼容iphone4/4s */ .class{}}@med ...
- maven项目pom.xml中parent标签的使用(转)
原文地址:https://blog.csdn.net/qq_41254677/article/details/81011681 使用maven是为了更好的帮项目管理包依赖,maven的核心就是pom. ...
- python中的list,tuple,dict,set简介---陈雨童
变量和对象 变量把对象和自己连接起来(指针连接对象空间),引用建立了变量和对象之间的映射关系,这就是引用.引用完成,就实现了赋值.变量通过对象的内存地址指向对象,类似于软链接 将变量a赋值给变量b,其 ...
- 题解 [HNOI2004]宠物收养场
解析 这题似乎是裸的平衡树\(+\)模拟...于是用\(treap\)写了个板子. 看上去,我们似乎要维护两颗树(宠物和顾客), 然而,注意到,同一时间宠物点只有一类人(或物qwq), 所以,只要判断 ...
- [Python之路] 多种方式实现并发Web Server
下面我们使用Python来实现并发的Web Server,其中采用了多进程.多线程.协程.单进程单线程非阻塞的方式. 一.使用子进程来实现并发Web Server 参照 https://www.cnb ...
- java内存区域以及GC回收
参考资料: http://www.cnblogs.com/zhguang/p/3257367.html 概要: Java GC机制主要完成3件事:确定哪些内存需要回收,确定什么时候需要执行GC,如何执 ...
- 22.Python赋值运算符(入门必读)
赋值运算符主要用来为变量(或常量)赋值,在使用时,既可以直接用基本赋值运算符“=”将右侧的值赋给左侧的变量,右侧也可以在进行某些运算后再赋值给左侧的变量. = 基本赋值运算符 Python 使用“=” ...
- tkmybatis逆向工程关于tinyint的玄学问题
数据库中存储的数据类型是tinyint(1) state tinyint(1) 状态0-未完成:1-待提交:2-待支付:3支付失败: 不为空 tinyint(1)存储的时候会存储下面长度的数字 但是在 ...
- ShareX的使用
给截图设置边框 https://github.com/ShareX/ShareX/issues/2509 TaskSettings-->Image-->Effects-->image ...
- k8s环境部署(一)
环境介绍 1.单masrer节点 (安装下面图中介绍的四个组件) 2.俩个node节点(安装kubelet和docker) 3.为了支持master与node之前的通信,我们还需要在master上安装 ...
