在我不断尝试从ES 1.x转换为OpenGL ES 2.0时,我正在转换一些代码以使用Vertex Buffer Objects('VBOs')而不是现有的无缓冲glDrawArrays调用.
我已经建立了VBO并使它们正常工作,但是已经遇到了设计难题,并且会对那些对OpenGL ES 2.0更有经验的人的建议表示感谢.
我想绘制一堆经常移动的多边形精灵.这是因为如果你熟悉Box2D,它们就是动态的Box2D机构.这些多边形体都是使用GL_TRIANGLE_FAN生成的,这有点关键,因为GL_POLYGON在ES 2.0上不可用.
多边形具有其他属性,例如颜色,可以在应用程序生命周期的某个阶段更改,但它是保证几乎每帧都会改变的顶点位置.
多边形在游戏中分组,因此我打算管理和绘制每个组而不是每个主体的交错顶点/颜色数组,以尽量减少GPU通信.
这里有很多成功的途径,我一直在阅读OpenGL ES 2.0编程指南,以寻求尽可能多的关于VBO的信息和优化技巧,以及他们所说的内容:
交错数据是有利的,因为"每个顶点的属性数据可以按顺序方式读取".
本书建议"如果需要修改顶点属性数据的子集,则可以...在单独的缓冲区中存储本质上是动态的顶点属性".
建议"尽可能使用GL_HALF_FLOAT_OES",尤其是颜色,因为未经投影的顶点位置可能超出此空间要求.
只有在更新整个缓冲区时才应使用glMapBufferOES,即使在这种情况下,操作"与glBufferData相比仍然可能很昂贵".
这是我的问题:
如果使用GL_TRIANGLE_FAN作为绘图模式,这是否会强制我存储每个体的VBO而不是每个组?或者,为了"结束"风扇和当前体的常见顶点位置,是否会为组VBO中的下一个体绘制新的风扇?
尽管顶点位置以高频率更新,我应该交错我的所有数据,还是应该将所有数据/只是位置分成自己的VBO?
按照上面的书籍建议,大概每次更新渲染时我都应该glBufferData我的顶点位置,而不是使用glMapBufferOES或glBufferSubData更新缓冲位置?
是否有任何未提及的功能/设计选择我应该用于提高多动态多边形背景下的性能?
我是否应该尝试使用GL_HALF_FLOAT_OES进行颜色存储,即在2个浮点数的空间中,我会存储4个半浮点数?如果答案为"是",我是否只使用GLfloat大小为每种颜色一半的GL类型,然后按位OR,然后插入适当的属性数组?
有一次,我已经创建了X许多维也纳组织,都是我需要为每个渲染glBindBuffer,glBufferData和glDrawElements /阵列的唯一呼叫,或者我也必须调用glEnableVertexAttribArray和glVertexAttribPointer每次使用glBufferData时间?
我非常感谢您对此提出进一步的建议,谢谢.
您是否知道在InputStream不关闭相关套接字的情况下中断Java读取的方法?
以下是抓取套接字输入流并转换为可中断DataInputStream的当前构造策略:
InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream()));
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream);
Run Code Online (Sandbox Code Playgroud)
这使用了一个ReadableByteChannel提供read(ByteBuffer)支持ClosedByInterruptExceptionthrowable的方法.
问题是,调用线程使一个中断read()的电话DataInputStream的原因底层套接字被关闭.
对于我的上下文,我需要套接字保持打开状态; 该read调用正在等待未来的用户输入,因此我正在使用中断将控制权传递回更高的组件,然后最终read再次返回.
如果有人能够建议使用JDK内置类来实现这一目标,或者可能指出某些信息无法实现,我将非常感激.
我知道还有其他方法可以达到同样的效果,但我很想知道这种方法是否可行.
我知道Parcelable(快)和Serializable(慢)之间的性能差异.但是,我需要持久存储某些应用程序信息,而不仅仅是在一个生命周期内,因此onSaveInstanceState和使用Parcelable对象的相关方法是不合适的.
所以我把注意力转向了Serializable.主要是我有AbstractList类型存储 - 这很好,因为它们实现Serializable.然而,我存储在其中的许多类型是Parcelable但不是Serializable,例如RectF.
我认为"没问题",因为我可以轻松地生成一个包,Parcelable.writeToParcel(parcel, flags)然后调用marshall()它来创建一个byte[]我可以序列化和反序列化的包.我想我会使用泛型; 创建一个SerializableParcelable<Parcelable> implements Serializable类,为Parcelable我希望序列化的所有类型提供一个适合的解决方案.然后我会将每个RectF存储在这个包装器中ArrayList,然后看看它的Parcelable内容是否可序列化.
但是,API文档规定marshall()不得将其用于持久存储:
public final byte [] marshall()
返回宗地的原始字节.
您在此处检索的数据不得放在任何类型的持久存储中(在本地磁盘上,通过网络等).为此,您应该使用标准序列化或其他类型的通用序列化机制.Parcel编组表示针对本地IPC进行了高度优化,因此不会尝试保持与在不同版本的平台中创建的数据的兼容性.
所以现在我被卡住了.我可以忽略这个警告并遵循我上面概述的路线,或者通过扩展Parcelable我想要序列化和创建定制序列化方法的每个人来避免这个问题,这似乎非常浪费时间和精力.
有没有人知道Parcelable没有使用序列化对象的'正确'快捷方式marshall()?或者,如果不注意指定的警告,我应该继续吗?也许SQLite数据库是可行的方法,但我不确定并希望得到你的建议.
非常感谢.
如果任何人都可以揭示这是怎么回事错在这里光,也许GL命令或其他一些不兼容的指令序列的乱序,我将是你的帮助极大感谢.尽管谷歌在"OpenGL ES 2.0编程指南"中进行了大量研究和研究,但我一直试图让这些代码整天都没有成功.
我正在尝试在iPhone上的OpenGL ES 2.0中使用顶点缓冲区对象和自定义着色器.我试图交错来自以下类型的一系列自定义结构的顶点数据:
typedef struct {
float x, y; // Position.
float radius;
float colR,colG,colB,colA; // Color rgba components.
} VType;
Run Code Online (Sandbox Code Playgroud)
位置,半径和颜色字节分别考虑顶点位置,点大小和颜色.这些的ID是初始化的:
ID_ATT_Pos = 0;
ID_ATT_Radius = 1;
ID_ATT_Color = 2;
// Note: I have also tried values of 1,2,3 but no difference.
Run Code Online (Sandbox Code Playgroud)
这些的步幅在每个glVertexAttribPointer调用中指定.
意图是每个顶点在其x,y位置绘制,具有指定的颜色和半径的点数.与上述每个属性相关联的是顶点着色器属性,它们是"a_position","a_color"和"a_radius".以下是顶点和片段着色器:
VertexShader.txt
attribute vec2 a_position;
attribute vec4 a_color;
attribute float a_radius;
varying vec4 v_color;
void main()
{
gl_Position = vec4(a_position,0.0,1.0);
gl_PointSize = a_radius;
v_color = a_color;
}
Run Code Online (Sandbox Code Playgroud)
FragmentShader.txt
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float; …Run Code Online (Sandbox Code Playgroud) 我一直在转换自己的个人OGLES 2.0框架,以利用新的iOS 5框架添加的功能GLKit.
在取悦结果之后,我现在希望实现这里描述的基于颜色的拾取机制.为此,您必须访问后台缓冲区以检索触摸的像素RGBA值,然后将其用作顶点/基元/显示对象的唯一标识符.当然,这需要对所有顶点/基元/显示对象进行临时唯一着色.
我有两个问题,我非常感谢你们的帮助:
我有权访问
GLKViewController,GLKView,CAEAGLLayer(的GLKView)和EAGLContext.我还可以访问所有与OGLES 2.0缓冲区相关的命令.如何组合这些来识别我在屏幕上点击的EAGLContext中像素的颜色?鉴于我正在使用顶点缓冲对象进行渲染,是否有一种巧妙的方法来覆盖提供给我的顶点着色器的颜色,首先不涉及修改缓冲的顶点(颜色)属性,其次不涉及添加一个IF语句进入顶点着色器?
我认为(2)的答案是"不",但出于性能和非艰苦的代码改造的原因,我认为与更有经验的人核实是明智的.
我们将非常感激地收到任何建议.感谢您的时间
UPDATE
我现在知道如何使用glReadPixels从活动帧缓冲区读取像素数据.所以我想我只需要对后台缓冲区进行特殊的"独特颜色"渲染,短暂切换到它并读取像素,然后切换回来.这将不可避免地产生视觉闪烁,但我想这是最简单的方法; 肯定比CGImageContextRef从屏幕快照创建一个并分析这种方式更快(也更明智).
尽管如此,关于后缓冲器的任何提示都将非常受欢迎.
OpenGL ES 2.0没有ES 1.0所做的GL_POINT_SMOOTH定义.这意味着我用来绘制圆圈的代码不再有效:
glEnable(GL_POINT_SMOOTH);
glPointSize(radius*2);
glDrawArrays(GL_POINTS,0,nPoints);
Run Code Online (Sandbox Code Playgroud)
在ES 2.0中是否存在等价物,也许在顶点着色器中有所改变,或者我必须为每个圆使用多边形?
我在OpenGL ES 2.0中使用顶点缓冲对象(VBO).
我有一组顶点数据,它们永久存储在普通的RAM中.原因是从头开始计算顶点位置是昂贵的,但可以将delta添加到最后位置以便廉价地更新它.
要绘制的实际顶点数随时间快速变化.在一个帧中,我可能有1000个,在下一个2500个.在前面收到的建议之后,我现在指定整数UPPER作为将绘制的顶点数的上限.我malloc我的顶点和索引数据数组只有一次在启动基于此值.
我将GL_STREAM_DRAW使用提示传递给每个glBindBuffer调用,以指示每帧的数据更改.
为了尽可能高效,我创建了以下设置:
// SETUP: Called only once.
glBindBuffer(GL_ARRAY_BUFFER,...);
glBufferData(GL_ARRAY_BUFFER,...); // Pass vertex data for UPPER vertices.
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,...);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,...); // Pass index values 0 - (UPPER-1).
glEnableVertexAttribArray(...); // Setup vertex attributes.
glVertexAttribPointer(...);
glUseProgram(...); // Use program with custom shaders.
glUniformMatrix4fv(...); // Identify shader uniforms.
// UPDATE: Called when vertex data changes (on each frame).
glBindBuffer(GL_ARRAY_BUFFER,...);
glBufferSubData(GL_ARRAY_BUFFER,...); // Update VBO data.
// RENDER: Called on each frame.
glDrawElements(GL_TRIANGLES, numberOfVerticesThisFrame, …Run Code Online (Sandbox Code Playgroud) 在Xcode 4.x中,我已经将我的Run方案编辑为'Enable Guard Malloc',因为我有一个我需要跟踪的非描述性malloc错误.我知道我需要在模拟器中运行才能使用此功能.但是,当我这样做时,应用程序立即冻结,Xcode向我显示一个堆栈跟踪,如下所示:

我已经用Google搜索了解决方案,但到目前为止还没有任何乐趣.据我所知,我应该在我的方案中设置一个环境变量:
DYLD_INSERT_LIBRARIES -> /usr/lib/libgmalloc.dylib
Run Code Online (Sandbox Code Playgroud)
然而,这并没有解决问题.我也试过'lsystem'作为值,但这也没有用.
任何人都可以建议解决这个dylib问题,或者推荐一个替代'Enable Guard Malloc'来识别malloc'd堆区域被超出的位置?
UPDATE
为了澄清,这是我正在处理的错误类型:
malloc: *** error for object 0x2b4b54: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)
我已经尝试设置一个符号断点malloc_error_break,但它仍然在内存问题上"随机"断开,而不是超出分配区域.
我正在努力的C++项目在抛出第一次机会异常时终止.当我第一次尝试访问map<pair<int,int>, int>包含单个键值对的Visual Studio 2008时,会在调试模式下发生这种情况.代码没有任何逻辑错误.
我已经阅读了第一次机会异常,并了解它们可能并不总是有问题.尽管如此,我试图打破所有这些异常,并且正如预期的那样,发现了几个没有引起任何问题.
我正在处理的类非常大,包含许多自定义内存分配.我猜测其中一个导致了这个问题.然而,我花了几个小时试图找到一种方法来识别出错的地方,并且无法这样做.
下面列出了第一次机会异常输出.这不是很有帮助!
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location …Run Code Online (Sandbox Code Playgroud) 在我正在写的一篇论文中,我使用了一个 nxn 矩阵乘以一个维度为 n 的密集向量。在其自然形式下,该矩阵具有 O(n^2) 空间复杂度,并且乘法需要 O(n^2) 时间。
然而,众所周知,该矩阵是对称的,并且沿其对角线具有零值。该矩阵也是高度稀疏的:大多数非对角线项为零。
谁能将我链接到一个算法/论文/数据结构,该结构使用稀疏对称矩阵表示来接近 O(nlogn) 甚至在高稀疏性的情况下 O(n) ?
opengl-es ×3
vbo ×3
android ×1
c++ ×1
colors ×1
dylib ×1
geometry ×1
guard ×1
interrupt ×1
ios ×1
ios5 ×1
java ×1
malloc ×1
marshalling ×1
nio ×1
optimization ×1
parcelable ×1
performance ×1
picking ×1
pixel ×1
serializable ×1
shader ×1
sockets ×1
symmetric ×1
xcode ×1