opengl绘图,画一个旋转的四边形和一个旋转的三角形,平滑着色和单一着色

Posted Lammy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl绘图,画一个旋转的四边形和一个旋转的三角形,平滑着色和单一着色相关的知识,希望对你有一定的参考价值。

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);
}
 
}
实现的效果:

以上是关于opengl绘图,画一个旋转的四边形和一个旋转的三角形,平滑着色和单一着色的主要内容,如果未能解决你的问题,请参考以下文章

在OpenGL中围绕坐标旋转四边形

使用 OpenGL 固定功能旋转和平移 2D 图像

C ++ / openGL:使用四元数将QUAD旋转到一个点

使用 C++ 在 OpenGL 中移动自动旋转的 3d 多边形

OpenGL ES 顶点数组对象和奇怪的伪影

[opengl] 画一个可移动的自行车 二维几何变换(平移旋转缩放)