[コード例はfor1.7.10]GLlistを利用した描画軽量化と、反射光有効化[備忘録その2]

frou01
ID: 5KJZ8DOS6Y
記事: 71
登録日時: 2019年7月03日(水) 19:16
Minecraft ID: frou01
いいね: 1回
いいねされた回数: 9回

[コード例はfor1.7.10]GLlistを利用した描画軽量化と、反射光有効化[備忘録その2]

投稿記事 by frou01 » 2019年12月28日(土) 23:40

おそらく16*16*16のチャンクごとに描画情報をキャッシュするとか始めた頃からマインクラフトバニラではずっと取られている手法に付いて、5行で解説しておきます
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);
				}
0


HMG:EX,GVC:HDどうです?ゲリラのニューモデルです。鬼畜でしょう?んああ仰らないで。全く外歩けない程弾が飛び交ってます。でも弱体化なんてネタは減るし、楽しさも無くなってろくな事はない。(HMGのパックを入れれば)バリエーションもたっぷりありますよ、どんな鬼畜好きの方でも大丈夫。どうぞ入れてみて下さい、いい銃声でしょう。余裕の弾幕だ、発射レートが違いますよ
twitter:Lt.frou01@frou_0