在本次的系列文章中,我們將闡述如何使用PowerVR框架創(chuàng)建跨平臺(tái)跨API的圖形應(yīng)用程序——所有均來自一組源代碼文件!
本系列文章將分為以下幾個(gè)部分:
? PowerVR框架: PVRApi Vulkan和OpenGL ES抽象層
? PowerVR框架:使用PVRApi編寫可移植的Vulkan和OpenGL ES 3.0/3.1
? PowerVR框架:使用PVRAssets加載場(chǎng)景、紋理和著色器
? PowerVR框架:了解圖像渲染紋理效果的障礙
讓我們先從第一部分開始。
第一部分的重點(diǎn)是已清除的屏幕,如下所示:
雖然不是最高級(jí)的示例,但其引入了編寫框架程序所需的第一個(gè)概念。
首先,讓我們談?wù)凱owerVR框架的主旨及使用此框架的原因。
新框架設(shè)計(jì)的主旨是:
? 支持新的顯式API,如Vulkan——展示其強(qiáng)大功率的同時(shí)又隱藏了其冗長(zhǎng)性
? 繼續(xù)支持OpenGL ES 3.x ——允許使用快速路徑來盡可能地模擬顯式API
? 一個(gè)源基地支持所有主要的平臺(tái)——Android、iOS、Windows、Linux和OS X
最重要的是,這個(gè)框架使我們得以盡可能多地使用樣本化代碼來進(jìn)行高層次的消除設(shè)計(jì)。
請(qǐng)關(guān)注“新PowerVR架構(gòu)綜述”一文獲取更多信息,若不熟悉Vulkan請(qǐng)關(guān)注“Vulkan API的詳細(xì)解讀”一文。
現(xiàn)在,我們將創(chuàng)建第一個(gè)示例——Intro1ClearApi。
創(chuàng)建Intro1ClearApi將需要git、CMake 3.1 +和可以支持的IDE /平臺(tái)。
以下平臺(tái)已使用CMake 3.3.1進(jìn)行測(cè)試,并使用了比較合適的SDK 16.1發(fā)行版PVRVFrame庫:
? Visual Studio 14
? XCode – iOS 和OS X
? Android Ninja 和Visual Studio 14
? Ubuntu 14.04 Make
所有示例和CMake文件都托管在以下資源庫的GitHub上:
PVRApiIntro
請(qǐng)參見GitHub頁面,了解如何在支持平臺(tái)上構(gòu)建及運(yùn)行Intro1ClearApi。GitHub頁面還詳細(xì)描述了CMake的構(gòu)建過程。CMake文件是基于您自身項(xiàng)目框架的數(shù)據(jù)庫。若您在創(chuàng)建示例中有任何疑問請(qǐng)?jiān)?PowerVR Support或PowerVR Forum上與我們聯(lián)系。
讓我們回顧下第一個(gè)概念,即通過Intro1ClearApi編寫框架應(yīng)用程序。所有的源代碼均涵括在ClearAPI.cpp中。
編寫框架應(yīng)用程序,我們可以擴(kuò)展pvr::Shell并實(shí)現(xiàn)以下切入點(diǎn):
class MyApp : public pvr
{
public:
virtual pvr::Result::Enum initApplication(); // Perform non-graphics set-up - audio initialization etc
virtual pvr::Result::Enum initView(); // Graphics set-up - load textures, create command buffers etc
virtual pvr::Result::Enum renderFrame(); // Render frame called at VSync rate - submit command buffers etc
virtual pvr::Result::Enum releaseView(); // Graphics tear down - delete textures, command buffers etc
virtual pvr::Result::Enum quitApplication(); // Non-graphics tear down - close audio devices etc
};
initApplication()和quitApplication()——對(duì)于Intro1ClearAPI,我們可以在這兩個(gè)函數(shù)時(shí)返回至pvr::Result::Success。這里沒有非圖像設(shè)置。
initView()——形成了Intro1ClearAPI的核心。在現(xiàn)代API如Vulkan中,我們想在主要渲染線程(renderFrame()函數(shù))之外創(chuàng)建命令緩沖區(qū)。這時(shí)我們便可以使用第二個(gè)線程或者根據(jù)命令緩沖區(qū)的靜態(tài)要求在initView()上完成。對(duì)于Intro1ClearAPI,我們?cè)趇nitView() 時(shí)準(zhǔn)備所有命令緩沖區(qū),即在交換鏈中為每一幀緩沖創(chuàng)建一個(gè)命令緩沖區(qū)。在renderFrame()中提交所有命令緩沖區(qū)。
pvr::Result::Enum OGLESIntroducingPVRApi::initView() {
onscreenFB = getGraphicsContext()->createOnScreenFboSet(); // This returns an array of our on-screen frame buffers. In OpenGL ES we just receive one.
// We then create a command buffer for each frame buffer
for (int i = 0 ; i < getSwapChainLength(); i++){
onscreenCBArray.add(getGraphicsContext()->createCommandBufferOnDefaultPool());
auto & cb = onscreenCBArray[i];
auto & frameBuffer = onscreenFB[i];
// We record a command buffer with a render pass that clears the screen for each frame buffer
cb->beginRecording();
cb->beginRenderPass(frameBuffer, pvr::Rectanglei(0, 0, getWidth(), getHeight()),false,
glm::vec4(123.0 / 255.0, 172.0 / 255.0, 189.0 / 255.0, 1.0));
cb->endRenderPass();
cb->endRecording();
}
return pvr::Result::Success;
};
renderFrame()——在這里,我們通過initView()為每個(gè)幀緩沖創(chuàng)建了一個(gè)命令緩沖區(qū)。renderFrame()以initView()命名,以VSync…率渲染框架。通過調(diào)用getSwapChainIndex(),可以確定交換鏈中接下來是哪些幀緩沖。然后再為幀緩沖提交相應(yīng)的命令緩沖區(qū)——將我們的框架渲染至屏幕中。
pvr::Result::Enum OGLESIntroducingPVRApi::renderFrame(){
onscreenCBArray[getSwapChainIndex()]->submit();
return pvr::Result::Success;
}
在Vulkan中提交命令緩沖區(qū)的成本很低——僅在渲染線程中提交命令緩沖區(qū)可以確保幀速率的穩(wěn)定。如果需要一個(gè)新的命令緩沖區(qū),則可以在后臺(tái)線程中創(chuàng)建——充分利用現(xiàn)代多核處理器的優(yōu)勢(shì)。
releaseView()——這是最后一個(gè)覆蓋的函數(shù),隨后我們又返回到pvr::Result::Success。
這篇介紹中,我們回顧了使用PowerVR框架渲染屏幕所需的最簡(jiǎn)單的原則。
相比原始的Vulkan調(diào)用,這里已經(jīng)大量減少了冗余。相比較而言,這里生成的是API流——包括結(jié)構(gòu)參數(shù)——通過PowerVR框架渲染基本場(chǎng)景Intro1ClearApi Vulkan API調(diào)用而生成。
該框架還通過將EGL/windowset-upIntro1ClearApi OpenGL ES調(diào)用抽象化而簡(jiǎn)化了OpenGL ES渲染。
更重要的是,這個(gè)相同的代碼覆蓋了所有平臺(tái)——OpenGL ES和Vulkan,實(shí)現(xiàn)了適用于這兩種API的抽象。
在接下來的文章中,我將闡述繪制三角形的過程,展示使用PVRApi 時(shí)Vulkan和OpenGL ES之間的第一個(gè)差異之處。
評(píng)論
查看更多