关于我的OpenGL的问题 - 代码

时间:2012-12-24 15:18:24

标签: iphone objective-c ios buffer opengl-es-2.0

过去几天我一直在深入研究OpenGL ES 2.0,但我仍然得到了错误的结果。我不太明白的一件事是我应该如何正确设置我的缓冲区。

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

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 :(得分:0)

好的,所以我肯定在那里做错了。我重用了一个网站的代码,它基本上将所有Vertex数据存储在一个结构中。但是,我已经更改了代码,因为我将各个属性数组(颜色,纹理坐标)分成了单独的数组。之前,结构是自己缓冲的,因此结构由GPU作为整体处理纹理数组和颜色数组。现在 - 在我的更改之后 - 我需要单独生成和绑定这些缓冲区。

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

我最终做的并没有完全解决我的问题,但是我的设定目标更加接近,到目前为止我对自己的学习曲线感到非常自豪。 这个答案适用于可能面临同样问题的其他人,我希望我不会在这里传播任何错误的信息。请随时编辑/指出任何错误。

答案 1 :(得分:0)

在回答您自己的答案时,您提到的结构中的顶点数据称为数组结构。 Apple建议您使用此layout