1:this.displayList = GLAllocation.generateDisplayLists(1);//キャッシュする場所を作り、IDを保存します。
2:GL11.glNewList(this.displayList, GL11.GL_COMPILE);//確保した場所に書き込む準備
3:~ここでモデルを描画するなりします~
4:GL11.glEndList();//保存します。
5:GL11.glCallList(this.displayList);//保存したモデルを呼び出します。
以上です。いちいち頂点情報をTessellatorでGLに流すより遥かに高速になります。
次にライティングですが、コレは見事にマイクラの世界から浮くため、一応そのつもりで。機械とか向けですね。
コード: 全て選択
//ライティングの前にマテリアルを準備します。
//メンバに数値を代入した上でsetUp()を呼んでください。そのあたりの処理は割愛。
float dif;
float amb;
float emi;
float spc;
float power;
FloatBuffer dif_Buf;
FloatBuffer amb_Buf;
FloatBuffer emi_Buf;
FloatBuffer spc_Buf;
FloatBuffer power_Buf;
public void setUp(){
dif_Buf = GLAllocation.createDirectFloatBuffer(16).put(new float[]{dif,dif,dif,dif});
amb_Buf = GLAllocation.createDirectFloatBuffer(16).put(new float[]{amb,amb,amb,amb});
emi_Buf = GLAllocation.createDirectFloatBuffer(16).put(new float[]{emi,emi,emi,emi});
spc_Buf = GLAllocation.createDirectFloatBuffer(16).put(new float[]{spc,spc,spc,spc});
dif_Buf.flip();
amb_Buf.flip();
emi_Buf.flip();
spc_Buf.flip();
power_Buf = GLAllocation.createDirectFloatBuffer(16).put(new float[]{power,power,power,power});
power_Buf.flip();
}
//以下renderHelperからのコピペ。なんでprivateにしちゃうんですかね?
private static FloatBuffer colorBuffer = GLAllocation.createDirectFloatBuffer(16);
public static FloatBuffer setColorBuffer(double p_74517_0_, double p_74517_2_, double p_74517_4_, double p_74517_6_)
{
/**
* Update and return colorBuffer with the RGBA values passed as arguments
*/
return setColorBuffer((float)p_74517_0_, (float)p_74517_2_, (float)p_74517_4_, (float)p_74517_6_);
}
public static FloatBuffer setColorBuffer(float p_74521_0_, float p_74521_1_, float p_74521_2_, float p_74521_3_)
{
colorBuffer.clear();
colorBuffer.put(p_74521_0_).put(p_74521_1_).put(p_74521_2_).put(p_74521_3_);
colorBuffer.flip();
/** Float buffer used to set OpenGL material colors */
return colorBuffer;
}
public static FloatBuffer setColorBuffer(float p_74521_0_)
{
colorBuffer.clear();
colorBuffer.put(p_74521_0_).put(p_74521_0_).put(p_74521_0_).put(p_74521_0_);
/** Float buffer used to set OpenGL material colors */
return colorBuffer;
}
コード: 全て選択
{
//まず反射光を含んだライトを作ります。拡散光は二方向、反射光は一方向にします。
GL11.glLight(GL11.GL_LIGHT1, GL11.GL_SPECULAR, setColorBuffer(1, 1, 1, 1));//反射
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, setColorBuffer(0, 0, 0, 1));
GL11.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, setColorBuffer(0.4F, 0.4F, 0.4F, 1.0F));//拡散
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, setColorBuffer(0.6F, 0.6F, 0.6F, 1.0F));
GL11.glLightModel(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, setColorBuffer(0.4f, 0.4f, 0.4f, 1.0F));
GL11.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, setColorBuffer(0.4f, 0.4f, 0.4f, 1.0F));
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);//コレが最重要、反射光をテクスチャ色から分離します。こうしないと若干明るい箇所があるだけになってしまいます。
//currentMaterialは上のヤツです。
GL11.glMaterial(GL_FRONT_AND_BACK, GL11.GL_DIFFUSE, currentMaterial.dif_Buf);
GL11.glMaterial(GL_FRONT_AND_BACK, GL11.GL_AMBIENT, currentMaterial.amb_Buf);
GL11.glMaterial(GL_FRONT_AND_BACK, GL11.GL_SPECULAR, currentMaterial.spc_Buf);
GL11.glMaterial(GL_FRONT_AND_BACK, GL11.GL_EMISSION, currentMaterial.emi_Buf);
GL11.glMaterialf(GL_FRONT_AND_BACK, GL11.GL_SHININESS, currentMaterial.power);
GL11.glEnable(GL11.GL_COLOR_MATERIAL);
}
~ここで描画します~
{
//ここから先はマイクラデフォルトに戻すだけ
GL11.glLight(GL11.GL_LIGHT1, GL11.GL_SPECULAR, setColorBuffer(0, 0, 0, 1));
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, setColorBuffer(0, 0, 0, 1));
GL11.glLightModel(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, setColorBuffer(0, 0, 0, 1.0F));
GL11.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, setColorBuffer(0.4f, 0.4f, 0.4f, 1.0F));
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
GL11.glMaterial(GL_FRONT_AND_BACK, GL11.GL_DIFFUSE, setColorBuffer(0.2, 0.2, 0.2, 1f));
GL11.glMaterial(GL_FRONT_AND_BACK, GL11.GL_AMBIENT, setColorBuffer(0.8, 0.8, 0.8, 1f));
GL11.glMaterial(GL_FRONT_AND_BACK, GL11.GL_SPECULAR, setColorBuffer(0, 0, 0, 1f));
GL11.glMaterial(GL_FRONT_AND_BACK, GL11.GL_EMISSION, setColorBuffer(0, 0, 0, 1f));
GL11.glMaterialf(GL_FRONT_AND_BACK, GL11.GL_SHININESS, 0);
}