Articles of vbo

我应该使用多less个维也纳组织成员,并保存一份他们的数据?

首先,如果我的问题是广泛的,我很抱歉。 我正在开发一个基于瓦片的游戏,并从这些gl.Begin调用切换到使用VBOs。 这是一种准备工作,我设法呈现一个简单的着色器应用六角形多边形。 我不确定的是,如何实施“整体”瓦概念。 具体的问题是: 为单个瓦片创建1个VBO并在每个不同的位置渲染n次,或者渲染一个代表整个“世界”的巨大VBO, 根据上面的答案,绘制“线网格”的最佳方法是什么? 使用尊重polygon.mode相同的vbo覆盖,或者有一种方法让着色器到这个? 那么如何进行截锥体筛选或鼠标挑选呢?我需要将VBO数据保存在内存中吗?

我不明白为什么我的一个vbo被另一个覆盖

创建一个vbo我使用这个函数: public void loadVBO(){ vboID = GL15.glGenBuffers(); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buf, GL15.GL_STATIC_DRAW); // Put the position coordinates in attribute list 0 GL20.glVertexAttribPointer(0, 4, GL11.GL_FLOAT, false,4*4+4*4+4*4+2*4 , 0); // Put the color components in attribute list 1 GL20.glVertexAttribPointer(1, 4, GL11.GL_FLOAT, false,4*4+4*4+4*4+2*4 , 4*4); GL20.glVertexAttribPointer(2, 4, GL11.GL_FLOAT, false,4*4+4*4+4*4+2*4 , 4*4+4*4); // Put the texture coordinates in attribute […]

在Android中使用VBO与OpenGL ES性能不佳

我正在制作一个Android应用程序,我需要使用OpenGL ES绘制一些多边形。 我能够渲染他们,但我对performance感到失望。 我更新了代码使用VBO,但我没有注意到任何改进。 我想渲染每秒60帧 (每帧16毫秒 )。 我有一个testing项目,我在屏幕上呈现几个三角形。 当我渲染1000个三角形时,每帧需要大约20毫秒 (取决于设备)。 我想保持10毫秒以下的渲染,因为我需要其余的( 6毫秒 )来执行其他计算(例如更新位置,检测碰撞等)。 这里是我渲染三角形的代码: public void render(int positionLocation, int colorLocation) { GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, this.bufferIndex); GLES20.glVertexAttribPointer(positionLocation, Polygon.POSITION_COMPONENT_COUNT, GLES20.GL_FLOAT, false, Polygon.STRIDE, 0); GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); GLES20.glUniform4f(colorLocation, this.red, this.green, this.blue, this.alpha); GLES20.glDrawArrays(this.mode, 0, this.length); } https://github.com/mauriciotogneri/test/blob/master/src/com/testopengl/Polygon.java#L51-66 以下是遍历三角形的代码: private void renderTriangles() { long start = System.nanoTime(); for (int i = 0; […]

在LWJGL VBO的纹理问题

我在VBO地形渲染器上工作。 现在我有两个烦恼: 虽然尝试呈现100×100地形,我有一个50×200的地形 纹理不是渲染。 我花了很多时间,我真的没有想法… 我怎样才能解决这个问题? 图片: http://img.ufgame.com/java/GiNFKOT.png 我的部分代码: public class NGINE2 { public static int MAX_PICKING_DISTANCE = 20; public static int RAY_RADIUS = 5; static int w = 640; static int h = 480; static float oldX = 0; static float oldY = 0; static float oldZ = 0; static FloatBuffer cBuffer; static FloatBuffer […]

使用lwjgl VBO – 缓冲区

有什么更好的使用java的lwjgl – 创建和绑定一个缓冲区到VBO和存储在这个缓冲区的全部世界,如果需要更新或为每个世界块创建分离的缓冲区,或为每个对象创建分离的vbo。 那么是什么,为什么更好;) 世界是相当大= 500 * 500 * 2三角形+对象 – 树,草…我必须从其他线程更新部分od缓冲区的每一帧。 对不起我的英语不好 :)

OpenGL交错位置和正常数据

我有一个OpenGL的问题! 说我有数据,以格式交错 [vec3 normal, vec3 vert1, vec3 vert2, vec3 vert3] 全部存储在一个VBO中(每个三角形一组)。 我的顶点着色器将具有以下属性: in vec3 normal; in vec3 position; 这样可以提取数据吗? 或者我需要复制每个顶点的法线(例如[vec3 normal, vec3 vert1, vec3 normal, vec3 vert2, vec3 normal, vec3 vert3] )?

不用VBOs渲染的纹理

