总是使用1的alginment有什么缺点?
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glPixelStorei(GL_PACK_ALIGNMENT, 1)
Run Code Online (Sandbox Code Playgroud)
它会影响现代gpus的性能吗?
我可以使用像素缓冲区对象(PBO)直接从FBO读取像素值(即使用glReadPixels)(即FBO仍然连接时)?
如是,
{
//DATA_SIZE = WIDTH * HEIGHT * 3 (BECAUSE I AM USING 3 CHANNELS ONLY)
// FBO and PBO status is good
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
//Draw the objects
Run Code Online (Sandbox Code Playgroud)
以下glReadPixels工作正常
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData);
Run Code Online (Sandbox Code Playgroud)
以下glReadPixels不工作:(
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId);
//yes glWriteBuffer has also same target and I also checked with every possible values
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData);
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //back to window framebuffer
Run Code Online (Sandbox Code Playgroud) 有没有办法在opengl es 2.0中使用与宽度不同的音高来设置纹理.通常我会通过使用PBO或通过glPixelStore调整GL_PACK_ROW_LENGTH来解决这个问题.但是,似乎在Android平台上都没有用于绑定缓冲区的GL_PIXEL_UNPACK_BUFFER或GL_PACK_ROW_LENGTH.
glTex(Sub)Image2D不支持此功能.
有小费吗?
我想用两个PBO以另一种方式读取像素.我认为PBO方式会更快,因为glReadPixels在使用PBO时会立即返回,并且很多时间可以重叠.
奇怪的是似乎没有太大的好处.考虑一些代码,如:
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
Timer t; t.start();
glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, buf);
t.stop(); std::cout << t.getElapsedTimeInMilliSec() << " ";
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);
t.start();
glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, 0);
t.stop(); std::cout << t.getElapsedTimeInMilliSec() << std::endl;
Run Code Online (Sandbox Code Playgroud)
结果是
1.301 1.185
1.294 1.19
1.28 1.191
1.341 1.254
1.327 1.201
1.304 1.19
1.352 1.235
Run Code Online (Sandbox Code Playgroud)
PBO的方式有点快,但不是令人满意的立即回报.
我的问题是:
================================================== =========================
根据与演示的比较,我发现了两个因素:
然后另外两个问题:
这时候有人问关于OpenGL的视频流纹理文章经常引用.
它说:
要最大化流传输性能,可以使用多个像素缓冲区对象.该图显示同时使用2个PBO; 当纹理源被写入另一个PBO时,glTexSubImage2D()从PBO复制像素数据.
对于第n帧,PBO 1用于glTexSubImage2D(),PBO 2用于获得新的纹理源.对于第n + 1帧,2个像素缓冲区正在切换角色并继续更新纹理.由于异步DMA传输,可以同时执行更新和复制过程.CPU将纹理源更新为PBO,而GPU从其他PBO复制纹理.
它们提供了一个简单的基准程序,允许您在没有PBO的情况下在单个PBO之间循环纹理更新,并且如上所述使用两个PBO.
启用一个PBO时,我看到性能略有改善.但第二个PBO没有真正的区别.
在代码glMapBuffer的PBO之前,它调用glBufferData并将指针设置为NULL.这样做是为了避免同步停顿.
// map the buffer object into client's memory
// Note that glMapBufferARB() causes sync issue.
// If GPU is working with this buffer, glMapBufferARB() will wait(stall)
// for GPU to finish its job. To avoid waiting (stall), you can call
// first glBufferDataARB() with NULL pointer before glMapBufferARB().
// If you do that, the previous data in PBO will be discarded and
// glMapBufferARB() returns a new …Run Code Online (Sandbox Code Playgroud) 我需要在屏幕上快速绘制像素.
我找到了这个有趣的页面 快速像素绘图库
作者发布:"使用OpenGL纹理和PBO似乎是最好的选择.谢谢."
我想OpenGL/PBO就是我需要的.
我在http://www.opengl.org/registry/specs/ARB/pixel_buffer_object.txt 和http://www.songho.ca/opengl/gl_pbo.html上阅读了PBO , 但我不明白. ..
有人可以提供简单的例子,如何在具有PBO扩展的2D纹理上的位图上绘制像素?
我刚刚发现了以下OpenGL规范ARB_map_buffer_range.
我想知道是否可以使用此扩展程序进行非阻塞地图调用?
目前在我的应用程序中我渲染到FBO,然后我映射到主机PBO缓冲区.
glMapBuffer(target_, GL_READ_ONLY);
Run Code Online (Sandbox Code Playgroud)
但是,问题在于它在传输数据时会阻塞渲染线程.
我可以通过管道渲染来减少这个问题,但延迟是我的应用程序中的一个大问题.
我的问题是我是否可以将map_buffer_range与MAP_UNSYNCHRONIZED_BIT一起使用并等待映射操作在另一个线程上完成,或者在同一线程上推迟映射操作,同时渲染线程渲染下一帧.
例如
thread 1:
map();
render_next_frame();
thread 2:
wait_for_map
Run Code Online (Sandbox Code Playgroud)
要么
thread 1:
map();
while(!is_map_ready())
do_some_rendering_for_next_frame();
Run Code Online (Sandbox Code Playgroud)
我不确定的是我如何知道地图操作何时准备好,规范只提到"其他同步技术以确保正确操作".
有任何想法吗?
我读到应该可以使用像素缓冲区对象直接在 GPU 内存中传输像素数据。我不明白的是 OpenGL ES 2.0 是否支持 PBO。我发现了不连贯的信息。OpenGL ES 2.0 是否支持 PBO?
如果没有,OpenGL ES 2.0 是否还有其他方法可以将数据(RGBA32)直接放入纹理中?
我设法编写了一个视频录制演示,类似于grafika 的ContinuousCaptureActivity(ContinuousCaptureActivity.java的源代码).
不同之处在于grafika使用了硬件编码,但我使用了软件编码.对于软件编码,我使用PBO从GPU获取每个视频帧非常快并将图像数据复制到ffmpeg,然后执行h264编码.
对于大多数设备来说,性能是可以接受的,glMapBufferRange()花了不到5ms而memcpy()花了不到10ms.
但是华为mate7手机的性能很低.glMapBufferRange()需要15~30ms,memcpy()需要25~35ms.
我在mate7上测试了正常的memcpy(),复制普通内存时速度要快得多.
真的很奇怪,谁可以给我一些帮助?
设备信息:
chipset of the phone: HiSilicon Kirin 925
cpu of the phone: Quad-core 1.8 GHz Cortex-A15 & quad-core 1.3 GHz Cortex-A7
Run Code Online (Sandbox Code Playgroud)
pbo代码如下:
final int buffer_num = 1;
final int pbo_id[] = new int[buffer_num];
private void getPixelFromPBO(int width, int height, boolean isDefaultFb) {
try {
long start = System.currentTimeMillis();
final int pbo_size = width * height * 4;
if (mFrameNum == 0) { …Run Code Online (Sandbox Code Playgroud) glBufferStorage有一个标志 GL_MAP_COHERENT_BIT,这个标志有如下描述:
对同时映射用于客户端访问并由服务器使用的缓冲区的共享访问将是一致的,只要该映射是使用 glMapBufferRange? 执行的。也就是说,客户端或服务器写入存储的数据将立即对另一个可见,应用程序无需采取进一步的操作。特别是,
如果在映射范围内写入值,如何使其对另一方可见?这是通过 DMA 控制器使用 DMA 传输吗?还是有其他机制?
pbo ×10
opengl ×7
c++ ×3
glreadpixels ×2
opengl-es ×2
textures ×2
alignment ×1
android ×1
fbo ×1
framebuffer ×1
gpgpu ×1
grafika ×1
linux ×1
memcpy ×1
nonblocking ×1
performance ×1
pixel ×1