- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对多个对象(大约 200 个对象,其中 15 个对象一次可见,每个对象都有自己的顶点和索引缓冲区)使用 VAO(顶点数组对象)感到有些困惑。下面是我的渲染函数
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
glClearColor(0.50f, 0.50f, 0.50f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[super drawLines];
for(int i=0; i< self.numberofBars; i++) //numberofBars
{
// Render the object
[self.barShaderProg use];
iVBarNode *temp = [theBars objectAtIndex:i];
_modelViewProjectionMatrix = GLKMatrix4Multiply(ProjectionView, modelMatrix);
_modelViewProjectionMatrix = GLKMatrix4Multiply(_modelViewProjectionMatrix, temp.modelMatrix);
GLKMatrix4 modeltotalMatrix = GLKMatrix4Multiply(modelMatrix, temp.modelMatrix);
GLKMatrix4 modelViewMatrix = GLKMatrix4Multiply(ViewMatrix, modeltotalMatrix);
_normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0,_normalMatrix.m);//
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEW_MATRIX], 1, 0, modelViewMatrix.m);
glUniform4f(uniforms[COLOR_VECTOR], temp.barColor.r, temp.barColor.g, temp.barColor.b, temp.barColor.a);
//bind corresponding buffer before drawing
glBindBuffer(GL_ARRAY_BUFFER, [temp getVertexID]);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), BUFFER_OFFSET(12));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, [temp getIndexID]);
glDrawElements(GL_TRIANGLES, [temp.bar getIndicesSize], GL_UNSIGNED_SHORT, (void*)0);
}
if(self.translation>0)
{
self.paused = NO;
}
else{
self.paused = YES;
}
}
这工作得很好。在 OpenGLES 分析器中分析我的代码后,它显示使用 VAO 从中受益,因为 glVertexAttribPointer 调用是冗余的(对所有人都一样)。但我只是不知道是否可以将它们与不同的顶点缓冲区对象一起使用。我在互联网上找到的大多数示例仅将它们与一个 VBO 或两个 VBO 一起使用,其中第二个 VBO 定义了不同的属性,而不是我的情况下的相同属性。我尝试绑定(bind)为我的对象生成的每个顶点缓冲区索引使用单个 VAO 但它没有像下面那样工作
-(void) configureVertexArrayObject
{
// Create and bind the vertex array object.
glGenVertexArraysOES(1,&vertexArrayObject);
glBindVertexArrayOES(vertexArrayObject);
for(int i=0;i<self.numberofBars;i++)
{
iVBarNode *myNode = [theBars objectAtIndex:i];
glBindBuffer(GL_ARRAY_BUFFER, [myNode getVertexID]);
// Configure the attributes in the VAO
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), BUFFER_OFFSET(12));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, [myNode getIndexID]);
}
// Bind back to the default state.
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArrayOES(0);
我是这样渲染的
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
glClearColor(0.50f, 0.50f, 0.50f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[super drawLines];
glBindVertexArrayOES(vertexArrayObject);
for(int i=0; i< self.numberofBars; i++) //numberofBars
{
// Render the object
[self.barShaderProg use];
iVBarNode *temp = [theBars objectAtIndex:i];
_modelViewProjectionMatrix = GLKMatrix4Multiply(ProjectionView, modelMatrix);
_modelViewProjectionMatrix = GLKMatrix4Multiply(_modelViewProjectionMatrix, temp.modelMatrix);
GLKMatrix4 modeltotalMatrix = GLKMatrix4Multiply(modelMatrix, temp.modelMatrix);
GLKMatrix4 modelViewMatrix = GLKMatrix4Multiply(ViewMatrix, modeltotalMatrix);
_normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0,_normalMatrix.m);//
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEW_MATRIX], 1, 0, modelViewMatrix.m);
glUniform4f(uniforms[COLOR_VECTOR], temp.barColor.r, temp.barColor.g, temp.barColor.b, temp.barColor.a);
//all buffer associated with VAO now
glDrawElements(GL_TRIANGLES, [temp.bar getIndicesSize], GL_UNSIGNED_SHORT, (void*)0);
}
glBindVertexArrayOES(0);
if(self.translation>0)
{
self.paused = NO;
}
else{
self.paused = YES;
}
}
在我的第二次尝试中,我尝试只指定 VAO 的布局,对顶点和法线使用 glVertexAttribPointer()(而不指定 VBO 和 IBO id),并像我在没有 VAO 的情况下所做的那样渲染(上面的第一个渲染代码), 但现在我没有指定顶点布局使用glVertexAttribPointer() 正如我已经向 VAO 提到的那样(实际上这是使用 VAO 的全部意义)。 这两种方法都给了我相同大小的对象,这让我觉得 VAO 以某种方式为我的所有对象复制了几何体。我的所有对象都具有相同的几何形状但高度不同。现在我有一个选择是拥有一个顶点和索引缓冲区对象,我可以沿着高度缩放并根据我的需要定位对象。我仍然想知道 VAO 实际持有什么,不持有什么,以及是否有办法让它发挥作用。
最佳答案
After analysing my code in the OpenGLES Analyser it showed to use VAO to benefit from them as the glVertexAttribPointer calls were reduntant (same for all).
除非您的 glBindBuffer
调用每次都绑定(bind)相同的缓冲区,否则我觉得这个推理很可疑。
通过将所有对象打包到相同 缓冲区中,您可以从中获得更多 yield ,从而在绘制时执行一次 bind+glVertexAttribPointer 调用。由于所有对象都具有相同的顶点格式,因此似乎没有理由不能这样做。您必须调整顶点索引以在现在更大的缓冲区中选择正确的位置,但这并不难。
关于ios - 在 iOS 上使用具有多个 VBO 和 IBO(多个对象)OpenGLES 2 的 VAO 进行绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388723/
我学习 SDL 二维编程已有一段时间了,现在我想创建一个结合使用 SDL 和 OpenGL 的程序。我是这样设置的: SDL_Init(SDL_INIT_VIDEO); window = SDL_Cr
尝试查找可在地块中使用的不同类型项目的列表 来自不同样本的投影类型: projection = list(type = "equirectangular") projection = list(typ
我正在尝试使用 Java Graphics API 绘制 GIF,但无法使用下面的代码成功绘制 GIF。仅绘制 GIF 的第一张图像或缩略图,但不播放。 public void paintCompon
我目前正在使用 JFrame 并尝试绘制一个矩形,但我不知道如何执行代码 paint(Graphics g),如何获取 Graphics 对象? package com.raggaer.frame;
这个领域的新手,希望得到一些帮助。 我有一个"Missile.java" 类,我在那里画东西。我想绘制一个 ImageView,我正在使用以下代码: ImageView v = (ImageView)
下面列出了圆形的例子 这是我的 JavaScript 代码。 最佳答案 假设您的 randomColor 是正确的,您只需要: 从 canvas.onclick 中移除 context.clearR
我在绘制和缩放 ImageView 时遇到问题。请帮帮我.. 当我画一些东西然后拖动或缩放图像时 - 绘图保留在原处,如您在屏幕截图中所见。而且我只需要简单地在图片上绘图,并且可以缩放和拖动这张图片。
我们可以在形式之外绘制图像和文本...我的意思是在字面上... 我知道问这个问题很愚蠢但是我们能不能... 最佳答案 您可以通过创建表单并将其 TransparentColor 属性设置为背景色来“作
我在绘制/布局期间收到 3 个对象分配警告 super.onDraw(canvas); canvas.drawColor(Color.WHITE); Paint textPaint = new Pai
我有一个示例时间序列数据框: df = pd.DataFrame({'year':'1990','1991','1992','1993','1994','1995','1996',
我试图想出一种简洁的方法来绘制 R 数据框中所有列的 GridView 。问题是我的数据框中既有离散值又有数值。为简单起见,我们可以使用 R 提供的名为 iris 的示例数据集。我会使用 par(mf
我有一个由 10 列和 50 行组成的 data.frame。我使用 apply 函数逐列计算密度函数。现在我想绘制我一次计算的密度。 换句话说,而不是绘图... plot(den[[1]]) plo
我想知道我们如何才能在第一个和第二个组件之外绘制个人,如下所示: 最佳答案 这可能有效: pc.cr <- princomp(USArrests, cor = TRUE) pairs(pc.cr$lo
我是Pandas和matplotlib的新手,想绘制此DataFrame season won team matches pct_won 0 20
我正在尝试为 distplot 子图编写一个 for 循环。 我有一个包含许多不同长度列的数据框。 (不包括 NaN 值) fig = make_subplots( rows=len(asse
我想创建一个具有密度的 3d 图。 我使用函数 density 首先为特定的 x 值创建一个二维图,然后该函数创建密度并将它们放入 y 变量中。现在我有第二组 x 值并将其再次放入密度函数中,然后我得
全部, 我一直在研究全局所有 MTB 步道的索引。我是 Python 人,所以对于所有涉及的步骤,我都尝试使用 Python 模块。 我能够像这样从 OSM 立交桥 API 中获取关系: from O
我正在使用 e1071 包中的支持向量机对我的数据进行分类,并希望可视化机器实际如何进行分类。但是,在使用 plot.svm 函数时,出现无法解决的错误。 脚本: library("e1071") d
我制作了以下图表,它是使用 xts 对象创建的。 我使用的代码很简单 plot(graphTS1$CCLL, type = "l", las = 2, ylab = "(c)\nCC for I
在绘制状态图时,您如何知道哪些状态放在框中,哪些状态用于转换箭头?我注意到转换也是状态。 我正在查看 this page 上的图 1 : 最佳答案 转换不是状态。转换是将对象从一种状态移动到下一种状态
我是一名优秀的程序员,十分优秀!