Advertisement
Guest User

drawModel()の説明

a guest
Jan 18th, 2014
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.66 KB | None | 0 0
  1. drawModel()で使われるバッファーはinitBuffersで初期化。
  2. (GL_ELEMENT_ARRAY_BUFFERのヒントがGL_STATIC_DRAWってヤバいかも?GL_DYNAMIC_DRAWにしてみてくれ)
  3. VMDMotionController(motioncontroller.cpp)もボーン行列を管理しています。
  4.  
  5. ボーン変形は頂点シェーダーで行われている(shaders/model.vertを参照)。シェーダーが遅くなる原因かもしれませんので注意。
  6.  
  7. さて、drawModel()の中身について。
  8.  
  9. まず、OpenGLは状態マシンですので、何か描く前に正しいVAOやバッファーをbindしないといけません:
  10. glBindVertexArray(VAOs[Vertices]);
  11. glBindBuffer(GL_ARRAY_BUFFER, Buffers[VertexArrayBuffer]);
  12. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, Buffers[VertexIndexBuffer]);
  13.  
  14. PMXモデルでは、頂点のリストや、その頂点のIDを参照する三角のリストがあります。頂点のリストはGL_ARRAY_BUFFERに読み込まれている。三角のリストはGL_ELEMENT_ARRAY.(ちなみにGL_ARRAY_BUFFERは頂点モーフのせいでフレーム毎に変わってきます。GL_ELEMENT_ARRAYは一回初期化したら変わることはありません。)
  15.  
  16. エッジを描くかどうかによって少しパラメーターを調整します:
  17. if(drawEdges)
  18. {
  19.     glDisable(GL_BLEND);
  20.     glCullFace(GL_FRONT);
  21.     glUniform1i(uniformVars[uIsEdge], 1);
  22.        
  23.         glDisable(GL_DEPTH_TEST);
  24. }
  25. else
  26. {        
  27.     glEnable(GL_BLEND);
  28.     glCullFace(GL_BACK);
  29.     glUniform1i(uniformVars[uIsEdge], 0);
  30.        
  31.     glEnable(GL_DEPTH_TEST);
  32.     glDepthFunc(GL_LEQUAL);
  33.     glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA);
  34. }
  35.  
  36. 今のPMXViewerではライティングが恥ずかしいほど基本的なものです。一つの、「遠い所からの光」があります。
  37. ちなみにハーフベクトルは、カメラの位置からカメラが目標にしている点までのベクトルです。
  38. glm::vec3 halfVector=glm::normalize(cameraPosition-cameraTarget);
  39. halfVector.z=-halfVector.z;
  40. GLuint halfVectorLoc=glGetUniformLocation(shaderProgram, "halfVector");
  41.    
  42. glm::vec3 lightDirection=glm::normalize(glm::vec3(0.3,1.0,2.0));
  43. GLuint lightDirectionLoc=glGetUniformLocation(shaderProgram, "lightDirection");
  44.  
  45. さて、描くする際には、材質毎に描く必要があります。材質によってテクスチャやライティング設定が変わってきますからね。
  46.  
  47. int faceCount=0;
  48. for(int m=0; m<pmxInfo->material_continuing_datasets; ++m)
  49. {
  50.  
  51. マテリアル毎に、テクスチャのindex、スフィアマッピング用のテクスチャ、トゥーンシェーディング用のテクスチャがあります。これをシェーダーにうpします。(ちなみにトゥーンシェーディングやスフィアマッピングは未完成です:
  52. glActiveTexture(GL_TEXTURE0);
  53. glBindTexture(GL_TEXTURE_2D,textures[pmxInfo->materials[m]->textureIndex]);
  54. glUniform1iARB(uniformVars[uTextureSampler], 0);
  55. //…などなど
  56.  
  57. 次は、材質のライティングパラメータをうpします:
  58. glUniform3fv(uniformVars[uAmbient],1,(GLfloat*)&pmxInfo->materials[m]->ambient);
  59. glUniform4fv(uniformVars[uDiffuse],1,(GLfloat*)&pmxInfo->materials[m]->diffuse);
  60. glUniform3fv(uniformVars[uSpecular],1,(GLfloat*)&pmxInfo->materials[m]->specular);
  61. //…などなど
  62.  
  63. 最後に、その材質のある三角(頂点)*だけ*を描きます。(そしたらforループの最初に戻って次の材質に変えてまた描きます):
  64. glDrawElements(GL_TRIANGLES, (pmxInfo->materials[m]->hasFaceNum), GL_UNSIGNED_INT, BUFFER_OFFSET(sizeof(GLuint)*faceCount));
  65. faceCount+=pmxInfo->materials[m]->hasFaceNum;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement