2013-08-16 64 views
0

我工作的OpenGL ES 2.0的使用OMAP3530開發板的Windows CE 7圖像旋轉使用的OpenGL ES

我的任務就是裝載一個24位圖像文件&旋轉它關於Z-的角度軸&導出圖像文件(緩衝區)。

對於這個任務,我創建了一個FBO閉屏渲染&加載此圖像文件作爲紋理使用glTexImage2D()&我已經應用了紋理的四&旋轉,通過使用PVRTMat4 QUAD :: RotationZ()API &使用ReadPixels()API回讀。由於這是一個單幀過程,我只做了1個循環。

以下是我現在面臨的問題。 1)所有的API在每次運行時都需要不同的處理時間。有時當我運行我的應用程序時,我會爲所有API獲得不同的處理時間。

2)(4,8)被花費過多時間(約50毫秒 - 80毫秒)

3)glReadPixels()也花費過多時間〜95毫秒的圖像(800×600)

4 )加載32位圖像比24位圖像快得多,因此需要轉換。

我想問問大家,如果有人對着/解決類似的問題好心建議我任何

這裏是我的應用程序的代碼片段。

[code] 
[i] 
void BindTexture(){ 
glGenTextures(1, &m_uiTexture); 
glBindTexture(GL_TEXTURE_2D, m_uiTexture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ImageWidth, ImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, TCHAR *lpCmdLine, int nCmdShow) 
{ 
// Fragment and vertex shaders code 
char* pszFragShader = "Same as in RenderToTexture sample; 
char* pszVertShader = "Same as in RenderToTexture sample; 

CreateWindow(Imagewidth, ImageHeight);//For this i've referred OGLES2HelloTriangle_Windows.cpp example 
LoadImageBuffers(); 
BindTexture(); 

Generate& BindFrame,Render Buffer(); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_auiFbo, 0); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, ImageWidth, ImageHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_auiDepthBuffer); 
BindTexture(); 

GLfloat Angle = 0.02f; 
GLfloat afVertices[] = {Vertices to Draw a QUAD}; 

glGenBuffers(1, &ui32Vbo); 
LoadVBO's();//Aps's to load VBO's refer 

// Draws a triangle for 1 frames 
while(g_bDemoDone==false) 
{ 
glBindFramebuffer(GL_FRAMEBUFFER, m_auiFbo); 
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

PVRTMat4 mRot,mTrans, mMVP; 
mTrans = PVRTMat4::Translation(0,0,0); 
mRot = PVRTMat4::RotationZ(Angle); 

glBindBuffer(GL_ARRAY_BUFFER, ui32Vbo); 
glDisable(GL_CULL_FACE); 

int i32Location = glGetUniformLocation(uiProgramObject, "myPMVMatrix"); 
mMVP = mTrans * mRot ; 

glUniformMatrix4fv(i32Location, 1, GL_FALSE, mMVP.ptr()); 

// Pass the vertex data 
glEnableVertexAttribArray(VERTEX_ARRAY); 
glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, m_ui32VertexStride, 0); 

// Pass the texture coordinates data 
glEnableVertexAttribArray(TEXCOORD_ARRAY); 
glVertexAttribPointer(TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, m_ui32VertexStride, (void*) (3 * sizeof(GLfloat))); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);// 

glReadPixels(0,0,ImageWidth ,ImageHeight,GL_RGBA,GL_UNSIGNED_BYTE,pOutTexData) ; 

glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

eglSwapBuffers(eglDisplay, eglSurface); 

} 

DeInitAll();[/i][/code] 

回答

0

我已經改善了旋轉圖像緩衝區的性能,我使用了多個FBO的& PBO's。 這是我的應用程序的僞代碼片段。

InitGL() 
GenerateShaders(); 
Generate3Textures();//Generate 3 Null Textures 
Generate3FBO();//Generate 3 FBO & Attach each Texture to 1 FBO. 
Generate3PBO();//Generate 3 PBO & to readback from FBO. 

DrawGL() 
{ 
BindFBO1; 
BindTexture1; 
UploadtoTexture1; 
Do Some Processing & Draw it in FBO1; 

BindFBO2; 
BindTexture2; 
UploadtoTexture2; 
Do Some Processing & Draw it in FBO2; 

BindFBO3; 
BindTexture3; 
UploadtoTexture3; 
Do Some Processing & Draw it in FBO3; 


BindFBO1; 
ReadPixelfromFBO1; 
UnpackToPBO1; 

BindFBO2; 
ReadPixelfromFBO2; 
UnpackToPBO2; 

BindFBO3; 
ReadPixelfromFBO3; 
UnpackToPBO3; 
} 


DeinitGL(); 
DeallocateALL(); 

通過這種方式,我已經實現了總體處理性能提高50%。

0

PowerVR架構無法渲染單個幀,並允許ARM快速讀取它。它只是沒有設計成快速工作 - 這是一個延遲渲染基於磁貼的架構。你所看到的執行時間太多了,使用FBO也不會讓它更快。另外,請注意OMAP for Windows CE上的OpenGL ES驅動程序質量很差。如果他們工作的話,請考慮自己的幸運。

更好的設計是將OpenGL ES渲染直接顯示給DSS,並避免完全使用glReadPixels()和FBO。

+0

謝謝@ClayMontgomery的回覆。我會考慮您的建議......如果您指定了任何解釋與直接呈現給DSS相關的方法的鏈接,這將非常有幫助。 –

+0

DSS是在OMAP上顯示OpenGL ES渲染圖形的正常路徑。對此沒有特別要求。 – ClayMontgomery