有没有比使用glReadPixels更快的方式来访问帧缓冲区?我需要对帧缓冲区中的小矩形渲染区域进行只读访问,以便在CPU中进一步处理数据.性能很重要因为我必须重复执行此操作.我在网上搜索并发现了一些方法,比如使用像素缓冲区对象和glMapBuffer,但似乎OpenGL ES 2.0不支持它们.
我正在尝试在霓虹灯中实现直方图.矢量化是否可能?
我有一个顶点着色器,我在其中进行纹理查找以确定gl_Position.我将其用作GPU粒子模拟系统的一部分,其中粒子位置存储在纹理中.
似乎:vec4 textureValue = texture2D(dataTexture, vec2(1.0, 1.0));在模拟器上的行为与iPad设备不同.在模拟器上,纹理查找成功(该位置的值为0.5,0.5),我的粒子出现在那里.但是,在iPad本身,纹理查找不断返回0.0,0.0.
我尝试了格式为GL_FLOAT和GL_UNSIGNED_BYTE的纹理.
还有其他人经历过这个吗?GLSL ES规范说,纹理查找可以在顶点和片段着色器中完成,所以我看不出问题是什么.
我正在使用iOS SDK 4.2的最新GM Beta
我正在使用当前上下文的深度缓冲区来影响我正在显示的纹理.纹理是1维的并且是灰度的.从左到右代表从近到远.在一定深度处的像素越多,纹理在该点处越亮,黑色没有像素在该深度处,并且白色是所有像素都在该深度处.
现在我有一个glReadPixels()深度缓冲区的解决方案,在CPU上进行分析,然后将其写回纹理.当然,这是应用程序中的真正瓶颈.
我正在寻找一个全GPU解决方案,在着色器或某些东西中分析深度缓冲区并以这种方式更新纹理.我考虑创建一个片段着色器,它读取深度值并增加到纹理中的相应像素,但这需要片段着色器可以写入其他纹理.我学到的东西是禁忌,特别是如果他们必须写同一个像素.
有没有我缺少的技巧或技术,或者我被迫参与CPU?
我目前正在尝试使用Android的OpenGL ES 2.0进行游戏.我的地图是一个二维网格地图,每个位置都有一个高度值.现在我想在纹理中存储每个坐标的高度,以在顶点着色器中进行高度查找.
这个想法的好处是我可以生成一个通用三角网并将其(带偏移)放在用户当前正在查看的地图位置上.由于偏移,我可以省略每次用户移动其视图位置和我将从纹理读取的高度轮廓时创建新三角网的需要.
现在存在的问题是许多当前的Android设备(甚至是Galaxy S3)不支持顶点着色器中的纹理查找.可悲的是,这完全破坏了我目前的做法.
我的问题:还有其他可能从顶点着色器中的图形卡内存中获取数据吗?如果不直接指定每个顶点的数据,每次用户更改视图位置时,会强制我(据我所知)重新创建高度贴图.(每次用户更改视图位置时创建高度图都会变慢...)
感谢您的帮助+最好的问候,
安德烈亚斯
我正在考虑如何在以下例程中加速位测试:
void histSubtractFromBits(uint64* cursor, uint16* hist){
//traverse each bit of the 256-bit-long bitstring by splitting up into 4 bitsets
std::bitset<64> a(*cursor);
std::bitset<64> b(*(cursor+1));
std::bitset<64> c(*(cursor+2));
std::bitset<64> d(*(cursor+3));
for(int bit = 0; bit < 64; bit++){
hist[bit] -= a.test(bit);
}
for(int bit = 0; bit < 64; bit++){
hist[bit+64] -= b.test(bit);
}
for(int bit = 0; bit < 64; bit++){
hist[bit+128] -= c.test(bit);
}
for(int bit = 0; bit < 64; bit++){
hist[bit+192] -= d.test(bit);
}
}
Run Code Online (Sandbox Code Playgroud)
实际的gcc实现对bit参数进行范围检查,然后使用位掩码对-s进行范围检查.我可以在没有位集和我自己的位移/屏蔽的情况下完成它,但我相当肯定不会产生任何显着的加速(告诉我,如果我错了,为什么).
我对x86-64程序集并不是很熟悉,但我知道有 …