天天看點

一篇極度舒适的OpenGL_ES環境搭建(Ubuntu 18.04 LTS)

github傳送門

目錄

  • 前言
  • 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環境搭建(Ubuntu 18.04 LTS)
至于更多有關OpenGL_ES的内容, 就要等後續的部分啦. 喜歡記得點贊或者關注哦~