上篇对glViewPort的实现可见一斑。但是并没有提及其中的思路所在。本篇主要是简短地介绍一下WGL的实现思路。
由于OpenGL是一个状态机,既然是状态机,那么肯定有一系列的状态需要保存。OpenGL的状态对应的是功能的实现。我们这个简单的OpenGL不需要大而全的功能,那么需要哪些功能呢?
1.绘制一个立方体或者长方体。
2.长方体或者立方体可以旋转
3.用上面的长方体代表太阳,地球,月亮。模拟其运行周期。
好吧,就上面三个功能。那么说我们上面的三个功能需要保存哪些状态呢?其实就以下三个状态就够了:
1. 矩阵管理
2. 颜色管理
3. 绘制线框
这么简单!
好吧,那么就定义几个变量吧!
1.矩阵管理
矩阵管理,那么就必须有矩阵,那么我的矩阵是这样的:
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.simulateopengl;
import java.nio.FloatBuffer;
import android.util.Log;
/**
*
* A 4x4 float matrix
*
*/
public class M4 {
public float[][] m = new float[4][4];
public M4() {
this.setIdentity();
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
M4 other = new M4();
for(int i = 0; i < 4; ++ i){
for(int j = 0; j < 4; ++ j){
other.m[i][j] = m[i][j];
}
}
return other;
}
public M4(M4 other) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
m[i][j] = other.m[i][j];
}
}
}
public void project(GLVertex src, GLVertex dest) {
GLVertex srcCopy = new GLVertex(src.x, src.y, src.z, src.w);
dest.x = (float)(srcCopy.x * m[0][0] + srcCopy.y * m[0][1] + srcCopy.z * m[0][2] + m[0][3]*srcCopy.w);
dest.y = (float)(srcCopy.x * m[1][0] + srcCopy.y * m[1][1] + srcCopy.z * m[1][2] + m[1][3]*srcCopy.w);
dest.z = (float)(srcCopy.x * m[2][0] + srcCopy.y * m[2][1] + srcCopy.z * m[2][2] + m[2][3]*srcCopy.w);
dest.w = (float)(srcCopy.x * m[3][0] + srcCopy.y * m[3][1] + srcCopy.z * m[3][2] + m[3][3]*srcCopy.w);
}
public static