»ùÓÚAndroidƽ̨µÄÎÆÀíÓ³Éä·ÖÎöÓëʵÏÖ _ÍøÂ繤³Ì±ÏÒµÂÛÎÄ
·¢²¼Ê±¼ä£º
2014-10-25
À´Ô´£º
ÈË´ó¾¼ÃÂÛ̳
ÕªÒª£ºÔÚ¼ÆËã»úͼÐÎѧÖУ¬ÎÆÀíÓ³Éä¾ÍÊÇʹÓÃͼÏñ¡¢º¯Êý»òÕßÆäËûÊý¾ÝÔ´À´¸Ä±äÎïÌå±íÃæÍâ¹Û¡£ÎÆÀíÓ³Éä¼¼ÊõÊǽü¼¸ÄêÀ´·¢Õ¹×î¿ìµÄ¼¼ÊõÖ®Ò»£¬¹ã·ºÓ¦ÓÃÓÚÈýάÕæʵ¸ÐͼÐεÄÉú³ÉÓëÏÔʾÖС£ÔËÓÃÎÆÀíÓ³Éä¿ÉÒÔ·½±ãµØÖÆ×÷Õæʵ¸ÐͼÐζø²»±Ø»¨¸ü¶àµÄʱ¼äÈ¥¿¼ÂÇÎïÌåµÄ±íÃæϸ½Ú¡£±¾ÎÄÔÚAndroidƽ̨ÖУ¬Í¨¹ý¶ÔÎÆÀíÓ³ÉäÔÀíµÄ·ÖÎö£¬ÀûÓÃOpengl ESͼÐοâʵÏÖÁËÎÆÀíÓ³ÉäЧ¹û¡£
¹Ø¼ü´Ê£ºÎÆÀíÓ³Éä;Opengl ES;Android
ÒýÑÔ
ÎÆÀíÓ³ÉäµÄ±¾ÖÊÊǶÔÈýάÎïÌå½øÐжþά²ÎÊý»¯£¬¼´ÏÈÇóµÃÈýάÎïÌå±í¶øÉÏÈÎÒ»µãµÄ¶þά(u£¬v)²ÎÊýÖµ£¬½ø¶øµÃµ½¸ÃµãµÄÎÆÀíÖµ£¬×îÖÕÉú³ÉÈýάͼÐαí¶øÉϵÄÎÆÀíͼ°¸¡£Ôڹ⻬Çú¶øÉÏÌí¼ÓÎÆÀíͼ°¸µÄºËÐÄÎÊÌâÊÇÓ³É䣬Òò´ËÎÆÀíÎÊÌâ¿ÉÒÔ¼ò»¯Îª´ÓÒ»¸ö×ø±êϵµ½ÁíÒ»¸ö×ø±êϵµÄ±ä»»¡£×ܵÄÀ´Ëµ£¬ÎÆÀíÓ³Éä¼¼ÊõÊÇÒ»ÖÖʹ½¨Á¢µÄ3DÄ£Ð͸ü½Ó½üÏÖʵÎïÌåµÄ¼¼Êõ¡£
1¡¢ÎÆÀíÓ³Éä»ù±¾ÔÀí
ÎÆÀíÉú³É¹ý³ÌʵÖÊÉÏÊǽ«Ëù¶¨ÒåµÄÎÆÀíÓ³ÉäΪ·´Ó³Ä³ÖÖÈýά¾°Îï±íÃæµÄÊôÐÔ(Óë¹âÕÕÃ÷Ä£Ðͼ°±íÃ漸ºÎÓйصĸ÷ÖÖ²ÎÊý£¬Èç±íÃæ·¨Ïò¡¢Âþ/¾µÃæ·´ÉäÂʵÈ)£¬²¢²ÎÓëºóÐøµÄ¹âÕÕÃ÷¼ÆËã¡£
¶þάÎÆÀíÓ³Éä¾ÍÊÇ´Ó¶þάÎÆÀíƽÃæµ½ÈýάÎïÌå±íÃæµÄÓ³Éä¡£Ò»°ã¶þάÎÆÀíƽÃæÊÇÓз¶Î§ÏÞÖƵÄ, ÔÚÕâ¸öƽÃæÇøÓòÄÚ£¬Ã¿µã¶¼¿ÉÓÃÊýѧº¯Êý±í´ï£¬´Ó¶ø¿ÉÒÔÀëÉ¢µÄ·ÖÀë³öÿµãµÄ»Ò¶ÈÖµºÍÑÕÉ«Öµ£¬Õâ¸öƽÃæÇøÓò³ÆΪÎÆÀí¿Õ¼ä£¬ Ò»°ã½«ÎÆÀí¿Õ¼äµÄƽÃæÇøÓò¶¨ÒåÔÚ[0,1]*[0,1]¡£ÎÆÀíÓ³ÉäÊÇÈ·¶¨ÎïÌå±íÃæÒ»µãPÔÚÎÆÀí¿Õ¼äÖеĶÔÓ¦µã(u,v)£¬´Ó¶øÎÆÀí¿Õ¼äÖеĵã(u,v)´¦µÄÎÆÀíÖµ¾ÍÊÇÎïÌå±íÃæµãPµÄÎÆÀíÊôÐÔ¡£½¨Á¢ÎÆÀí¿Õ¼äÓë¾°Îï¿Õ¼ä¼°¾°Îï¿Õ¼äÓëÆÁÄ»¿Õ¼äÖ®¼äµÄÓ³Éä¹Øϵ£º
ͼ1 ÎÆÀíÓ³Éä
¾°Îï±íÃæµÄÎÆÀíÊôÐÔÖ÷ÒªÓÐÒÔϼ¸ÖÖ£º
±íÃæÑÕÉ«£¬¼´±íÃæµÄÂþ·´ÉäÂÊ;¾µÃæ·´Éä·ÖÁ¿£¬¼´±íÃæµÄ¾µÃæ·´ÉäÂÊ;͸Ã÷¶È;±íÃæ·¨Ïò£¬¼´ÄÓ¶¯±íÃæ·¨ÏòÀ´²úÉú±íÃæµÄ°¼Í¹ÎÆÀí;»·¾³µÄÂþ·´ÉäºÍ¾µÃæ·´ÉäЧ¹û;¹âÔ´Ç¿¶ÈºÍÉ«²Ê·Ö²¼¡£
¸ù¾ÝÎÆÀí¶¨ÒåÓòµÄ²»Í¬£¬¿É·ÖΪ¶øΪ¶þάºÍÈýάÎÆÀí£¬ÓÉÓÚ±¾ÎÄÊÇ»ùÓÚAndroidƽ̨µÄ£¬¿¼Âǵ½Ð§ÂʺÍ×ÊÔ´ÎÊÌ⣬Ö÷Òª¸ø³öÁ˶þάÎÆÀíµÄÄ£ÐÍ£¬¶ÔÈýάÎÆÀíÓ³Éä¼¼Êõ¾Í²»ÔÙÌÖÂÛÁË¡£
2¡¢ÎÆÀíÓ³ÉäµÄʵÏÖ
±¾½Ú½«Í¨¹ýÔÚÒ»¸öÁ¢·½Ìå¸÷¸öÃæÌùÉÏͼƬÀ´½éÉÜAndroidƽ̨Ï»ùÓÚOpenGL ESµÄÎÆÀíÓ³ÉäÓйصÄÄÚÈÝ£º¶¨ÒåÎÆÀí¡¢¿ØÖÆÂ˲¨¡¢ËµÃ÷Ó³É䷽ʽ¡¢»æÖƳ¡¾°£¬¸ø³ö¶¥µãµÄÎÆÀí×ø±êºÍ¼¸ºÎ×ø±ê¡£
Ê×ÏÈ£¬ÎÒÃÇͨ¹ýAndroidƽ̨µÄOpenGL ES¿âÀ´´´½¨Ò»¸öÎÆÀí£¬²¢Ê¹ÓÃͼƬÀ´Éú³ÉÒ»¸öÎÆÀí£¬¹ý³ÌÈçÏ£º
IntBuffer intBuffer = IntBuffer.allocate(1);//´´½¨ÎÆÀí
gl.glGenTextures(1, intBuffer);//ÉèÖÃҪʹÓõÄÎÆÀí
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
º¯ÊýglGenTextures(int n, intBuffer textures)ÓÃÓÚ֪ͨOpenGLÎÒÃÇÏëÉú³ÉÒ»¸öÎÆÀíµÄÃû×Ö¡£º¯ÊýglBindTexture(int target, int texture)·½·¨ÓÃÓÚ֪ͨOpenGL½«ÎÆÀíÃû×Ötexture°ó¶¨µ½ÎÆÀíÄ¿±êÉÏ¡£
ÔÚAndroidÖÐÎÒÃÇʹÓÃGLUtilsÖеÄÒ»¸ö¾²Ì¬·½·¨texImage2D(int target, int level, Bitmap bitmap, int border)À´Éú³ÉÒ»¸öÎÆÀí¡£¹ý³ÌÈçÏ£º
//Éú³ÉÎÆÀí
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.mBitmap, 0)
ͨ¹ýÒÔÉϹý³Ì£¬ÎÒÃDZã³É¹¦µØ´´½¨ÁËÒ»¸öÎÆÀí¡£
ΪÁËÄÜÓиüºÃµÄЧ¹û£¬ÎÒÃÇ»¹ÐèÒªÉèÖÃÔÚOpenGLÏÖʵͼÏñʱ£¬Ëü·Å´óµÃ±ÈÔʼÎÆÀí´ó(GL_TEXTURE_MAG_FILTER)»òËõСµÃ±ÈÔʼÎÆÀíС(GL_TEXTURE_MIN_FILTER)ʱOpenGLËù²ÉÓõÄÂ˲¨·½Ê½¡£ÒÔϹý³ÌÊÇÎÒÃÇÉèÖõÄÏßÐÔÂ˲¨£º//ÉèÖÃÏßÐÔÂ˲¨
Gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
ÔÚandroidÖпÉÒÔʹÓÃglBindTexture(int target, int texture)·½·¨À´°ó¶¨ÎÆÀí¡£ÒÔϹý³Ì°ó¶¨ÁËÉÏÃæ´´½¨µÄÎÆÀí£ºGl.glBindTexture(GL10.GL_TEXTURE_COORD_ARRAY);//°ó¶¨ÎÆÀí
ÎÆÀíÐèҪʹÓÃglEnableClientState()·½·¨À´¿ªÆôÎÆÀí£ºGl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
ÓëÖ®¶ÔÓ¦µÄ£¬¹Ø±ÕÎÆÀí¹ý³ÌÈçÏ£º
Gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
ΪÁ˽«ÎÆÀíÕýÈ·µÄÓ³Éäµ½ËıßÐÎÉÏ£¬±ØÐ뽫ÎÆÀíµÄÓÒÉϽÇÓ³Éäµ½ËıßÐεÄÓÒÉϽǣ¬ÎÆÀíµÄ×óÉϽÇÓ³Éäµ½ËıßÐεÄ×óÉϽǣ¬ÎÆÀíµÄÓÒϽǺÍ×óϽÇÒàÊÇÈç´Ë¡£ÒòΪ£¬Èç¹ûÓ³Éä´íÎóµÄ»°£¬Í¼ÏñÏÔʾʱ¿ÉÄÜÉÏϵߵ¹£¬²àÏòÒ»±ß»òÕßʲô¶¼Ã»ÓС£ÏÂÃæÊÇÎÒÃǶÔÁ¢·½ÌåµÄÿһ¸öÃæËùÉèÖõÄÎÆÀíÓ³ÉäÊý¾Ý£º
IntBuffer texCoords = IntBuffer.wrap(new int[]
{
One,0.,0,0,0,one,one,one,
0,0,0,one,one,one,one,0,
One,one,one,0,0,0,0,one
0,one,one,one,one,0,0,0,
0,0,0,one,one,one,one,0,
One,0,0,0,0,one,one,one
});
ÉèÖúÃÕâЩӳÉäÊý¾ÝÖ®ºó£¬¿ÉÒÔͨ¹ýglTexCoordPointer½«ÎÆÀí°ó¶¨µ½Òª»æÖƵÄÎïÌåÉÏ¡£¹ý³ÌÈçÏ£º
Gl.glTextCoordPointer(2, GL10.GL_FIXED, 0, texCoords);
×îºó£¬½«Æä»æÖƵ½ÆÁÄ»Éϼ´¿É¡£Ð§¹ûͼ2ÈçͼËùʾ£º
ͼ2 ÎÆÀíÓ³ÉäЧ¹û
3¡¢½áÊøÓï
±¾ÎÄͨ¹ý¶ÔÎÆÀíÓ³ÉäµÄ»ù±¾ÔÀí½øÐÐÁË·ÖÎö£¬²¢ÔÚAndroidƽ̨ÖÐÀûÓÃOpengl ESͼÐοâ¶ÔÎÆÀíÓ³Éä¼¼Êõ½øÐÐÁËʵÏÖ¡£
ÓÉÓÚ±¾ÎÄÀûÓõÄÊÇAndroidÓ¦Óòã·â×°ºóµÄOpengl ESͼÐο⣬ÔÚЧÂÊÉÏÇ·¼Ñ£¬ÒÔºóµÄÖ÷Òª¹¤×÷ÊÇͨ¹ýAndroid NDK¶ÔOpengl ES½øÐÐÔÉú̬¿ª·¢£¬½ø¶øÌá¸ßʵÏÖЧÂÊ¡£
²Î¿¼ÎÄÏ×
[1]ÀîÔöÖÒ.ÎÆÀíÓ³Éä¼¼ÊõµÄÑо¿[D].ÖйúÓÅÐã˶ʿѧλÂÛÎÄÈ«ÎÄÊý¾Ý¿â,2005.
[2](ÃÀ)Shane Co.comnder.AndroidÒƶ¯Ó¦Óÿª·¢´ÓÈëÃŵ½¾«Í¨[M].±±¾©£ºÈËÃñÓʵç³ö°æÉç,2010.
[3]Ñî·áÊ¢.AndroidÓ¦Óÿª·¢½ÒÃØ[M].±±¾©:»úе¹¤Òµ³ö°æÉç,2010.