OpenGL ES 學習筆記二之簡單圖形

標準化設備坐標(Normalized Device Coordinates, NDC)

圖片來自:http://learnopengl-cn.readthedocs.io/zh/latest/

//方式一 列出所有頂點

GLfloat vertices[] = {

// 第一個三角形

0.5f, 0.5f, 1.0f,? // 右上角

0.5f, -0.5f, 0.5f,? // 右下角

-0.5f, 0.5f, -1.0f,? // 左上角

// 第二個三角形

0.5f, -0.5f, 0.0f,? // 右下角

-0.5f, -0.5f, 0.0f, // 左下角

-0.5f, 0.5f, 0.0f? // 左上角

};

- (void)viewDidLoad {

[super viewDidLoad];

GLKView * viewGl = (GLKView *)self.view;

self.glView = viewGl;

self.glView.context = self.glContext;

viewGl.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;? //顏色緩沖區格式

[EAGLContext setCurrentContext:self.glContext];

[self configVAO];

[self setupBaseEffect];

// Do any additional setup after loading the view, typically from a nib.

}

- (EAGLContext *)glContext

{

if (!_glContext) {

_glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

}

return _glContext;

}

- (void)configVAO

{

//頂點數據緩存

GLuint buffer;

glGenBuffers(1, &buffer);

glBindBuffer(GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition); //頂點數據緩存

glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, (GLfloat *)NULL + 0);

}

//創建著色器效果

- (void)setupBaseEffect{

self.mEffect = [[GLKBaseEffect alloc] init];

}

/**

*? 渲染場景代碼

*/

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {

//啟動著色器

[self.mEffect prepareToDraw];

glClearColor(0.3f, 0.6f, 1.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//繪制

glDrawArrays(GL_TRIANGLES, 0, 3);

}

讀取前三個點,畫出三角形,如果讀取6個頂點,則將畫出2個三角形。

//繪制

glDrawArrays(GL_TRIANGLES, 0, 6);


加入顏色,在VAO下方設置設置顏色數據

glEnableVertexAttribArray(GLKVertexAttribColor); //顏色

glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, (GLfloat *)NULL + 0);

效果如下:

使用索引繪制相同圖形

//方式二 列出所有不同頂點,根據索引讀取

GLfloat verticesIndex[] = {

0.5f, 0.5f, 0.0f,? // 右上角

0.5f, -0.5f, 0.0f,? // 右下角

-0.5f, -0.5f, 0.0f, // 左下角

-0.5f, 0.5f, 0.0f? // 左上角

};

GLuint indices[] = { // 注意索引從0開始!

0, 1, 3, // 第一個三角形

1, 2, 3? // 第二個三角形

};

頂點數據緩存,加入索引

- (void)configVAO

{

//頂點數據緩存

GLuint buffer;

glGenBuffers(1, &buffer);

glBindBuffer(GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER, sizeof(verticesIndex), verticesIndex, GL_STATIC_DRAW);

GLuint indicesBuffer;? //索引數組

glGenBuffers(1, &indicesBuffer);? //申請一個標識符(索引數組buffer)

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer);

//GL_STATIC_DRAW表示此緩沖區內容只能被修改一次,但可以無限次讀取。

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition); //頂點數據緩存

glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, (GLfloat *)NULL + 0);

glEnableVertexAttribArray(GLKVertexAttribColor); //顏色

glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, (GLfloat *)NULL + 0);

}

修改渲染方式

glDrawElements(GL_TRIANGLES, sizeof(indices) / sizeof(indices[0]), GL_UNSIGNED_INT, 0);

效果如下:


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容