opengl单一着色和平滑着色,以及图形的旋转
package com.example.zp.myapplication;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;
public class GLRender2 implements Renderer
{
// int one =0x10000;
// //三角形三个顶点
// private IntBuffer triggerBuffer = BufferUtil.intToBuffer(new int[]{
// 0,one,0, //上顶点
// -one,-one,0, //左下点
// one,-one,0,}); //右下点
// //正方形的4个顶点
// private IntBuffer quaterBuffer = BufferUtil.intToBuffer(new int[]{
// one,one,0,
// -one,one,0,
// one,-one,0,
// -one,-one,0});
float rotateSpeed =5* (float) Math.PI/18;
float rotateTri = 0;
float one = 1f;
//三角形三个顶点
private FloatBuffer triggerBuffer2 = BufferUtil.floatToBuffer(new float []{
0,one,0, //上顶点
-one,-one,0, //左下点
one,-one,0,}); //右下点
//正方形的4个顶点
private FloatBuffer quaterBuffer2 = BufferUtil.floatToBuffer(new float[]{
one,one,0,
-one,one,0,
one,-one,0,
-one,-one,0});
private FloatBuffer colorBuffer2 = BufferUtil.floatToBuffer(new float[]{
one,0,0,one,
0,one,0,one,
0,0,one,one,
});
@Override
public void onDrawFrame(GL10 gl)
{
// 清除屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 允许设置顶点
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//**********************绘制三角形***********************************//
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
// 移动绘图原点的坐标与上面的语句连用就相当于设置新的绘图远点坐标,gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);后面的1-10是指图像的1-10层,
// 图像所处层次越大,在屏幕上显示就越小。默认为(0,0,1),
// 左移 1.5 单位,并移入屏幕 6.0。
gl.glTranslatef(-1.5f, 0.0f, -6.0f);
gl.glRotatef(rotateTri, 0.0f, 1.0f, 0.0f);
//启用平滑着色
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);// gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);可以直接设置绘图的单调颜色
// 设置三角形点
// gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);
gl.glVertexPointer(3,GL10.GL_FLOAT,0,triggerBuffer2);
//设置平滑着色的颜色矩阵
gl.glColorPointer(4,GL10.GL_FLOAT,0,colorBuffer2);//都是一维矩阵,因此第一个参数就是表示一个颜色的长度表示
//绘制
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
// 关闭颜色平滑着色设置
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
gl.glFinish();
//****************************绘制四边形***********************************//
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
//右移 1.5 单位,并移入屏幕 6.0
gl.glTranslatef(1.5f, 0.0f, -6.0f);
//旋转矩阵
gl.glRotatef(rotateTri, 0.0f, 0.0f, 1.0f);
//设置和绘制正方形
// gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);
gl.glVertexPointer(3,GL10.GL_FLOAT,0,quaterBuffer2);
//单一着色
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glFinish();
// 关闭顶点设置
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
rotateTri=rotateTri+rotateSpeed;
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
{
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();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
// 启用阴影平滑
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);
}
}
实现的效果: