android学习笔记之3D---多边形着色(颜色)
2010-10-23 13:06
701 查看
上次学习了绘制2D多边形,我们可以使用OpenGL通过顶点数据绘制出一些图形,但是可以看出我们绘制的图形都是单色的,可想而知我们没有对图形进行着色。
对图形着色有两种方式:1. 光滑着色 2. 平面着色。
平滑着色:
我们对上一个实例中的三角形进行平滑着色,是将三角形的三个顶点的不同颜色混合在一起,就是色彩的混色。
首先为三角形的每个顶点设置一个颜色,和定义三角形数组相似。不同的是,颜色值有(r,g,b,a)
r:red
g:green
b:blue
a:alpha
定义三角形的颜色数组为:
和绘制多边形类似,我们使用颜色数组的时候也同样要开启颜色渲染功能。
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
开启了颜色数组后,和glVertexPointer功能相似的是我们要将定义好的颜色数组渲染到多边形上去。
gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer); //参数和glVertexPointer一样
最后,需要关闭颜色数组.
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
单调着色:
单调着色会比平滑着色简单很多,实际上就是设置当前所使用的颜色,即设置当前颜色之后绘制的所有内容都使用这个颜色。即使是在完全采用纹理贴图的时候,仍然可以用调节纹理的色调
现在我们只需将颜色依次性的设为理想的颜色(本例采用蓝色),然后绘制场景。这时绘制的每个顶点都是蓝色的。因为我们没有告诉OpenGL要改变顶点的颜色(glEnableClientState)。
这时单调着色的代码是: gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);//参数分别为red,green,blue,alpha
注意:glColor4f不需要开启颜色渲染功能,因此,需要在调用glColor4f方法之前使用glDisableClientState方法关闭颜色渲染功能,否则glColor4f方法不起作用。
对图形着色有两种方式:1. 光滑着色 2. 平面着色。
平滑着色:
我们对上一个实例中的三角形进行平滑着色,是将三角形的三个顶点的不同颜色混合在一起,就是色彩的混色。
首先为三角形的每个顶点设置一个颜色,和定义三角形数组相似。不同的是,颜色值有(r,g,b,a)
r:red
g:green
b:blue
a:alpha
定义三角形的颜色数组为:
int one = 0x10000; private IntBuffer colorBuffer = IntBuffer.wrap(new int[]{ one,0,0,one, 0,one,0,one, 0,0,one,one });
和绘制多边形类似,我们使用颜色数组的时候也同样要开启颜色渲染功能。
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
开启了颜色数组后,和glVertexPointer功能相似的是我们要将定义好的颜色数组渲染到多边形上去。
gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer); //参数和glVertexPointer一样
最后,需要关闭颜色数组.
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
单调着色:
单调着色会比平滑着色简单很多,实际上就是设置当前所使用的颜色,即设置当前颜色之后绘制的所有内容都使用这个颜色。即使是在完全采用纹理贴图的时候,仍然可以用调节纹理的色调
现在我们只需将颜色依次性的设为理想的颜色(本例采用蓝色),然后绘制场景。这时绘制的每个顶点都是蓝色的。因为我们没有告诉OpenGL要改变顶点的颜色(glEnableClientState)。
这时单调着色的代码是: gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);//参数分别为red,green,blue,alpha
注意:glColor4f不需要开启颜色渲染功能,因此,需要在调用glColor4f方法之前使用glDisableClientState方法关闭颜色渲染功能,否则glColor4f方法不起作用。
package com.geolo.android.GL;
import java.nio.IntBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;
import android.util.Log;
public class GLRender implements Renderer{
int one = 0x10000; private IntBuffer colorBuffer = IntBuffer.wrap(new int[]{ one,0,0,one, 0,one,0,one, 0,0,one,one });
//三角形三个顶点
private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{
0,one,0, //上顶点
-one,-one,0, //左下点
one,-one,0,}); //右下点
//正方形的4个顶点
private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{
one,one,0,
-one,one,0,
one,-one,0,
-one,-one,0});
public void onDrawFrame(GL10 gl) {
Log.d(this.getClass().getName(), "onDrawFrame.........");
// 清除屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 三角形
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
// 左移 1.5 单位,并移入屏幕 6.0
gl.glTranslatef(-1.5f, 0.0f, -6.0f);
// 允许设置顶点
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//设置颜色数组
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// 设置三角形
gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);
//对三角形平滑着色
gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer);
//绘制三角形
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
//关闭颜色数组
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
// 正方形
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
// 左移 1.5 单位,并移入屏幕 6.0
gl.glTranslatef(1.5f, 0.0f, -6.0f);
//设置和绘制正方形
gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
//对正方形单调着色
gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);
// 取消顶点设置
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
Log.d(this.getClass().getName(), "onSurfaceChanged.........");
float ratio = (float) width / height;
//设置OpenGL场景的大小
gl.glViewport(0, 0, width, height);
//设置投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
//重置投影矩阵
gl.glLoadIdentity();
// 设置视图的大小
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
// 选择模型观察矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置模型观察矩阵
gl.glLoadIdentity();
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Log.d(this.getClass().getName(), "onSurfaceCreated.........");
// 启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 黑色背景
gl.glClearColor(0, 0, 0, 0);
// 设置深度缓存
gl.glClearDepthf(1.0f);
// 启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);
// 告诉系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
}
}
相关文章推荐
- android学习笔记之3D---多边形
- android学习笔记之3D---多边形
- DirectX 3D_基础之顶点缓存 索引缓存 访问缓存 颜色表示 顶点颜色 着色
- android学习笔记之3D---多边形
- 关于Direct3D中用于控制三维多边形的着色模式
- Linux 终端颜色,界面着色
- DirectX 3D_实践之DirectX3D中颜色的表示
- Fragment shader---实现半透明着色(物体遮住与非遮住部分都显示,并显示不同的颜色)
- 关于Direct3D中用于控制三维多边形的着色模式
- 自制3D显示引擎五:画多边形与正多边形
- 自制3D显示引擎七:填充任意多边形
- hdu3662 +3D Convex Hull+三维凸包的表面多边形个数
- [DevExpress]GridControl根据条件改变单元格/行颜色(Dev GridControl 单元格着色)
- 3D渲染引擎着色方式的演化史
- Android学习笔记之图像颜色处理(ColorMatrix)
- D3D中的颜色和着色
- 3D开发学习-着色语言 Shading Language基础(一)
- openGL学习笔记四 : 关于颜色, 大小, 虚线, 多边形反转, 镂空, 使用位图
- unity修改3d物体 meterial颜色
- 考题一:研究对全排列着色的性质 问题 A: 首先需要生成 n 的全排列然后对 n 的全排列进行着色, 使得相邻的两个数只需用最少颜色就可以把相邻的两个数用那区分开. (这里相邻包含两层含义:同时在自然