今天要写一篇demo,来测试一下opengl在windows平台上的: glReadPixels()速度测试.web
测试目的:
首先使用8K的YUV渲染到帧缓冲区,而后从帧缓冲区中读取出rgb pixels,测试在如下几种中,glReadPixels()的效率.windows
测试机器:svg
外星人笔记本,配置以下:测试
cpu: Intel core tm i7-6280HK @2.7 GHZ调试
双显卡:
intel® HD Graphics 530
NVIDIA GeForce GTX 980Mcode
windows下opengl开发环境采用的是: PowerVR.orm
下载地址可能会变更,你们到官网下载最新的便可.
http://cdn.imgtec.com/sdk/PowerVRSDKSetup-2018_R2.execdn
测试效果以下:
xml
中间碰到的问题汇总:对象
glReadPixels(0, 0, txWidth, txHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixelBufWrite);
注意,这里是用GL_RGBA仍是GL_RGB要看本身的系统是否支持的,目前我本身的win pc电脑不支持GL_RGB,因此我最开始用
glReadPixels(0, 0, txWidth, txHeight, GL_RGB, GL_UNSIGNED_BYTE, pixelBufWrite);
这种模式读出来的数据是明显不正确的.
接下来介绍实现 :
确定要使用帧缓冲区的概念的 :
1.建立帧缓冲区
//建立帧缓冲区对象 //generate the framebuffer ,renderbuffer glGenFramebuffers(1,&userData->framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, userData->framebuffer); glGenRenderbuffers(1, &userData->depthRenderbuffer); //bind renderbuffer and create a 16-bit depth buffer glBindRenderbuffer(GL_RENDERBUFFER, userData->depthRenderbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, txWidth, txHeight); glBindRenderbuffer(GL_RENDERBUFFER, 0); //specify texture as color attachment glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, userData->textureId2, 0); //specify depth renderbuffer as depth attachment glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, userData->depthRenderbuffer); glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); glBindFramebuffer(GL_FRAMEBUFFER , 0); //测试默认支持的视窗宽高 int dimes[2]; glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dimes); //check int dimes2[2]; glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, dimes2);
2.使用帧缓冲区的很简答了.
表示渲染到帧缓冲区
glBindFramebuffer(GL_FRAMEBUFFER, userData->framebuffer);
表示渲染到本机物理窗口:
glBindFramebuffer(GL_FRAMEBUFFER, 0);
3.glReadPixels时间测试:
//glReadPixels //测试时间 LARGE_INTEGER large_integer; __int64 IntStart; __int64 IntEnd; double DobDff; double DobMillseconds; QueryPerformanceFrequency(&large_integer); DobDff = large_integer.QuadPart; QueryPerformanceCounter(&large_integer); IntStart = large_integer.QuadPart; glReadPixels(0, 0, txWidth, txHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixelBufWrite); QueryPerformanceCounter(&large_integer); IntEnd = large_integer.QuadPart; DobMillseconds = (IntEnd - IntStart) * 1000 / DobDff; //转为ms printf("mill seconds: %f \n" , DobMillseconds);
opengl的调试十分的繁琐,通常运用下面的方法进行调试:
void CheckGlError(const char* op) { for (GLint error = glGetError(); error; error = glGetError()) { printf("after %s() glError (0x%x)\n", op, error); } }