一篇极度舒适的OpenGL_ES环境搭建(Ubuntu 18.04 LTS)
目录
- 前言
- PowerVR
- CMake环境
- FreeImage
- CMakeLists.txt解析
- 源码
- 最后
前言
作为一个梦想成为游戏制作人的菜鸟程序员, 我终究没悬念地踏上了撰写shader的道路(手动滑稽). 这是一篇比较细致的Ubuntu18.04下OpenGL_ES环境搭建的文件, 也是我爬过n多个坑之后的总结, 希望能帮助到Mac背后的你(手动滑稽).
PowerVR
模拟器方面, 我选择PowerVR, 当然, 你可以选择别的, 来到官网, 下载对应的SDK, 运行下载后的文件, 即可安装. 当然了, 如果不能运行, 用chmod添加运行权限即可. 我的第一个Hello, World案例也是基于PowerVR的Hello案例魔改的.
值得一提的就是安装目录记一下, 之后要用到:
CMake环境
这里我选用CLion开发, 这样更友好, 尽管CLion的vim似乎不够强大, 但是考虑到调试等功能, 还是值得拥有的. 当然, 自己用vim搭建IDE也是完全OK的. 先确保有安装了build-essential, libx11-dev, 当然了, 你的Linux可能不是X11, 做出相应修改即可.
sudo apt-get install build-essential libx11-dev
FreeImage
纹理加载我选用的是FreeImage, 使用也比较简单, 下载, 编译, 安装即可.
make make install
不知道为啥, 我打不开官网, 不过有人在github备份了.
CMakeLists.txt解析
先贴出CMakeLists.txt全文.
cmake_minimum_required(VERSION 3.15) project(gles_demo) set(CMAKE_CXX_STANDARD 14) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(SDK_ROOT /opt/Imagination/PowerVR_Graphics/PowerVR_SDK/SDK_2020_R2) # sdk目录 set(CMAKE_MODULE_PATH ${SDK_ROOT}/cmake/modules) if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") endif () set(INCLUDE_DIR ${SDK_ROOT}/include/) # gles库 find_library(EGL_LIBRARY EGL "/opt/Imagination/PowerVR_Graphics/PowerVR_Tools/PVRVFrame/Library/Linux_x86_64/") find_library(GLES_LIBRARY GLESv2 "/opt/Imagination/PowerVR_Graphics/PowerVR_Tools/PVRVFrame/Library/Linux_x86_64/") # FreeImage库 find_library(FI_LIBRARY freeimage "/usr/lib/") list(APPEND PLATFORM_LIBS ${EGL_LIBRARY} ${GLES_LIBRARY} ${FI_LIBRARY} ${CMAKE_DL_LIBS}) if (UNIX) set(WS_DEFINE "") if (NOT WS) set(WS "X11") set(WS_DEFINE "${WS}") endif () if (NOT DEFINED CMAKE_PREFIX_PATH) set(CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH}) endif () add_definitions(-D${WS_DEFINE}) if (${WS} STREQUAL X11) find_package(X11 REQUIRED) if (NOT ${X11_FOUND}) message(FATAL_ERROR "X11 libraries could not be found. Please try setting: -DCMAKE_PREFIX_PATH pointing towards your X11 libraries") endif () list(APPEND PLATFORM_LIBS ${X11_LIBRARIES}) include_directories(${X11_INCLUDE_DIR}) set(SRC_FILES gles_x11.cpp) # 源码 else () message(FATAL_ERROR "Unrecognised WS: Valid values are NullWS(default), X11, Wayland, Screen.") endif () add_definitions(-D${WS}) #Add a compiler definition so that our header files know what we're building for add_executable(gles_demo ${SRC_FILES}) endif () if (PLATFORM_LIBS) target_link_libraries(gles_demo ${PLATFORM_LIBS}) endif () target_include_directories(gles_demo PUBLIC ${INCLUDE_DIR}) # include目录 target_compile_definitions(gles_demo PUBLIC $<$<CONFIG:Debug>:DEBUG=1> $<$<NOT:$<CONFIG:Debug>>:RELEASE=1>) # Defines DEBUG=1 or RELEASE=1
可以看到, 我手动添加了FreeImage库和模拟器给的两个库, libEGL.so, libGLESv2.so. 这里我想吐槽一下win, 非要搞出一个.lib, 又一个.dll, 明明一个.so就搞定的事情.
至于X11的库, 之前也说了, 如果你是其他的Linux, 找对应的库, 修改CMake内容即可, 当然了, cpp文件也要重写. 所以, 这里才用了PowerVR的例子, 他们已经把全平台的CMake和源码都写好了, 改改就行(手机狗头). 当然, OpenGL_ES指南有一份跨平台的源码, 我也尝试过, 缺点是似乎只能使用c语言, 我反复修改构建也是如此, 可能是我对编译原理的理解还不到位, 所以就放弃了指南的源码. 毕竟都是要二次封装的, 只用c的话, 臣妾做不到啊(手动无奈).
源码
源码部分, 我先用一个Util类封装了大部分不需要过多关系的操作, 把处理重心放在初始化和绘制上面. 所以先来看下main函数的内容.
int main(int /*argc*/, char ** /*argv*/) { start = clock(); // opengl_es工具类实例 std::string appName("GLES Demo"); GLESUtils glesUtils(WIN_WIDTH, WIN_HEIGHT, appName); // 初始化本地和EGL相关 glesUtils.initNativeAndEGL(); // 初始化shader if (!glesUtils.initShaders()) { glesUtils.cleanProc(); } // 绘图, 循环次数为帧数 for (int i = 0; i < 80000; ++i) { if (!glesUtils.renderScene()) { break; } } // 释放资源 glesUtils.deInitGLState(); return 0; }
- 生成工具类实例
- 设置窗口大小和名称
- 初始化本地和EGL相关变量
- 然后是关键的初始化shader和绘图
最后
来看看效果吧.
至于更多有关OpenGL_ES的内容, 就要等后续的部分啦. 喜欢记得点赞或者关注哦~
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
区块链应用错误案例指南
区块链现在是热门的技术,每个人都在寻求用区块链解决各种各样的问题。自2017年我开始从事智能合约的安全审计以来,已经看到了太多错误的区块链用例。有些错误的区块链用例看起来符合逻辑并且也有益处,但是实际上其中存在着问题。本文将介绍存在8种典型的基于区块链的错误的解决方案,以期帮助开发者/投资者/客户更深刻地理解区块链技术的边界。 相关教程推荐: Hyperledger Fabric | Ethereum | Tendermint | Bitcoin | EOS 1、基于区块链的供应链管理 假设你订购了一批货物,承运人承诺了运输条件,例如保持你的货物处于冷藏状态。一种区块链应用解决方案是在货车上安装可以监视冷柜温度的传感器并定期将温度数据写入区块链,这样你就可以确信承运人所承诺的运输条件在整个过程中都得到满足。 这个区块链应用案例的问题不在区块链,而在于传感器。作为现实世界的一部分,传感器很容易被愚弄。例如,一个恶意的承运人可能只会启动货车中的一个小冷柜然后把传感器放进这个小冷柜,而把你的货物放在货车的没有冷藏环境的空间以节省成本。 我将这种问题定义为:区块链不是物联网。 在文本中我们将多...
- 下一篇
我自己开发的工具,打印出百度贴吧某用户发表过的所有帖子
<html> <meta charset="UTF-8"/> <style> a { color: green; font-family: arial; font-weight: bold } </style> <body> <div id="container"></div> </body> <script src="jquery1.7.1.js"> /* Jerry 2017-02-06 14:58PM update should use C:\MyApp\Chrome\Application\chrome.exe --user-data-dir="C:/yaas" --disable-web-security and then FIRST LOG ON BAIDU successfully!!!! */ </script> <script> /* Jerry 2017-02-05 5:54PM 这个警告的意思是说:请求的资源可能会被(扩展/或其他什么...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装