Nanashi-softプログラマ専用AndroidでOpenGL ES 2.0プログラミング


◇AndroidでOpenGL ES 2.0プログラミング -pmdデータを表示する(2-

カラーデータをシェーダーに送れるようにします
これも,DirectX11でやったときと同じ考え方でできます

まず,頂点シェーダーにカラーデータを通過させる場所を作ります
//頂点シェーダーGLSL
const char *GLSL_VS=
"attribute vec4 pos;\n"
"attribute vec4 col;\n"
"uniform mat4 World;\n"
"uniform mat4 View;\n"
"uniform mat4 Projection;\n"
"varying vec4 vercol;\n"
"void main(){\n"
" gl_Position=World*pos;\n"
" gl_Position=View*gl_Position;\n"
" gl_Position=Projection*gl_Position;\n"
" vercol=col;\n"
"}\n";
attributeがメインプログラムからデータを流し込む方で,colを追加します
varyingがフラグメントシェーダーに送られる側で,vercolを追加します
main関数中で,vercol=colして,何もせずにカラーパレットをバイパスします

次に,フラグメントシェーダーでそれを受け取って描画するようにします
//フラグメントシェーダーGLSL
const char *GLSL_FS=
"varying mediump vec4 vercol;\n"
"void main(){\n"
" gl_FragColor=vercol;\n"
"}\n";
vercolを受け取って,それをそのまま gl_FragColor=vercolして,描画します
今回はとりあえず,色を指定通りに付ける事にします

メインプログラムの,シェーダーにデータを送るインターフェースを書き換えます
構造体に colを追加
//ポリゴン頂点構造体
struct Vertex3D {
	float pos[3];	//x-y-z
	float col[4];	//r-g-b-a
};
頂点シェーダー内の変数 colを追加します
それだけではダメで,glVertexAttribPointerを変更した構造体に合わせて記述し直します
	//頂点データを頂点シェーダーに設定
	GLuint vs_pos=glGetAttribLocation(shaderProgram, "pos");
	glEnableVertexAttribArray(vs_pos);
	//5番目の値は,1データのサイズで,その単位でシェーダーで読み取る
	glVertexAttribPointer(vs_pos, 3, GL_FLOAT, GL_FALSE, sizeof(float)*7, &hVectorData[0].pos[0]);

	//マテリアルデータを頂点シェーダーに設定
	GLuint vs_col=glGetAttribLocation(shaderProgram, "col");
	glEnableVertexAttribArray(vs_col);
	glVertexAttribPointer(vs_col, 4, GL_FLOAT, GL_FALSE, sizeof(float)*7, &hVectorData[0].col[0]);
構造体にカラーデータをセットします
pmdファイル読み込みの,インデックスデータのすぐ後に追加します
	//カラーデータを取得
	int COLORSU = modeldata->material_count;

	int cnt_idx = 0;	//インデックスカウンター
	for(int i=0; i < COLORSU; i++){
		//マテリアルにあるカウンター分回す
		for(int j=0; j < modeldata->material[i].face_vert_count; j++){
			//インデックスから頂点座標の行数を取り出す
			int pos_vec = modeldata->face_vert_index[cnt_idx];
			cnt_idx++;	//インデックスカウンターを進める
			
			//その頂点座標のカラーが現在のマテリアルカラー
			hVectorData[pos_vec].col[0] = modeldata->material[i].diffuse_color[0];	//R
			hVectorData[pos_vec].col[1] = modeldata->material[i].diffuse_color[1];	//G
			hVectorData[pos_vec].col[2] = modeldata->material[i].diffuse_color[2];	//B
			hVectorData[pos_vec].col[3] = modeldata->material[i].alpha;	//A
		}
	}
基本的に,やっていることは DirectX11と全く同じことです('-'*)
実行してみると色が付きます

……が,何かおかしいです
恐らくZバッファがおかしいです。そもそも設定していませんから


TOPプログラマ 専用AndroidでOpenGL ES 2.0プログラミング

Melonbooks DL