opengl glReadPixels() 速度测试

今天要写一篇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);
    }
}