自从我开始学习OpenGL之后,我的程序使用了显示列表后,最终决定在开始新游戏的工作之后,经历了相当长时间的滞后之后,切换到了VBO。 我已经完成了我的转换,但是我仍然在将纹理渲染到屏幕时遇到了一些麻烦。 我的工作方式是这样的:我有几个同样尺寸的游戏中的每个types的“块”(这是一个Terraria端口),通过一种方便的方法加载到游戏中,然后他们所有加载,他们通过Graphics2D编译成虚拟纹理地图集,转换为光滑的纹理,他们的相对坐标保存到一个HashMap。 但是,当需要从HashMap中抓取纹理并渲染它们时,游戏根本就没有。 这里是我的代码中添加一个块到VBO的一部分(这是每块执行4次,每个角落一次): // top left // vertex values.add(Float.valueOf((float)b.getLocation().getPixelX())); values.add(Float.valueOf((float)b.getLocation().getPixelY())); // light values.add(Float.valueOf((float)b.getLightLevel() / 15)); values.add(Float.valueOf((float)b.getLightLevel() / 15)); values.add(Float.valueOf((float)b.getLightLevel() / 15)); // texture values.add(tX); values.add(tY); (注意: values是一个稍后转换为数组的列表)。然后是我的代码来渲染VBO: public static void render(){ glPushMatrix(); glTranslatef(MineFlat.xOffset, MineFlat.yOffset, 0); glBindTexture(GL_TEXTURE_2D, BlockUtil.atlas.getTextureID()); glVertexPointer(2, GL_FLOAT, 28, 0); glColorPointer(3, GL_FLOAT, 28, 8); glTexCoordPointer(2, GL_FLOAT, 28, 20); glDrawArrays(GL_QUADS, 0, vertexArray.length / […]

OpenGLES 2.0批处理方法并不会绘制不活动的对象

我正在研究一个大的VBO的“配料”对象,并减less平局。 这些是我现在正在做的事情: 根据纹理或渲染状态创建交错VBO(如混合) 因此,例如,如果我只想要一些对象进行混合,将会有两个单独的VBO并绘制调用 为了更多的批处理,添加未使用的顶点数据。 例如)对象“A”不需要有颜色数据,但我添加了白色的空白颜色,所以可以批量交错排列 要隐藏对象,请将顶点位置设置为0.0。 所以,留在arrays上,但看不到。 例如)如果是四元组,则设置为[0.0,0.0,0.0,0.0] 这些是我的问题: 我应该创建一个巨人VBO,并使用基于抵消的绘制调用? 如果我这样做,那么glbufferData是否有任何限制? (或者性能下降,如果数据太多的话) 有没有什么方法可以包含不同types的交错顶点? 多个“偏移”绘制调用不会影响性能,不像单个绘制调用? 我应该绑定多个纹理图集到每个单位,并使用制服? 目前,我只能绑定一个纹理。 上面#3方法有没有正确的方法? (感觉不正确) 我每帧更新“所有”顶点,即使某些对象不需要更新。 (glBufferData)我应该做多个更新调用? 对不起,我的措辞,但请指出我什么,我做错了什么。 谢谢。

与VBOs优化

我目前正在研究一个多维数据集引擎,并遇到一些CPU优化问题。 我将所有的四维VBO数据存储在一个Block(在一个块的x,y,z)类中,它存储在长度为6(最大的立方体面数)的数组中。 我宁愿把它合并到一个VBO中。 我遇到的唯一问题是,我找不到在每张脸上都呈现6种不同纹理的方法。 GL11.glPushMatrix(); GL11.glTranslatef(LENGTH.x * origin.x, LENGTH.y * origin.y, LENGTH.z * origin.z); for (int z = 0; z < LENGTH.z; z++) { for (int y = 0; y < LENGTH.y; y++) { for (int x = 0; x < LENGTH.x; x++) { Block b = get(x, y, z); if (b.getBlockType().isTransparent() || b.getVisibleFaces() == […]

为什么我使用这样的VBO看到不良的渲染结果?

我正在尝试编写一个使用VBO(顶点缓冲对象)呈现的程序。 除了当我运行程序的时候,一切都很好,看起来像对象正在散发出来。 我想这是因为我试图删除缓冲区,但是无论我做了什么,我都无法解决问题。 有人能告诉我我在做什么错了代码? 欣赏它。 GLuint VBOvertex; GLuint VBOTexCoord; GLuint VBONormal; //////////////////////////VERTEX BUFFER glGenBuffers(1, &VBOvertex); glBindBuffer(GL_ARRAY_BUFFER,VBOvertex); glBufferData(GL_ARRAY_BUFFER,sizeof(m->verticies)*3,m->verticies,GL_STATIC_DRAW); ///////////////////////////TextCoord BUFFER glGenBuffers(1, &VBOTexCoord); glBindBuffer(GL_ARRAY_BUFFER,VBOTexCoord); glBufferData(GL_ARRAY_BUFFER,sizeof(m->TextCoord)*2,m->TextCoord,GL_STATIC_DRAW); //////////////////////////////NORMAL BUFFER glGenBuffers(1, &VBONormal); glBindBuffer(GL_ARRAY_BUFFER,VBONormal); glBufferData(GL_ARRAY_BUFFER,sizeof(m->Normal)*3,m->Normal,GL_STATIC_DRAW); delete[]m->verticies; m->verticies=NULL; delete[]m->TextCoord; m->TextCoord=NULL; delete[]m->Normal; m->Normal=NULL; glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glBindBuffer(GL_ARRAY_BUFFER,VBOvertex); glVertexPointer(3,GL_FLOAT,0,0); glBindBuffer(GL_ARRAY_BUFFER, VBOTexCoord); glTexCoordPointer(2,GL_FLOAT,0,0); glBindBuffer(GL_ARRAY_BUFFER, VBONormal); glNormalPointer(GL_FLOAT,0,0); glDrawArrays(GL_TRIANGLES, 0,m->nbrTris*3); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_NORMAL_ARRAY);