参考原文:Android OpenGLES2.0(二)——绘制一个三角形_gles2.0 创建窗口视图-CSDN博客
用gl画的三角形,一直不显示。下面是代码:
package com.example.gles_demo;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class TriangleRender implements GLSurfaceView.Renderer {
private final String vertexShaderCode =
"attribute vec4 vPosition;" +
"void main() {" +
" gl_Position = vPosition;" +
"}";
private final String fragmentShaderCode =
"precision mediump float;" +
"uniform vec4 vColor;" +
"void main() {" +
" gl_FragColor = vColor;" +
"}";
float triangleCoords[] = {
0.5f, 0.5f, 0.0f, // top
-0.5f, -0.5f, 0.0f, // bottom left
0.5f, -0.5f, 0.0f // bottom right
};
float color[] = {2.0f, 1.0f, 1.0f, 1.0f}; //白色
private FloatBuffer vertexBuffer;
private int mProgram;
private int mPositionHandle;
private int mColorHandle;
static final int COORDS_PER_VERTEX = 3;
//顶点个数
private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
//顶点之间的偏移量
private final int vertexStride = COORDS_PER_VERTEX * 4; // 每个顶点四个字节
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//将背景置为灰色
GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
//申请底层空间
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(triangleCoords.length * 4);
//设置bytebuffer的字节序,
byteBuffer.order(ByteOrder.nativeOrder());
//将坐标数据转换为FloatBuffer,用以传入给OpenGL ES程序
vertexBuffer = byteBuffer.asFloatBuffer();
vertexBuffer.put(triangleCoords);
vertexBuffer.position(0);
//根据type创建顶点着色器
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,vertexShaderCode);
//根据type创建片元着色器
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentShaderCode);
//创建一个空的OpenGLES程序
mProgram = GLES20.glCreateProgram();
//将顶点着色器加入到程序
GLES20.glAttachShader(mProgram,vertexShader);
//将片元着色器加入到程序中
GLES20.glAttachShader(mProgram, fragmentShader);
//连接到着色器程序
GLES20.glLinkProgram(mProgram);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
GLES20.glViewport(0,0,width,height);
}
@Override
public void onDrawFrame(GL10 gl) {
//将程序加入到OpenGLES2.0环境
GLES20.glUseProgram(mProgram);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
//获取顶点着色器的vPosition成员句柄
mPositionHandle = GLES20.glGetAttribLocation(mProgram,"vPosition");
//启用三角形顶点的句柄
GLES20.glEnableVertexAttribArray(mPositionHandle);
//准备三角形的坐标数据
GLES20.glVertexAttribPointer(mPositionHandle,COORDS_PER_VERTEX,GLES20.GL_FLOAT,false,vertexStride,vertexBuffer);
//获取片元着色器的vColor成员的句柄
mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
//设置绘制三角形的颜色
GLES20.glUniform4fv(mColorHandle, 1, color, 0);
//绘制三角形
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
//禁止顶点数组的句柄
GLES20.glDisableVertexAttribArray(mPositionHandle);
GLES20.glFlush();
}
private int loadShader(int shaderCode, String shaderCodeType) {
//根据type创建顶点着色器和片元着色器
int shader = GLES20.glCreateShader(shaderCode);
//将资源加入到着色器中,并编译
GLES20.glShaderSource(shader, shaderCodeType);
GLES20.glCompileShader(shader);
return shader;
}
}
package com.example.gles_demo;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.Window;
public class MainActivity extends Activity {
GLSurfaceView glSurfaceView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
glSurfaceView = findViewById(R.id.glSurfaceView);
TriangleRender render = new TriangleRender();//三角形
glSurfaceView.setRenderer(render);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.opengl.GLSurfaceView
android:id="@+id/glSurfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
解决:
去掉Activity设置的全屏窗口属性
//getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);