iOS 上的 OpenGL ES 三角形绘制错误
OpenGL ES triangles drawing mistake on iOS
我尝试使用 OpenGL ES 和 iOS 绘制多个三角形。我使用以下结构创建具有浮点值的顶点数组
{x, y, z, r, g, b, a}
对于每个顶点。一个三角形的最终数组是:
{x1, y1, z1, r1, g1, b1, a1, x2, y2, z2, r2, g2, b2, a2, x3, y3, z3,
r3, g3, b3, a3}
这是我的更新方法:
-(void)update {
float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 1.0, 100.0);
self.effect.transform.projectionMatrix = projectionMatrix;
}
并渲染:
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
[self drawShapes]; // here I fill vertices array
glClearColor(0.65f, 0.65f, 0.8f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
int numItems = 3 * trianglesCount;
glBindVertexArrayOES(vao);
[self.effect prepareToDraw];
glUseProgram(shaderProgram);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * itemSize, convertedVerts, GL_DYNAMIC_DRAW);
glVertexAttribPointer(vertexPositionAttribute, 3, GL_FLOAT, false, stride, 0);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(vertexColorAttribute, 4, GL_FLOAT, false, stride, (GLvoid*)(3 * sizeof(float)));
glEnableVertexAttribArray(GLKVertexAttribColor);
glDrawArrays(GL_TRIANGLES, 0, numItems);
}
上下文设置。在这里我绑定我的顶点数组并生成顶点缓冲区:
-(void)setupContext
{
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
if(!self.context) {
NSLog(@"Failed to create OpenGL ES Context");
}
GLKView *view = (GLKView *)self.view;
view.context = self.context;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
[EAGLContext setCurrentContext:self.context];
self.effect = [[GLKBaseEffect alloc] init];
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glGenVertexArraysOES(1, &vao);
glBindVertexArrayOES(vao);
glGenBuffers(1, &vbo);
}
片段和顶点着色器非常简单:
//fragment
varying lowp vec4 vColor;
void main(void) {
gl_FragColor = vColor;
}
//vertex
attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
varying lowp vec4 vColor;
void main(void) {
gl_Position = vec4(aVertexPosition, 1.0);
vColor = aVertexColor;
}
结果。未显示三角形:
错在哪里?我想问题出在投影矩阵上。这里是githublink到Xcode项目。
下载了您的代码并进行了试用。我看到紫色屏幕,没有三角形,所以我猜这就是问题所在。我发现有两件事可能是问题所在:
1) 您需要将要发送的总字节数传递给 glBufferData,如下所示:glBufferData(GL_ARRAY_BUFFER, sizeof(float) * itemSize * numItems, convertedVerts, GL_DYNAMIC_DRAW);
。任何与如何分块数据相关的数据都保留在 glVertexAttribPointer 中。
2) 这似乎不是唯一的问题,因为我仍然无法显示三角形。我以前从未使用过 GLKit(我只是对桌面平台上的 OpenGL 有一点经验)。也就是说,如果我分别用 0 和 1 替换 GLKVertexAttributePosition 和 GLKVertexAttribColor。并应用 1 中的 glBufferData 修复程序,当我移动鼠标时,我看到模拟器屏幕上闪烁着伪影。所以这些枚举值和 glVertexAttribPointer 肯定有问题。
编辑 - 对 2 的说明:
按照 1 中所述更改 glBufferData 行后。我还修改了 glEnableVertexAttribArray 行,因此看起来像这样:
glVertexAttribPointer(vertexPositionAttribute, 3, GL_FLOAT, false, stride, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(vertexColorAttribute, 4, GL_FLOAT, false, stride, (GLvoid*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
完成这两项更改后,我可以看到屏幕上闪烁着红色三角形。靠近一步,因为我之前什么都看不见。但我还没能弄明白:(
我尝试使用 OpenGL ES 和 iOS 绘制多个三角形。我使用以下结构创建具有浮点值的顶点数组
{x, y, z, r, g, b, a}
对于每个顶点。一个三角形的最终数组是:
{x1, y1, z1, r1, g1, b1, a1, x2, y2, z2, r2, g2, b2, a2, x3, y3, z3, r3, g3, b3, a3}
这是我的更新方法:
-(void)update {
float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 1.0, 100.0);
self.effect.transform.projectionMatrix = projectionMatrix;
}
并渲染:
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
[self drawShapes]; // here I fill vertices array
glClearColor(0.65f, 0.65f, 0.8f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
int numItems = 3 * trianglesCount;
glBindVertexArrayOES(vao);
[self.effect prepareToDraw];
glUseProgram(shaderProgram);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * itemSize, convertedVerts, GL_DYNAMIC_DRAW);
glVertexAttribPointer(vertexPositionAttribute, 3, GL_FLOAT, false, stride, 0);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(vertexColorAttribute, 4, GL_FLOAT, false, stride, (GLvoid*)(3 * sizeof(float)));
glEnableVertexAttribArray(GLKVertexAttribColor);
glDrawArrays(GL_TRIANGLES, 0, numItems);
}
上下文设置。在这里我绑定我的顶点数组并生成顶点缓冲区:
-(void)setupContext
{
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
if(!self.context) {
NSLog(@"Failed to create OpenGL ES Context");
}
GLKView *view = (GLKView *)self.view;
view.context = self.context;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
[EAGLContext setCurrentContext:self.context];
self.effect = [[GLKBaseEffect alloc] init];
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glGenVertexArraysOES(1, &vao);
glBindVertexArrayOES(vao);
glGenBuffers(1, &vbo);
}
片段和顶点着色器非常简单:
//fragment
varying lowp vec4 vColor;
void main(void) {
gl_FragColor = vColor;
}
//vertex
attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
varying lowp vec4 vColor;
void main(void) {
gl_Position = vec4(aVertexPosition, 1.0);
vColor = aVertexColor;
}
结果。未显示三角形:
错在哪里?我想问题出在投影矩阵上。这里是githublink到Xcode项目。
下载了您的代码并进行了试用。我看到紫色屏幕,没有三角形,所以我猜这就是问题所在。我发现有两件事可能是问题所在:
1) 您需要将要发送的总字节数传递给 glBufferData,如下所示:glBufferData(GL_ARRAY_BUFFER, sizeof(float) * itemSize * numItems, convertedVerts, GL_DYNAMIC_DRAW);
。任何与如何分块数据相关的数据都保留在 glVertexAttribPointer 中。
2) 这似乎不是唯一的问题,因为我仍然无法显示三角形。我以前从未使用过 GLKit(我只是对桌面平台上的 OpenGL 有一点经验)。也就是说,如果我分别用 0 和 1 替换 GLKVertexAttributePosition 和 GLKVertexAttribColor。并应用 1 中的 glBufferData 修复程序,当我移动鼠标时,我看到模拟器屏幕上闪烁着伪影。所以这些枚举值和 glVertexAttribPointer 肯定有问题。
编辑 - 对 2 的说明:
按照 1 中所述更改 glBufferData 行后。我还修改了 glEnableVertexAttribArray 行,因此看起来像这样:
glVertexAttribPointer(vertexPositionAttribute, 3, GL_FLOAT, false, stride, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(vertexColorAttribute, 4, GL_FLOAT, false, stride, (GLvoid*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
完成这两项更改后,我可以看到屏幕上闪烁着红色三角形。靠近一步,因为我之前什么都看不见。但我还没能弄明白:(