- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:Apple 的工作编码示例在此链接中找到: http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html
为 200 x 200 正方形的固定网格创建顶点后,我通过使用 VBO 将顶点发送到 GPU 来渲染它。那么我怎样才能更新顶点的颜色呢?数百个顶点的颜色会频繁变化 - 每隔几帧。
我之前没有使用 VBO 解决过这个问题。我创建了顶点和颜色数组,并使用以下代码来渲染顶点。我通过更新数组 triangleColours
更改了顶点的颜色:
-(void)render {
glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a);
glClear(GL_COLOR_BUFFER_BIT);
[effect prepareToDraw];
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 2,
GL_FLOAT, GL_FALSE, 0, triangleVertices);
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 4,
GL_FLOAT, GL_FALSE, 0, triangleColours);
glDrawArrays(GL_TRIANGLES, 0, numTriangleVertices);
glDisableVertexAttribArray(GLKVertexAttribPosition);
glDisableVertexAttribArray(GLKVertexAttribColor);
}
虽然上面的代码有效,但它消耗了大量电池,所以现在我尝试使用 VBO 来实现。顶点不会改变位置,所以我知道 VBO 是一个不错的选择,但是改变顶点的颜色怎么样?
这是我当前的代码,简化为仅绘制一个正方形:
编辑:我将如何更新下面的代码,以便它在顶点颜色发生变化时仅上传它们? VBO设置代码和绘制代码应该如何更改?更新我的 verticesColours 颜色数组然后调用 glBufferSubData() 怎么样?
// Setup vertices and VBO
// Vertices for a single square
const Vertex Vertices[] = {
// position and colour
{{-20, -20}, {1, 1, 1, 1}},
{{-20, -20}, {1, 1, 1, 1}},
{{-20, -20}, {1, 1, 1, 1}},
{{-20, -20}, {1, 1, 1, 1}},
};
const GLubyte Indices[] = {
0, 1, 2,
2, 3, 0,
};
numIndices = sizeof(Indices)/sizeof(Indices[0]);
[EAGLContext setCurrentContext:self.context];
glEnable(GL_CULL_FACE);
self.effect = [[GLKBaseEffect alloc] init];
self.effect.transform.projectionMatrix = GLKMatrix4MakeOrtho(-50.0, 50.0,
-50.0, 50.0,
0.0, 1.0);
glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
glGenBuffers(1, &_indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position));
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Color));
glBindVertexArrayOES(0);
// Render
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
[self.effect prepareToDraw];
glBindVertexArrayOES(_vertexArray);
glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_BYTE, 0);
}
最佳答案
视情况而定。 (很棒的词,不是吗?适用于所有情况。)
如果您确实需要以不可预测的方式改变每个顶点的颜色,每次绘制它们时,那么您将需要上传每帧的顶点颜色。将顶点位置放在自己的(静态)VBO 中是一个不错的选择,因为这样您就可以重复使用,而无需每次都上传(系统内存 <-> GPU 内存带宽始终是宝贵的商品),但是任何东西都会有改变,好吧,必须改变。
如果您可以通过编程方式计算每个顶点的颜色,那么 vertex shaders 就是这样的。派上用场。 (确实,它们是为了什么而设计的!)希望每个顶点的颜色都是以下组合的函数:
然后,您可以编写一个顶点着色器来计算这些输入的颜色,并且每一帧您只需重新指定着色器制服 - 通常总共大约有十几个 float 。
所以这取决于您希望颜色如何变化。如果您可以使用顶点着色器,那么您确实可以跳过每次绘制的上传。如果您做不到,并且/或突变太复杂或任意,无法在顶点着色器中完成,那么您只需在 CPU 端执行该操作,然后咬紧牙关上传即可。
关于iphone - 使用 VBO 上传后更改顶点的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14574660/
目前,在我的渲染引擎中,每个网格数据都有一个 VBO(1 个 VBO 用于顶点,1 个 VBO 用于法线,1 个 VBO 用于纹理坐标,1 个 VBO 用于切线,1 个 VBO 用于副切线)并且它们都
我有一个代码,最初有一个着色器 (ourShader)、一个 VAO 和一个 VBO。它将使用 Stencil 测试渲染带有纹理立方体的场景及其在地面上的反射。现在,我想为后处理添加一个帧缓冲区,所以
因此,我使用两个 VBO 成功绘制了一系列线条,一个用于顶点,一个用于索引。 Python 列表是: vertices = [ [0,1],[0,2],[0,3], # Axe
因此,我需要使用一次绘制调用来渲染多个对象(而非实例)的方法。实际上我知道如何做到这一点,只是将数据放入单个 vbo/ibo 并使用 glDrawElements 进行渲染。 问题是:使用 glUni
大家好。我正在尝试呈现如下所示的两种方法。 RenderA() 使用的是 VBO 而 RenderB() 不是。当它到达 RenderB() 中的 glDrawArrays() 时,我收到一个 EXC
我正在尝试制作一个类似于《我的世界》的 opengl 体素引擎。 我创建了一个 block 类,我想将整个 block 的所有顶点放入单个 VBO 中。我之前只是将每个 block 放入 vbo 中并
我最近将当前项目中的绘图从内存阵列的标准绘图更改为 VBO。令我惊讶的是,帧速率从 60fps 显着下降到 30fps,绘制了 1200verts 的模型 8 次。进一步的分析表明,与从内存中绘制相比
所以我了解如何使用顶点缓冲区对象,并且它比立即模式绘图提供了很大的性能提升。我将绘制很多 2D 四边形( Sprite ),我想知道我是否应该为每个四边形创建一个 VBO,或者创建一个 VBO 来保存
我正在编写一个在 OpenGL 中渲染一些网格的插件。 我在一个 VBO 中有一个 Vertices 数组,在另一个 VBO 中有一个 Indices 数组。我现在想存储法线。由于多个面之间共享的顶点
你能渲染一个由四边形组成的 VBO,每个四边形都具有不同的纹理吗?现在,我读到了有关按纹理或纹理图集排序的内容,但这仍然不能回答我的问题。我正在开发一款 2d 游戏。现在我的动画 Sprite 将拥有
我有一个 2D VBO 对象,它表示 2D 空间中的点。此时绘制任意形状的最佳方法是什么?假设我想在每个位置画一个红色的“X”。 我可以使用着色器来做到这一点吗? 最佳答案 您不一定需要特殊的着色器,
如果我有一个顶点不断变化的模型,因此我需要在每一帧上重新绑定(bind) VBO 上的所有信息,使用即时模式是否会提高性能?或者,所有数据同时传递到 GFX 卡的事实仍然是 VBO 的救赎因素吗? 根
我想在交错的 OpenGL vbo 中存储三个浮点值和两个字节值。不幸的是,渲染的数据显然不正确。当我使用两个不同的 VBO 渲染相同的数据时,一切都工作正常,因此我不认为我的着色器存在问题。 /*
此代码工作正常,呈现正确(没有发布所有相关代码,因为我认为这些部分有问题): std::vector vboId; std::vector > verts; ...初始化: verts[num].pu
现在我正在使用索引,所以我在让我的 VBO 正确渲染法线时遇到了一些麻烦。我很确定我对普通指针的偏移有问题,但数学似乎加起来对我来说是正确的。 我如何存储数据: struct MyVertex {
我正在尝试使用 OpenGL 中的顶点缓冲区对象绘制两个四边形。他们应该用不同的颜色绘制。如您所见,第一个四边形具有红色、绿色、蓝色和黄色顶点。第二个四边形有不同的颜色,但问题是第二个四边形被完全绘制
我正在尝试在我的原生黑莓 10 应用程序中使用 VBO 绘制一个正方形。我的实现是, glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
在我的项目中,我想使用 vbo 显示许多对象(球体)。我设法毫无问题地显示 1 个对象,但是当涉及到 2 个或更多对象时,所有对象 (vbos) 都被最后定义的对象 (vbo) 替换。 CosmicB
我已经学习 VBO 几个星期了,有人告诉我 here VBO 可以渲染“约 100 万个顶点,每秒数百帧”。然而,我当前的 VBO 测试程序只能获得大约 50 FPS 的渲染速度和 100 万个顶点。
我正在使用 Haskell 制作一个渲染引擎,并且正在优化我的代码以使用 VBO。我想稍微抽象一下几何类型,因为有相当数量,并且想把它放在一个函数和一些参数中。 例如,如果我有一组几何体,它是一对顶点
我是一名优秀的程序员,十分优秀!