博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opengl绘图,画一个旋转的四边形和一个旋转的三角形,平滑着色和单一着色
阅读量:4665 次
发布时间:2019-06-09

本文共 3356 字,大约阅读时间需要 11 分钟。

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

转载于:https://www.cnblogs.com/bokeofzp/p/5967643.html

你可能感兴趣的文章
[hdu3631]背包或中途相遇法
查看>>
模块化开发(seajs)
查看>>
HDU1848 Fibonacci again and again 博弈 SG函数
查看>>
iOS-自建iPa应用分发平台
查看>>
12月2日站立会议
查看>>
【转载】详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别
查看>>
DBA笔记oracle undo_retention参数可动态修改
查看>>
123我爱你
查看>>
HDU 4033 Regular Polygon(几何 + 二分)
查看>>
webgl example1
查看>>
Django基础内容整理
查看>>
DTcms网站伪静态逻辑
查看>>
网络类型判断
查看>>
黑客dos命令大全
查看>>
Java开发必用的工具包
查看>>
https soap链接示例
查看>>
八LWIP学习笔记之用户编程接口(NETCONN)
查看>>
Git Day02,工作区,暂存区,回退,删除文件
查看>>
Docker安装MariaDB
查看>>
如何给app客户端进行埋点?
查看>>