以下是使用OpenGL在Android 11系统上显示立方体的代码:

首先,在Android Studio中创建一个新的OpenGL项目。在MainActivity.java中,我们需要将OpenGL视图添加到活动中,并创建一个Renderer类来呈现立方体。

MainActivity.java:

import androidx.appcompat.app.AppCompatActivity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    private GLSurfaceView mGLView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 创建一个OpenGL视图
        mGLView = new GLSurfaceView(this);

        // 设置Renderer
        mGLView.setRenderer(new MyRenderer());

        // 将OpenGL视图添加到活动中
        setContentView(mGLView);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mGLView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mGLView.onPause();
    }
}

接下来,我们需要创建一个Renderer类来呈现立方体。在MyRenderer.java中,我们使用OpenGL ES 2.0来创建一个立方体,并将其绘制到OpenGL视图中。

MyRenderer.java:

import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

public class MyRenderer implements GLSurfaceView.Renderer {

    private Cube mCube;
    private float[] mViewMatrix = new float[16];
    private float[] mProjectionMatrix = new float[16];
    private float[] mMVPMatrix = new float[16];

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        // 设置背景颜色为黑色
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

        // 创建立方体
        mCube = new Cube();
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {

        // 设置视口大小
        GLES20.glViewport(0, 0, width, height);

        // 计算投影矩阵
        float ratio = (float) width / height;
        Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

        // 计算视图矩阵
        Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    }

    @Override
    public void onDrawFrame(GL10 gl) {

        // 清除屏幕
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

        // 计算模型视图投影矩阵
        Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);

        // 绘制立方体
        mCube.draw(mMVPMatrix);
    }
}

最后,我们需要创建一个Cube类来创建立方体。在Cube.java中,我们使用OpenGL ES 2.0来创建立方体,并将其绘制到OpenGL视图中。

Cube.java:

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import android.opengl.GLES20;

public class Cube {

    private final String vertexShaderCode =
        "uniform mat4 uMVPMatrix;" +
        "attribute vec4 vPosition;" +
        "void main() {" +
        "  gl_Position = uMVPMatrix * vPosition;" +
        "}";

    private final String fragmentShaderCode =
        "precision mediump float;" +
        "void main() {" +
        "  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);" +
        "}";

    private FloatBuffer vertexBuffer;
    private final int mProgram;
    private int mPositionHandle;
    private int mMVPMatrixHandle;

    private final float[] vertices = {
        // 正面
        -1.0f, -1.0f,  1.0f,
         1.0f, -1.0f,  1.0f,
         1.0f,  1.0f,  1.0f,
        -1.0f,  1.0f,  1.0f,

        // 背面
        -1.0f, -1.0f, -1.0f,
        -1.0f,  1.0f, -1.0f,
         1.0f,  1.0f, -1.0f,
         1.0f, -1.0f, -1.0f,

        // 左侧面
        -1.0f, -1.0f, -1.0f,
        -1.0f, -1.0f,  1.0f,
        -1.0f,  1.0f,  1.0f,
        -1.0f,  1.0f, -1.0f,

        // 右侧面
         1.0f, -1.0f, -1.0f,
         1.0f,  1.0f, -1.0f,
         1.0f,  1.0f,  1.0f,
         1.0f, -1.0f,  1.0f,

        // 顶面
        -1.0f,  1.0f, -1.0f,
        -1.0f,  1.0f,  1.0f,
         1.0f,  1.0f,  1.0f,
         1.0f,  1.0f, -1.0f,

        // 底面
        -1.0f, -1.0f, -1.0f,
         1.0f, -1.0f, -1.0f,
         1.0f, -1.0f,  1.0f,
        -1.0f, -1.0f,  1.0f
    };

    private final short[] indices = {
        0, 1, 2, 0, 2, 3, // 正面
        4, 5, 6, 4, 6, 7, // 背面
        8, 9, 10, 8, 10, 11, // 左侧面
        12, 13, 14, 12, 14, 15, // 右侧面
        16, 17, 18, 16, 18, 19, // 顶面
        20, 21, 22, 20, 22, 23 // 底面
    };

    public Cube() {

        // 将顶点坐标转换为字节缓冲区
        ByteBuffer bb = ByteBuffer.allocateDirect(vertices.length * 4);
        bb.order(ByteOrder.nativeOrder());
        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(vertices);
        vertexBuffer.position(0);

        // 编译顶点着色器和片段着色器
        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
        int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

        // 创建OpenGL ES程序
        mProgram = GLES20.glCreateProgram();
        GLES20.glAttachShader(mProgram, vertexShader);
        GLES20.glAttachShader(mProgram, fragmentShader);
        GLES20.glLinkProgram(mProgram);
    }

    public void draw(float[] mvpMatrix) {

        // 将程序添加到OpenGL ES环境中
        GLES20.glUseProgram(mProgram);

        // 获取位置句柄
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

        // 启用位置句柄
        GLES20.glEnableVertexAttribArray(mPositionHandle);

        // 准备立方体顶点数据
        GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 12, vertexBuffer);

        // 获取MVP矩阵句柄
        mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

        // 应用MVP矩阵
        GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

        // 绘制立方体
        GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES20.GL_UNSIGNED_SHORT, ByteBuffer.wrap(indices));

        // 禁用位置句柄
        GLES20.glDisableVertexAttribArray(mPositionHandle);
    }

    private static int loadShader(int type, String shaderCode) {

        // 创建一个顶点着色器或片段着色器
        int shader = GLES20.glCreateShader(type);

        // 添加着色器源代码并编译它
        GLES20.glShaderSource(shader, shaderCode);
        GLES20.glCompileShader(shader);

        return shader;
    }
}

这是一个简单的OpenGL ES 2.0代码示例,用于在Android 11系统上显示立方体。请注意,此代码仅提供了一个基本的框架,您可以根据需要进行更改和扩展


原文地址: https://www.cveoy.top/t/topic/hrVz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录