初学OpenGL让我最麻烦的一件事情就是,一个正方体,要输入下面这么多顶点。
squareMesh.setVertices(new float[] {
// Front face:
0.5f, 1.0f, -6.0f, Color.toFloatBits(0f, 0f, 1f, 1f), // TL
0.5f, -1.0f, -6.0f, Color.toFloatBits(0f, 0f, 1f, 1f), // BL
2.5f, -1.0f, -6.0f, Color.toFloatBits(0f, 0f, 1f, 1f), // BR
2.5f, 1.0f, -6.0f, Color.toFloatBits(0f, 0f, 1f, 1f), // TR
// Top face:
0.5f, 1.0f, -8.0f, Color.toFloatBits(1f, 0f, 1f, 1f), // LR
0.5f, 1.0f, -6.0f, Color.toFloatBits(1f, 0f, 1f, 1f), // LN
2.5f, 1.0f, -6.0f, Color.toFloatBits(1f, 0f, 1f, 1f), // RN
2.5f, 1.0f, -8.0f, Color.toFloatBits(1f, 0f, 1f, 1f), // RR
// Rear face
2.5f, 1.0f, -8.0f, Color.toFloatBits(0f, 1f, 0f, 1f), // TR
2.5f, -1.0f, -8.0f, Color.toFloatBits(0f, 1f, 0f, 1f), // BR
0.5f, -1.0f, -8.0f, Color.toFloatBits(0f, 1f, 0f, 1f), // BL
0.5f, 1.0f, -8.0f, Color.toFloatBits(0f, 1f, 0f, 1f), // TL
// Bottom face
0.5f, -1.0f, -6.0f, Color.toFloatBits(0.5f, 0.5f, 0.5f, 1f), // LN
2.5f, -1.0f, -6.0f, Color.toFloatBits(0.5f, 0.5f, 0.5f, 1f), // RN
2.5f, -1.0f, -8.0f, Color.toFloatBits(0.5f, 0.5f, 0.5f, 1f), // RR
0.5f, -1.0f, -8.0f, Color.toFloatBits(0.5f, 0.5f, 0.5f, 1f), // LR
// Left face
0.5f, 1.0f, -8.0f, Color.toFloatBits(1f, 1f, 0f, 1f), // TR
0.5f, 1.0f, -6.0f, Color.toFloatBits(1f, 1f, 0f, 1f), // TN
0.5f, -1.0f, -6.0f, Color.toFloatBits(1f, 1f, 0f, 1f), // BN
0.5f, -1.0f, -8.0f, Color.toFloatBits(1f, 1f, 0f, 1f), // BR
// Right face
2.5f, 1.0f, -6.0f, Color.toFloatBits(0f, 1f, 1f, 1f), // TN
2.5f, 1.0f, -8.0f, Color.toFloatBits(0f, 1f, 1f, 1f), // TR
2.5f, -1.0f, -8.0f, Color.toFloatBits(0f, 1f, 1f, 1f), // BR
2.5f, -1.0f, -6.0f, Color.toFloatBits(0f, 1f, 1f, 1f), // BN
});
今天就来说说方便的办法,连同Blend的方法一并发出来:
package com.kyugao.screen;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g3d.loaders.ModelLoaderRegistry;
import com.badlogic.gdx.graphics.g3d.model.still.StillModel;
public class Blend implements Screen, InputProcessor {
private PerspectiveCamera camera;
private Texture texture;
private float rquad = 0;
// indicator of light and blend
private boolean blend;
private StillModel model;
@Override
public void render(float delta) {
camera.update();
camera.apply(Gdx.graphics.getGL10());
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
Gdx.gl.glEnable(GL10.GL_TEXTURE_2D);
Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);
drawGLScene();
rquad += 20f * delta; // 每秒钟转20度,计算在每一次render的时间差里,要转的角度。比如0.5秒,那就应该转10度。
rquad %= 360;
}
private boolean drawGLScene() {
Gdx.gl10.glLoadIdentity();
Gdx.gl10.glTranslatef(0.0f, 0.0f, -7.0f);
Gdx.gl10.glRotatef(rquad, 1.0f, 1.0f, 1.0f);
texture.bind();
model.render();
return true;
}
@Override
public void show() {
FileHandle modelFile = Gdx.files.internal("g3d/cube.obj");
model = ModelLoaderRegistry.loadStillModel(modelFile);
texture = new Texture(Gdx.files.internal("data/textureglass.png"));
Gdx.input.setInputProcessor(this);
}
@Override
public void hide() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
}
@Override
public void resize(int width, int height) {
float aspectRatio = (float) width / (float) height;
camera = new PerspectiveCamera(45, 2f * aspectRatio, 2f);
}
@Override
public boolean keyDown(int keycode) {
if (keycode == Input.Keys.B) {
System.out.println("B down");
blend = !blend;
if (blend) {
Gdx.gl.glEnable(GL10.GL_BLEND);
Gdx.gl.glDisable(GL10.GL_DEPTH_TEST);
} else {
Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
Gdx.gl.glDisable(GL10.GL_BLEND);
}
}
return false;
}
@Override
public boolean keyUp(int keycode) {
return false;
}
@Override
public boolean keyTyped(char character) {
return false;
}
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
return false;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
return false;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
return false;
}
@Override
public boolean mouseMoved(int screenX, int screenY) {
return false;
}
@Override
public boolean scrolled(int amount) {
return false;
}
}
效果如下: