OpenglES学习4-立方体

这次我们参考xxx 实现的简单版本旋转立方体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
- (void)prepare{
// 1. 基本配置
EAGLContext *ctx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:ctx];
self.ctx = ctx;
glDeleteFramebuffers(1, &fboId);
glDeleteBuffers(1, &colorRboId);
glDeleteBuffers(1, &depthRboId);
fboId = colorRboId = depthRboId = 0;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glGenRenderbuffers(1, &colorRboId);
glBindRenderbuffer(GL_RENDERBUFFER, colorRboId);
[self.ctx renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
GLint w,h;
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &w);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &h);
self.renderSize = CGSizeMake(w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRboId);
[self chkFBOStatus];
// --- depth render buffer
glGenRenderbuffers(1, &depthRboId);
glBindRenderbuffer(GL_RENDERBUFFER, depthRboId);
// Once a renderbuffer object is bound, we can specify the dimensions and format of the image stored in the renderbuffer.
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.renderSize.width, self.renderSize.height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRboId);
[self chkFBOStatus];
// 2.
glClearColor(0.423, 0.43, 0.87, 1);
// 3. 设置顶点数据,下标数据
glGenBuffers(1, &vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
//The vertex array data or element array data storage is created and initialized using the glBufferData command.
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
// 3. shader配置
[self setShader];
projUnif = glGetUniformLocation(programId, "u_Projection");
modelUnif = glGetUniformLocation(programId, "u_ModelView");
// 5. 给shader 参数设置数据
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VFVertex), (const GLvoid *)offsetof(VFVertex, position));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(VFVertex), (const GLvoid *)offsetof(VFVertex, color));
}
- (void)drawAndRender{
// 1. use program
glUseProgram(programId);
// 2. transform
//FIXME: 这个不懂参数什么意思,如何取到的?
self.modelPostion = GLKVector3Make(0, -0.5, -5);
[self tansform];
glViewport(0, 0, self.renderSize.width, self.renderSize.height);
//FIXME: 这个不懂为什么设置?
glDepthRangef(0, 1);
// 3. clear old cached
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 4. open depth test
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
// 5. draw
glBindRenderbuffer(GL_RENDERBUFFER, colorRboId);
//The glBindBuffer command is used to make a buffer object the current array buffer object or the current element array buffer object.
// glBindBuffer(GL_ARRAY_BUFFER, vboId);
glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(indices[0]), GL_UNSIGNED_BYTE, indices);
// 6. render
[self.ctx presentRenderbuffer:GL_RENDERBUFFER];
}

** 遗留的几个问题

  1. 坐标空间的转换?

  2. shader代码为何这么写?

文章目录
|