- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在努力将我的代码提升到一个新的水平。遵循 Apple 的一些最佳实践,我正在尝试围绕我的顶点缓冲区对象 (VBO) 实现顶点数组对象。我这样设置我的 VBO 和 VAO:
- (void)setupVBOs {
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArrayOES(0);
{
glGenVertexArraysOES(1, &directArrayObject);
glBindVertexArrayOES(directArrayObject);
// GLuint texCoordBuffer;
glGenBuffers(1, &texCoordBuffer);
glBindBuffer(GL_ARRAY_BUFFER, texCoordBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(DirectVertices), DirectVertices, GL_STATIC_DRAW);
glVertexAttribPointer(directPositionSlot, 2, GL_FLOAT, GL_FALSE, sizeof(DirectVertex), (GLvoid*)offsetof(DirectVertex, position));
glEnableVertexAttribArray(directPositionSlot);
glVertexAttribPointer(texCoordSlot, 2, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(DirectVertex), (GLvoid*)offsetof(DirectVertex, texCoord));
glEnableVertexAttribArray(texCoordSlot);
glGenVertexArraysOES(1, &arrayObject);
glBindVertexArrayOES(arrayObject);
// GLuint vertexBuffer;
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
glVertexAttribPointer(positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glEnableVertexAttribArray(positionSlot);
glVertexAttribPointer(colorSlot, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, Color));
glEnableVertexAttribArray(colorSlot);
// GLuint indexBuffer;
glGenBuffers(1, &indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArrayOES(0);
}
我从 http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=287977 中获取的然后像这样使用它:
- (void) render:(CADisplayLink*)displayLink {
glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, backingWidth, backingHeight);
[directProgram use];
glBindVertexArrayOES(directArrayObject);
glDisable(GL_DEPTH_TEST);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, videoFrameTexture);
// // Update uniform values
glUniform1i(videoFrameUniform, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
[program use];
glBindVertexArrayOES(arrayObject);
glDisable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
CC3GLMatrix *projection = [CC3GLMatrix matrix];
float h = 4.0f * self.frame.size.height / self.frame.size.width;
[projection populateFromFrustumLeft:-2 andRight:2 andBottom:-h/2 andTop:h/2 andNear:4 andFar:10];
glUniformMatrix4fv(projectionUniform, 1, 0, projection.glMatrix);
CC3GLMatrix *modelView = [CC3GLMatrix matrix];
[modelView populateFromTranslation:CC3VectorMake(sin(CACurrentMediaTime()), 0, -7)];
currentRotation += displayLink.duration * 90;
[modelView rotateBy:CC3VectorMake(currentRotation, currentRotation, 0)];
glUniformMatrix4fv(modelViewUniform, 1, 0, modelView.glMatrix);
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);
glBindVertexArrayOES(0);
BOOL success = [context presentRenderbuffer:GL_RENDERBUFFER];
if(!success)
NSLog(@"present failed");
}
对 glDrawArrays 的调用有效,它填充了我的纹理,但是,对 glDrawElements 的调用失败并返回 EXC_BAD_ACCESS。我的着色器程序(我使用两个)包装在我从 http://iphonedevelopment.blogspot.com/2010/11/opengl-es-20-for-ios-chapter-4.html 中获取的 GLProgram 对象中
最佳答案
从设置函数的末尾删除 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
。
根据 OES_vertex_array_object
的规范,一个顶点数组对象封装了所有状态除了数组缓冲区绑定(bind)1,所以在你绘制的时候没有元素缓冲区绑定(bind),而你可能想要indexBuffer
进行绑定(bind)。通过在您绑定(bind)远离顶点数组对象时保留 indexBuffer
绑定(bind),您可以确保当您返回到该顶点数组对象时它会被反弹。
1 如果您想知道为什么在顶点数组对象中没有跟踪数组缓冲区绑定(bind),这大概是因为在从中读取顶点数据时没有直接使用当前绑定(bind)的数组缓冲区数组 - 相反,每个顶点属性都有自己的缓冲区绑定(bind),由其各自的 gl*Pointer
函数通过调用函数时查看数组缓冲区绑定(bind)来填充。
关于ios - 在 Open ES iPhone 应用程序中围绕 VBO 使用 VAO 在调用 glDrawElements 时导致 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6240863/
我遇到了一个恐怕很难解决的问题,至少就谷歌搜索而言是这样。 我有一个使用 Qt 的编辑器实用程序,它为编辑器中的不同工具创建多个 OpenGL 上下文,它们是一个“世界”编辑器,它托管我的游戏场景的
我正在再次尝试 OpenGL,我想知道如何设计稍后呈现的类。现在,只有一种类型的形状,所以我创建了一个 Shape 类,它有一个静态 VAO 成员,当第一个时调用 glGenVertexArrays(
环境:OpenGL 3.3+、C 编程、Windows。 我有一个函数,可以从模型加载所有顶点数据,但只返回 VAO id 和顶点数。在此过程中,它生成 VBO id,并将顶点数组数据传递到缓冲区..
假设我有 2 个不同的对象,每个对象都有自己的 VAO 和绘制调用。像这样的事情: void Object::Draw() { glBindVertexArray(vao); glDr
1 VAO 是 OpenGL 技术中提出来的 参考: 外链 其中有一段文字记录了 VAO 是什么: A Vertex Array Object (VAO) is an object which con
我最近使用顶点数组对象 (VAO) 编写了一些 OpenGL 3.3 代码,后来在英特尔图形适配器上对其进行了测试,令我失望的是,元素数组缓冲区绑定(bind)显然不是 VAO 状态的一部分,因为调用
我正在使用 OpenGL 编写一个小图形引擎(通过 OpenTK 和 C#)。 为了定义顶点属性,我有一个 VertexDeclaration 类,其中包含一组 VertexElement 结构,这些
我面临一个问题,我认为该问题与 VAO 相关,但我不确定.. 我不确定 VAO 的正确用法,我在 GL 初始化期间所做的很简单 glGenVertexArrays(1,&vao) 后跟 glBindV
假设我们将两个程序上的顶点属性位置绑定(bind)到相同的值。使用相同的顶点数组对象来使用这两个程序进行绘制是否正确? 最佳答案 定义“正确”。 如果两个程序对象使用兼容的属性位置,则它们使用相同的属
我一直在阅读一些有关 VAO 如何与 VBO 配合使用的内容。据我了解,当我们调用 glVertexAttribPointer 时,VAO 仅存储有关 VBO 的状态信息。我的问题是,它何时存储有关
我做了一个加载器类来加载 V.A.Os 纹理等但是当我使用这个方法时 GLuint Loader::loadToVAO(GLfloat* vertices) { GLuint VertexAr
据我所知,顶点获取阶段由 VAO 封装,并且 VAO 需要包含顶点获取阶段状态,以便在缓冲区对象和顶点属性之间进行管道传输以及格式化缓冲区对象中的数据。 我一直在阅读的关于这个主题的两本书,红皮书,蓝
我最近开始学习 OpenGL,我一直在尝试编写一个程序,使用带有着色器的 VAO 和 VBO 在屏幕上显示钻石。我的代码主要基于本教程: https://www.opengl.org/wiki/Tut
我刚刚开始使用 OpenGL,并且我正在尝试仅使用 3.x 及更高版本的功能。我不明白的一件事是 VAO。 我知道 VAO 封装了渲染状态,所以我可以在渲染循环之前调用所有设置函数,然后绑定(bind
VAO 是顶点数组对象,VBO 是顶点缓冲区对象。创建和绑定(bind)/解除绑定(bind) VAO 和 VBO 的调用具有如下一般格式: GLuint VAO, VBO; glGenVertexA
我希望在 Cocoa 上制作一个自定义的 NSOpenGL View 。但是,我在使用 VAO 时遇到了问题。特别是,运行时,这个虚拟测试 View : /// OpenGLTestView.h: @
我和我的 friend 正在开发一个使用 C++ 和 OpenGL 的项目。我们为“ModelObject”创建了一个C++类,每个ModelObject都有一个GLuint vao作为成员变量。然后
我很难理解 VAO 到底是如何处理缓冲区映射的。我正在做的事情可以用这个伪代码来描述: SetUp: BindVAO BindArrayBuffer glBufferData(GL_ARR
我想知道如果我想画画最好做什么超过约 6000 个不同的 VAO 使用相同的着色器。 目前,我绑定(bind)我的着色器,然后为其提供所需的所有信息(统一),然后循环遍历每个 VAO 来绑定(bind
目前我有一个包含 2 个缓冲区的系统,一个创建 CPU 端并设置为一个缓冲区。然后一个来自 ssbo 并从另一个着色器填充。 这是 ssbo 数据的结构: struct ssbo_data_t {
我是一名优秀的程序员,十分优秀!