gpt4 book ai didi

iphone - 关于我的 OpenGL 的问题 - 代码

转载 作者:可可西里 更新时间:2023-11-01 06:16:16 27 4
gpt4 key购买 nike

最近几天我开始深入研究 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
};

我在这里生成/绑定(bind)缓冲区。

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);


}

因此,代码显然无法正常工作。请你帮助我好吗 ?我一直在努力让它发挥作用,但我正在失去勇气。

最佳答案

好的,所以我确实在那里做错了什么。我重用了一个网站的代码,该网站基本上将所有 Vertex 数据存储在一个结构中。然而,我已经更改了代码,因为我已经将各个属性数组(颜色、纹理坐标)分离到各个数组中。之前struct是自己缓冲的,所以struct是和texture数组、color数组一起被GPU作为一个整体来处理的。现在 - 在我的更改之后 - 我需要单独生成和绑定(bind)这些缓冲区。

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

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

关于iphone - 关于我的 OpenGL 的问题 - 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14023017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com