如果不使用纹理平移进行绘制,可以考虑使用顶点坐标变换的方式来实现。
以下是一个示例代码,使用OpenGL ES来绘制一个矩形,不使用纹理平移进行绘制:
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 float[] mProjectionMatrix = new float[16];
private float[] mViewMatrix = new float[16];
private float[] mMVPMatrix = new float[16];
private float[] mVertices = {
-0.5f, 0.5f, 0.0f, // top left
-0.5f, -0.5f, 0.0f, // bottom left
0.5f, -0.5f, 0.0f, // bottom right
0.5f, 0.5f, 0.0f // top right
};
private short[] mIndices = {
0, 1, 2, // triangle 1
0, 2, 3 // triangle 2
};
private int mProgram;
private int mPositionHandle;
private int mMVPMatrixHandle;
@Override
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
// 编译顶点着色器
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);
// 创建可执行的OpenGL ES程序
GLES20.glLinkProgram(mProgram);
// 获取顶点着色器中的位置句柄
mPositionHandle = GLES20.glGetAttribLocation(mProgram,
"vPosition");
// 获取变换矩阵的句柄
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram,
"uMVPMatrix");
}
@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1);
}
@Override
public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
GLES20.glUseProgram(mProgram);
// 设置相机的位置
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
// 创建一个旋转矩阵
float[] rotationMatrix = new float[16];
Matrix.setRotateM(rotationMatrix, 0, angle, 0, 0, -1.0f);
// 将顶点坐标和旋转矩阵相乘
float[] rotatedVertices = new float[mVertices.length];
Matrix.multiplyMV(rotatedVertices, 0, rotationMatrix, 0, mVertices, 0);
// 将投影矩阵和相机视图矩阵相乘
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
// 将顶点坐标传递给渲染器
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false,
vertexStride, vertexBuffer);