IOS OpenGLES2.0 入门03 绘制彩色三角形
2016-09-28 17:30
519 查看
接上一篇
上一篇的三角形是红色, 红色的代码是固定死在代码里面的, 如果要蓝色, 白色, 或者是彩色的, 这样就行不通了
那么如何绘制一个彩色的三角形呢
绘制红色的三角形的Fragment Shader的代码是这样的
之前说了gl_FragColor是该顶点的输出颜色, 正常我们不会把代码写死, 而应该是传递一个变量给它, 想要什么颜色可以通过这个变量来改.
Vertex Shader可以给Fragment Shader传递参数, 使用的就是varying关键字
我们将之前的Vertex Shader和Fragment Shader源码改动一下
Vertex Shader
Fragment Shader
这样我们就要传递两个参数给Vertex Shader, 一个position, 一个inputColor.
我们定义Color的数据
然后使用跟顶点数据一样的方式将数据传递给OpenGL
因为颜色和顶点数据都是使用GL_ARRAY_BUFFER这个标志, 所以我们将数据绑定给OpenGL并且告诉它如何使用的时候, 必须马上将数据绘制出来, 不然会被后面的数据覆盖, 或者再重新绑定一次
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
后面的glDrawArrays都是针对_vertexBuffer来操作.
然后在
glBindBuffer(GL_ARRAY_BUFFER, _colorBuffer);
后面的glDrawArrays都是针对_colorBuffer来操作.
这边不在多次绑定, 直接draw出来
所以创建和绘制顶点和颜色的函数改成这样
其他的还是给上一篇一样
修改完后的代码
上一篇的三角形是红色, 红色的代码是固定死在代码里面的, 如果要蓝色, 白色, 或者是彩色的, 这样就行不通了
那么如何绘制一个彩色的三角形呢
绘制红色的三角形的Fragment Shader的代码是这样的
void main(void) { gl_FragColor = vec4(1, 0, 0, 1); }
之前说了gl_FragColor是该顶点的输出颜色, 正常我们不会把代码写死, 而应该是传递一个变量给它, 想要什么颜色可以通过这个变量来改.
Vertex Shader可以给Fragment Shader传递参数, 使用的就是varying关键字
我们将之前的Vertex Shader和Fragment Shader源码改动一下
Vertex Shader
attribute vec4 position; attribute vec4 inputColor; varying vec4 fragmentColor; void main(void) { fragmentColor = inputColor; gl_Position = position; }
Fragment Shader
varying lowp vec4 fragmentColor; void main(void) { gl_FragColor = fragmentColor; }
这样我们就要传递两个参数给Vertex Shader, 一个position, 一个inputColor.
我们定义Color的数据
static int colorCount = 3; static GLfloat colorData[] = { //RGB格式 1, 0, 0, 0, 1, 0, 0, 0, 1 };
然后使用跟顶点数据一样的方式将数据传递给OpenGL
_positionPtr = glGetAttribLocation(_program, "position"); _colorPtr = glGetAttribLocation(_program, "inputColor");
glGenBuffers(1, &_colorBuffer); glBindBuffer(GL_ARRAY_BUFFER, _colorBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(colorData), colorData, GL_STATIC_DRAW);
因为颜色和顶点数据都是使用GL_ARRAY_BUFFER这个标志, 所以我们将数据绑定给OpenGL并且告诉它如何使用的时候, 必须马上将数据绘制出来, 不然会被后面的数据覆盖, 或者再重新绑定一次
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
后面的glDrawArrays都是针对_vertexBuffer来操作.
然后在
glBindBuffer(GL_ARRAY_BUFFER, _colorBuffer);
后面的glDrawArrays都是针对_colorBuffer来操作.
这边不在多次绑定, 直接draw出来
所以创建和绘制顶点和颜色的函数改成这样
- (void) setupVertexAndColorData {
//顶点数据
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
glEnableVertexAttribArray(_positionPtr);
glVertexAttribPointer(_positionPtr, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, NULL);
glDrawArrays(GL_TRIANGLES, 0, vertexCount);
//颜色数据
glGenBuffers(1, &_colorBuffer); glBindBuffer(GL_ARRAY_BUFFER, _colorBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(colorData), colorData, GL_STATIC_DRAW);
glEnableVertexAttribArray(_colorPtr);
glVertexAttribPointer(_colorPtr, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, NULL);
glDrawArrays(GL_TRIANGLES, 0, colorCount);
}
其他的还是给上一篇一样
修改完后的代码
相关文章推荐
- IOS OpenGLES2.0 入门02 绘制三角形
- IOS OpenGLES2.0 入门04 加载纹理
- OpenGLES2.0(二)实战之绘制三角形
- Android OpenGLES2.0(二)——绘制一个三角形
- Android OpenGLES2.0绘制三角形(二)
- IOS OpenGLES2.0 入门01 清空屏幕
- Android OpenGLES2.0等腰直角三角形和彩色的三角形(三)
- OpenGL ES2.0入门之Android篇(一)——绘制三角形
- Android OpenGLES2.0(三)——等腰直角三角形和彩色的三角形
- OpenGL ES2.0入门之Android篇(一)——绘制三角形
- GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- 【Android 应用开发】OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解
- [原]OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解
- iOS OpenGL ES2.0教程 Lesson03 旋转 投影矩阵,相机矩阵,世界矩阵生效
- 【Android 应用开发】OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解
- iOS 使用 Core Plot 绘制统计图表入门
- iOS OpenGL ES2.0教程 Lesson03 旋转
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- iOS 使用 Core Plot 绘制统计图表入门
- iOS 画线 绘制直线、矩形、三角形