我发现从 opengles 开始真的很难。我在网上寻找教程。找到了 Philips Rideout 的一本免费书籍,尝试了几章,但由于缺乏良好的 C++ 技能,我把它留在了中间。然后尝试了 Ray Wenderlich 的教程,并被着色器所困,无法弥补一个非常简单的教程。现在,我正在浏览 Jeff Lamarche 的旧博客。我知道有一个非常好的面向对象框架,称为 COCOS2D,它几乎可以完成 2D 游戏和图形所需的一切,但我想在实际尝试 COCOS2D 之前打下良好的基础。但是,我似乎永远也达不到那里。我遇到了一个接一个的麻烦,我无法找到解决办法。于是,我一次又一次的来stack overflow来解开我的误会。您的帮助和支持将始终帮助我清除代码中的错误,当然也会消除我的误解。
我对 OpenGLES 中非常简单的三角形有疑问。此示例使用 OpenGLES 1.0。在我的 View 中渲染图形的代码是这样的,
struct Vertex3D{
GLfloat x;
GLfloat y;
GLfloat z;
};
struct Triangle3D{
Vertex3D v1;
Vertex3D v2;
Vertex3D v3;
};
static inline Triangle3D Triangle3DMake(Vertex3D vertex1, Vertex3D vertex2, Vertex3D vertex3){
Triangle3D triangle;
triangle.v1 = vertex1;
triangle.v2 = vertex2;
triangle.v3 = vertex3;
return triangle;
};
static inline Vertex3D vertex3DMake(GLfloat x, GLfloat y, GLfloat z){
Vertex3D vertex;
vertex.x = x;
vertex.y = y;
vertex.z = z;
return vertex;
}
static inline GLfloat Vertex3DCalculateDistanceBetweemVertices(Vertex3D first, Vertex3D second){
GLfloat deltaX = second.x - first.x;
GLfloat deltaY = second.y - first.y;
GLfloat deltaZ = second.z - first.z;
return sqrtf(powf(deltaX, 2) + powf(deltaY, 2) + powf(deltaZ, 2));
}
@implementation GLView{
GLuint renderbuffer;
GLuint framebuffer;
EAGLContext *_context;
CAEAGLLayer *layer;
GLuint depthbuffer;
}
+(Class)layerClass{
return [CAEAGLLayer class];
}
-(void)setUpLayer{
layer = (CAEAGLLayer*)super.layer;
}
-(void)setUpContext{
EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES1;
_context = [[EAGLContext alloc] initWithAPI:api];
if(!_context){
NSLog(@"Could not create context");
abort();
}
if(![EAGLContext setCurrentContext:_context]){
NSLog(@"Could not set current context");
abort();
}
}
-(void)setUpRenderBuffer{
glGenRenderbuffersOES(1, &renderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderbuffer);
glGenRenderbuffers(1, &depthbuffer);
glBindRenderbufferOES(GL_DEPTH_COMPONENT16_OES, depthbuffer);
[_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:layer];
[_context renderbufferStorage:GL_DEPTH_COMPONENT16_OES fromDrawable:layer];
}
-(void)setUpFrameBuffer{
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, renderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_DEPTH_COMPONENT16_OES, depthbuffer);
}
-(void)render{
Vertex3D vertex1 = vertex3DMake(0,1,0);
Vertex3D vertex2 = vertex3DMake(1.0, 0.0, 0);
Vertex3D vertex3 = vertex3DMake(-1.0, 0.0, 0.);
Triangle3D triangle = Triangle3DMake(vertex1, vertex2, vertex3);
glViewport(0, 0, self.bounds.size.width, self.bounds.size.height);
glClearColor(0.7, 0.7, 0.7, 1.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glColor4f(1.0, 0.0, 0.0, 1.0);
glVertexPointer(3, GL_FLOAT, 0, &triangle);
glDrawArrays(GL_TRIANGLES, 0, 9);
[_context presentRenderbuffer:GL_RENDERBUFFER_OES];
glDisableClientState(GL_VERTEX_ARRAY);
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setUpLayer];
[self setUpContext];
[self setUpRenderBuffer];
[self setUpFrameBuffer];
[self render];
}
return self;
}
这段代码生成的图形如下图所示;
因为我使用的是 (1,0)、(-1,0)、(1,0) 的二维坐标,所以我假设它应该给我这样的图形;
我确信我做错了一些非常小的事情。如果有人能指出我,那将对我有很大帮助。再次感谢。
最佳答案
看起来您只是渲染了太多的顶点,而 OpenGL 正在将您的顶点数组末尾读取到未初始化的内存中。线路
glDrawArrays(GL_TRIANGLES, 0, 9);
应该是
glDrawArrays(GL_TRIANGLES, 0, 3);
如果你只想画一个三角形。第三个参数是要渲染的顶点总数。
关于ios - 在 opengles 中渲染三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14246941/