Nanashi-soft○プログラマ専用○AndroidでOpenGL ES 2.0プログラミング○
//頂点シェーダー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を追加します
//フラグメントシェーダーGLSL const char *GLSL_FS= "varying mediump vec4 vercol;\n" "void main(){\n" " gl_FragColor=vercol;\n" "}\n";vercolを受け取って,それをそのまま gl_FragColor=vercolして,描画します
//ポリゴン頂点構造体 struct Vertex3D { float pos[3]; //x-y-z float col[4]; //r-g-b-a };頂点シェーダー内の変数 colを追加します
//頂点データを頂点シェーダーに設定 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]);構造体にカラーデータをセットします
//カラーデータを取得 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と全く同じことです('-'*)