2012-12-24 72 views
4

过去几天我已经开始深入OpenGL ES 2.0,但我仍然得到了非常错误的结果。我不明白的一件事是,我应该如何正确设置我的缓冲区。关于我的OpenGL的问题 - 代码

我想创建一个这样的形状:一种帐篷,如果你喜欢,没有左侧和右侧。

3_______________________2 
|\      /| 
| \_ _ _ _ _ _ _ _ _ _/ |   
| /4     5\ | 
|/_____________________\| 
0      1 

因此,让我们开始与我的纹理/指数/顶点数组:

这是我设置:

#define RECT_TOP_R  {1, 1, 0} 
#define RECT_TOP_L  {-1, 1, 0} 
#define RECT_BOTTOM_R {1, -1, 0} 
#define RECT_BOTTOM_L {-1, -1, 0} 
#define BACK_RIGHT  {1, 0, -1.73} 
#define BACK_LEFT  {-1, 0, -1.73} 

const GLKVector3 Vertices[] = { 
    RECT_BOTTOM_L, //0 
    RECT_BOTTOM_R, //1 
    RECT_TOP_R,  //2 
    RECT_TOP_L,  //3 
    BACK_LEFT,  //4 
    BACK_RIGHT  //5 

}; 

const GLKVector4 Color[] = { 
    {1,0,0,1}, 
    {0,1,0,1}, 
    {0,0,1,1}, 
    {0,1,0,1}, 
    {1,0,0,1}, 
    {0,1,0,1}, 
    {0,0,1,1}, 
    {0,1,0,1} 
}; 

const GLubyte Indices[] = { 
    0,1,3, 
    2,4,5, 
    0,1 
}; 

const GLfloat texCoords[] = { 
    0,0, 
    1,0, 
    0,1, 
    1,1, 
    1,1, 
    0,0, 
    0,0, 
    1,0 
}; 

我在这里生成/绑定缓存。

glGenBuffers(1, &vertexArray); 
glBindBuffer(GL_ARRAY_BUFFER, vertexArray); 
glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition,3,GL_FLOAT,GL_FALSE,sizeof(Vertices),0); 
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); 


glGenBuffers(1, &colArray); 
glEnableVertexAttribArray(GLKVertexAttribColor); 
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Color), 0); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Color), Color, GL_STATIC_DRAW); 

glGenBuffers(1, &texArray); 
glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(texCoords),0); 
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW); 

所以我有一个关于缓冲区一个问题:

  • 是什么GL_ARRAY_BUFFER和GL_ELEMENT_ARRAY_BUFFER之间的区别?

这里是gelegate方法,这就是所谓每当重绘:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { 


    self.contentScaleFactor = 2.0; 
    self.opaque = NO; 

    glClearColor(1.0f, 1.0f, 1.0f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    [self.effect prepareToDraw]; 

    glDrawElements(GL_TRIANGLE_STRIP, sizeof(Indices), GL_UNSIGNED_BYTE, 0); 


} 

所以,代码显然不能相应工作。你可以帮我吗 ?我一直试图让它起作用,但我正在失去我的神经。

+2

明白了,忘了绑定缓冲区。 *捂脸* –

回答

0

好吧,所以我在那里肯定做错了事。我从基本上将所有顶点数据存储在一个结构中的网站重用了代码。然而,我已经改变了代码,因为我已经将单独的属性数组(颜色,纹理坐标)分为单独的数组。之前,该结构被自行缓冲,所以该结构由GPU作为整体与纹理数组和颜色数组一起处理。现在 - 在我更改之后 - 我需要单独生成并绑定这些缓冲区。

我可以部分解决的另一个问题是具有索引和纹理映射的问题。我不知道我是否理解了这一点,但是如果我将纹理坐标(x,y)分配给某个索引,然后重新使用该索引 - 目的是在该确切位置有另一个纹理坐标 - 那么显然我不会有理由想知道为什么一切都搞砸了。

我最终做了什么并没有完全解决我的问题,但是我更接近于我设定的目标,就openGL而言,我为我的学习曲线感到非常自豪。 此答案适用于可能面临同样问题的其他人,并且我希望在此不要传播任何错误信息。请随时编辑/指出任何错误。

0

为了回应您自己的回答,您提到的结构中的顶点数据称为数组的结构。苹果推荐你使用这个layout