大片视频免费观看视频_欧美激情猛片xxxⅹ大3之樱桃_性饥渴艳妇性色生活片在线播放_啦啦啦www视频在线观看_宝贝~你里面好紧我好爽视频_国产国产人免费人成免费视频_来自GeoGebra 的交互式_欧美又色又爽又黄的A片18禁_色欲aⅴ亚洲情无码AV

PowerVR框架:PVRApi Vulkan和OpenGL ES抽象層

share

在本次的系列文章中,我們將闡述如何使用PowerVR框架創(chuàng)建跨平臺(tái)跨API的圖形應(yīng)用程序——所有均來(lái)自一組源代碼文件!

本系列文章將分為以下幾個(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 ——允許使用快速路徑來(lái)盡可能地模擬顯式API

? 一個(gè)源基地支持所有主要的平臺(tái)——Android、iOS、Windows、Linux和OS X

最重要的是,這個(gè)框架使我們得以盡可能多地使用樣本化代碼來(lái)進(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庫(kù):

?Visual Studio 14?XCode – iOS 和OS X?Android Ninja 和Visual Studio 14?Ubuntu 14.04 Make

所有示例和CMake文件都托管在以下資源庫(kù)的GitHub上:

PVRApiIntro

請(qǐng)參見GitHub頁(yè)面,了解如何在支持平臺(tái)上構(gòu)建及運(yùn)行Intro1ClearApi。GitHub頁(yè)面還詳細(xì)描述了CMake的構(gòu)建過(guò)程。CMake文件是基于您自身項(xiàng)目框架的數(shù)據(jù)庫(kù)。若您在創(chuàng)建示例中有任何疑問(wèn)請(qǐng)?jiān)?PowerVR Support或PowerVR Forum上與我們聯(lián)系。

讓我們回顧下第一個(gè)概念,即通過(guò)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 etcvirtual pvr::Result::Enum initView(); // Graphics set-up - load textures, create command buffers etcvirtual pvr::Result::Enum renderFrame(); // Render frame called at VSync rate - submit command buffers etcvirtual pvr::Result::Enum releaseView(); // Graphics tear down - delete textures, command buffers etcvirtual pvr::Result::Enum quitApplicaTIon(); // Non-graphics tear down - close audio devices etc};

initApplication()和quitApplication()——對(duì)于Intro1ClearAPI,我們可以在這兩個(gè)函數(shù)時(shí)返回至pvr::Result::Success。這里沒(méi)有非圖像設(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 bufferfor (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 buffercb->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()——在這里,我們通過(guò)initView()為每個(gè)幀緩沖創(chuàng)建了一個(gè)命令緩沖區(qū)。renderFrame()以initView()命名,以VSync…率渲染框架。通過(guò)調(diào)用getSwapChainIndex(),可以確定交換鏈中接下來(lái)是哪些幀緩沖。然后再為幀緩沖提交相應(yīng)的命令緩沖區(qū)——將我們的框架渲染至屏幕中。

pvr::Result::Enum OGLESIntroducingPVRApi::renderFrame(){

onscreenCBArray[getSwapChainIndex()]->submit();

return pvr::Result::Success;

}

share