目錄
- 前言
- PowerVR
- CMake環境
- FreeImage
- CMakeLists.txt解析
- 源碼
- 最後
作為一個夢想成為遊戲制作人的菜鳥程式員, 我終究沒懸念地踏上了撰寫shader的道路(手動滑稽). 這是一篇比較細緻的Ubuntu18.04下OpenGL_ES環境搭建的檔案, 也是我爬過n多個坑之後的總結, 希望能幫助到Mac背後的你(手動滑稽).
模拟器方面, 我選擇PowerVR, 當然, 你可以選擇别的, 來到 官網 , 下載下傳對應的SDK, 運作下載下傳後的檔案, 即可安裝. 當然了, 如果不能運作, 用chmod添加運作權限即可. 我的第一個Hello, World案例也是基于PowerVR的Hello案例魔改的.
值得一提的就是安裝目錄記一下, 之後要用到:
這裡我選用CLion開發, 這樣更友好, 盡管CLion的vim似乎不夠強大, 但是考慮到調試等功能, 還是值得擁有的. 當然, 自己用vim搭建IDE也是完全OK的. 先確定有安裝了build-essential, libx11-dev, 當然了, 你的Linux可能不是X11, 做出相應修改即可.
sudo apt-get install build-essential libx11-dev
紋理加載我選用的是FreeImage, 使用也比較簡單, 下載下傳, 編譯, 安裝即可.
make
make install
不知道為啥, 我打不開官網, 不過有人在 github備份 了.
先貼出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的内容, 就要等後續的部分啦. 喜歡記得點贊或者關注哦~