这是我们绘制的第一个图形,选择三角形,点、线、三角形是OpenGL ES世界的图形基础。无论多么复杂的几何物体,在opengl ES的世界里都可以用三角形拼成。关于Android OpenGL ES 三角形的绘制,在Android官方文档中也是优先详细介绍三角形,这边也是根据官方文档来绘制。
一、流程//为了让您的应用使用 OpenGL ES 2.0 API,您必须将以下声明添加到清单中:
//假如:OpenGL ES 3.1配置 0x00030001
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
2、 创建Activity,自定义GLSurfaceView 作为主要视图的 Activity 的最低实现:
public class Mai nActivity extends Activity {
private GLSurfaceView gLView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//创建一个自定义的GLSurfaceView
gLView = new MyGLSurfaceView(this);
setContentView(gLView);
}
}
创建GLSurfaceView 是一种专用视图,您可以在其中绘制 OpenGL ES 图形。它本身并没有很大的作用。对象的实际绘制由您在此视图中设置的 GLSurfaceView.Renderer 控制
import android.content.Context;
import android.opengl.GLSurfaceView;
class MyGLSurfaceView extends GLSurfaceView {
private final MyGLRenderer renderer;
public MyGLSurfaceView(Context context){
super(context);
//设置opengl版本
setEGLContextClientVersion(2);
//创建自定义渲染器
renderer = new MyGLRenderer();
// Set the Renderer for drawing on the GLSurfaceView
setRenderer(renderer);
//性能有关。安卓默认使用这个按需渲染
//该设置可防止系统在您调用 requestRender() 之前重新绘制 GLSurfaceView 帧,这对于此示例应用而言更为高效。
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
}
【相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】
C 音视频配套学习资料:点击莬费领取→
attribute vec4 vPosition;
void main() {
gl_Position = vPosition;
}
片元着色器:
precision mediump float;
//uniform vec4 vColor;
void main() {
//系统默认颜色字段:gl_FragColor
gl_FragColor = vec4(0.9, 0.5, 0.7, 1.0);
}
定义三角形和创建program对象(着色器程序)
private final int mProgram;
private final FloatBuffer mVertexBuffer;
private int vertexCount;
private final int vertexStride = 3 * 4; // 4 bytes per vertex
public Triangle(Context context) {
String vertex = OpenGLUtils.readRawTextFile(context, R.raw.triangle_vert);
String frag = OpenGLUtils.readRawTextFile(context, R.raw.triangle_frag);
//顶点着色器id
int vertexId = loadShader(GLES20.GL_VERTEX_SHADER, vertex);
//片元着色器id
int fragId = loadShader(GLES20.GL_FRAGMENT_SHADER, frag);
//OpenGL ES渲染程序
mProgram = GLES20.glCreateProgram();
GLES20.glAttachShader(mProgram, vertexId);
GLES20.glAttachShader(mProgram, fragId);
//link一下。激活
GLES20.glLinkProgram(mProgram);
GLES20.glDeleteShader(vertexId);
GLES20.glDeleteShader(fragId);
//世界坐标
float squareCoords[] = {
-0.5f, -0.5f, 0f,
0.5f, -0.5f, 0f,
-0.5f, 0.5f, 0f,
0.5f, 0.5f, 0f};
mVertexBuffer = ByteBuffer.allocateDirect(squareCoords.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
mVertexBuffer.clear();
mVertexBuffer.put(squareCoords);
vertexCount = squareCoords.length / 3;
}
private int loadShader(int type, String shaderCode) {
//获取着色器
int shader = GLES20.glCreateShader(type);
//添加对于代码
GLES20.glShaderSource(shader, shaderCode);
//编译着色器
GLES20.glCompileShader(shader);
return shader;
}
public void draw() {
//创建程序。链接到GPU
GLES20.glUseProgram(mProgram);
//获取顶点着色器坐标
int vPosition = GLES20.glGetAttribLocation(mProgram, "vPosition");
mVertexBuffer.position(0);
//第二个参数是坐标个数:x,y,z
GLES20.glVertexAttribPointer(vPosition, 3, GLES20.GL_FLOAT, false, vertexStride, mVertexBuffer);
GLES20.glEnableVertexAttribArray(vPosition);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
}
绘制渲染
public class MyRenderer implements GLSurfaceView.Renderer {
private MyGLSurfaceView myGLSurfaceView;
private Triangle mTriangle;
public MyRenderer(MyGLSurfaceView myGLSurfaceView) {
this.myGLSurfaceView = myGLSurfaceView;
}
@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
//设置要清空窗体为指定的颜色
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
mTriangle = new Triangle(myGLSurfaceView.getContext());
}
@Override
public void onSurfaceChanged(GL10 gl10, int i, int i1) {
//设置窗口大小
GLES20.glViewport(0,0,i,i1);
}
@Override
public void onDrawFrame(GL10 gl10) {
//执行清空窗体
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
mTriangle.draw();
}
}
三、效果
如果你对音视频开发感兴趣,或者对本文的一些阐述有自己的看法,可以在下方的留言框,一起探讨。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved