{"id":3884,"date":"2018-03-21T21:47:49","date_gmt":"2018-03-21T13:47:49","guid":{"rendered":"http:\/\/www.bookcard.net\/wordpress\/?p=3884"},"modified":"2018-10-14T21:21:50","modified_gmt":"2018-10-14T13:21:50","slug":"opengl_multitexture","status":"publish","type":"post","link":"https:\/\/www.bookcard.net\/wordpress\/opengl_multitexture\/","title":{"rendered":"OpenGL\u4e4b\u591a\u7d0b\u7406\u6620\u5c04"},"content":{"rendered":"<figure id=\"attachment_3885\" aria-describedby=\"caption-attachment-3885\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGL_Multitexture.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3885\" src=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGL_Multitexture.jpg\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGL_Multitexture.jpg 1024w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGL_Multitexture-300x225.jpg 300w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGL_Multitexture-768x576.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-3885\" class=\"wp-caption-text\">OpenGL\u4e4b\u591a\u7d0b\u7406\u6620\u5c04<\/figcaption><\/figure>\n<p>OpenGL\u53ef\u540c\u6642\u5c0d\u591a\u908a\u5f62\u6620\u5c04\u591a\u500b\u7d0b\u7406,\u7a31\u70ba\u300e\u591a\u7d0b\u7406\u6620\u5c04\u300f. \u5b83\u662fOpenGL\u7684\u53ef\u9078\u64f4\u5c55\u5be6\u73fe,\u4e26\u975e\u6240\u6709\u7684OpenGL\u90fd\u6709\u5be6\u73fe.\u300eOpenGL API\u7684\u6240\u6709\u64f4\u5c55\u5fc5\u9808\u5f97\u5230ARB(OpenGL\u9ad4\u7cfb\u8a55\u5be9\u59d4\u54e1\u6703)\u7684\u8a8d\u53ef\u300f,\u5728\u9032\u884c\u591a\u7d0b\u7406\u6620\u5c04\u6642,\u6bcf\u500b\u7d0b\u7406\u55ae\u5143\u90fd\u5c07\u6620\u5c04\u7d50\u679c\u50b3\u905e\u7d66\u4e0b\u500b\u7d0b\u7406\u55ae\u5143,\u76f4\u81f3\u6240\u6709\u7684\u7d0b\u7406\u7684\u7d0b\u7406\u55ae\u5143\u90fd\u9032\u884c\u6620\u5c04(\u6700\u7d42\u7d50\u679c)\u6f14\u793a\u7a0b\u5f0f:<a href=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGLMultitexture.zip\">\u4e0b\u8f7d<\/a><\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"553\">\u591a\u7d0b\u7406\u6620\u5c04\u5206\u70ba\u56db\u500b\u6b65\u9a5f:<\/td>\n<\/tr>\n<tr>\n<td width=\"553\">1.\u5224\u65b7\u662f\u5426\u652f\u6301\u300e\u591a\u7d0b\u7406\u6620\u5c04\u300f<\/td>\n<\/tr>\n<tr>\n<td width=\"553\">2.\u8b80\u53d6\u64f4\u5c55\u51fd\u5f0f\u7684\u6307\u91dd<\/td>\n<\/tr>\n<tr>\n<td width=\"553\">3.\u5efa\u7acb\u7d0b\u7406\u55ae\u5143<\/td>\n<\/tr>\n<tr>\n<td width=\"553\">4.\u8a2d\u7f6e\u7d0b\u7406\u5750\u6a19<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5b9a\u7fa9\u591a\u7d0b\u7406\u6620\u5c04\u7d50\u69cb<\/p>\n<p>typedef struct MULTITEXTURE_TYP {<\/p>\n<p><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_texture\/\">TEXTURE<\/a> texture0;<\/p>\n<p><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_texture\/\">TEXTURE<\/a> texture1;<\/p>\n<p>}MULTITEXTURE,*MULTITEXTURE_PTR;<\/p>\n<p>1.\u9a57\u8b49\u7576\u524d\u7248\u672c\u7684OpenGL\u662f\u5426\u652f\u6301\u300e\u591a\u7d0b\u7406\u6620\u5c04\u300f<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"277\">\u51fd\u5f0f<\/td>\n<td width=\"277\">\u7c21\u4ecb<\/td>\n<\/tr>\n<tr>\n<td width=\"277\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_version\/\">glGetString(GL_EXTENSIONS)<\/a><\/td>\n<td width=\"277\">\u7372\u53d6OpenGL\u6240\u652f\u6301\u7684\u6240\u6709\u64f4\u5c55\u51fd\u5f0f<\/p>\n<p>\u8fd4\u56de\u4ee5\u7a7a\u683c\u9694\u958b\u7684\u5b57\u7b26\u4e32\u5217\u8868<\/td>\n<\/tr>\n<tr>\n<td width=\"277\">GL_ARB_multitexture<\/td>\n<td width=\"277\">\u67e5\u627e\uff08GL_ARB_multitexture\uff09\u5224\u65b7\u662f\u5426\u652f\u6301\u300e\u591a\u7d0b\u7406\u6620\u5c04\u300f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5224\u65b7\u662f\u5426\u652f\u6301\u67d0\u4e00\u64f4\u5c55\u51fd\u5f0f<\/p>\n<p>bool Extensions_OpenGL(const char * name)<\/p>\n<p>{<\/p>\n<p>char * extensions;<\/p>\n<p>int index = 0;<\/p>\n<p>int length,n;<\/p>\n<p><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_version\/\">extensions = (char*)glGetString(GL_EXTENSIONS);<\/a>\/\/ \u64f4\u5c55\u51fd\u5f0f<\/p>\n<p>length = strlen(name);\/\/ \u9577\u5ea6<\/p>\n<p>while (extensions[index] != NULL)\/\/ \u5faa\u74b0\u67e5\u627e<\/p>\n<p>{<\/p>\n<p>n = strcspn(extensions + index, &#8221; &#8220;);\/\/ \u67e5\u627e\u7a7a\u683c<\/p>\n<p>if (n == length &amp;&amp; strncmp(extensions + index, name, length) == 0)\/\/ \u6bd4\u8f03<\/p>\n<p>return true;<\/p>\n<p>index = index + n + 1; \/\/ \u8df3\u904e\u7a7a\u683c<\/p>\n<p>}<\/p>\n<p>return false;<\/p>\n<p>}<\/p>\n<p>2.\u8b80\u53d6\u64f4\u5c55\u51fd\u5f0f\u7684\u6307\u91dd<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"277\">\u51fd\u5f0f<\/td>\n<td width=\"277\">\u7c21\u4ecb<\/td>\n<\/tr>\n<tr>\n<td width=\"277\">PROC wglGetProcAddress(LPCSTR lpszProc);<\/td>\n<td width=\"277\">\u8fd4\u56de\u64f4\u5c55\u51fd\u5f0f\u7684\u5730\u5740<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"277\">\u64f4\u5c55\u51fd\u5f0f\u5b9a\u7fa9<\/td>\n<td width=\"277\">\u7c21\u4ecb<\/td>\n<\/tr>\n<tr>\n<td width=\"277\">typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);<\/td>\n<td width=\"277\">\u70ba\u591a\u7d0b\u7406\u6620\u5c04\u8a2d\u7f6e\u7d0b\u7406\u5ea7\u6a19<\/td>\n<\/tr>\n<tr>\n<td width=\"277\">typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture);<\/td>\n<td width=\"277\">\u8a2d\u7f6e\u7576\u524d\u7684\u7d0b\u7406\u55ae\u5143<\/td>\n<\/tr>\n<tr>\n<td width=\"277\">typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);<\/td>\n<td width=\"277\">\u8a2d\u7f6e\u9078\u64c7\u7576\u524d\u7684\u7d0b\u7406\u55ae\u4f4d,\u4ee5\u4fbf\u7528\u9802\u9ede\u6578\u7d44\u6307\u5b9a\u7d0b\u7406\u5750\u6a19\u6578\u64da<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u521d\u6b64\u5316\u591a\u7d0b\u7406\u6620\u5c04<\/p>\n<p>PFNGLMULTITEXCOORD2FARBPROC\u00a0\u00a0\u00a0\u00a0 glMultiTexCoord2fARB;<\/p>\n<p>PFNGLACTIVETEXTUREARBPROC\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 glActiveTextureARB;<\/p>\n<p>PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;<\/p>\n<p>void Init_Multitexture()<\/p>\n<p>{\/\/ \u5224\u65b7\u662f\u5426\u652f\u6301\u67d0\u4e00\u64f4\u5c55\u51fd\u5f0f<\/p>\n<p>if( Extensions_OpenGL(&#8220;GL_ARB_multitexture&#8221;) )<\/p>\n<p>{<\/p>\n<p>glMultiTexCoord2fARB=(PFNGLMULTITEXCOORD2FARBPROC)wglGetProcAddress(&#8220;glMultiTexCoord2fARB&#8221;);<\/p>\n<p>glActiveTextureARB=(PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress(&#8220;glActiveTextureARB&#8221;);<\/p>\n<p>glClientActiveTextureARB=(PFNGLCLIENTACTIVETEXTUREARBPROC)wglGetProcAddress(&#8220;glClientActiveTextureARB&#8221;);<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>3.\u5efa\u7acb\u7d0b\u7406\u55ae\u5143<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"312\">\u8f09\u5165\u7d0b\u7406\u4e26\u7d81\u5b9a<\/td>\n<td width=\"242\">\u7c21\u4ecb<\/td>\n<\/tr>\n<tr>\n<td width=\"312\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_read_bitmap_file\/\">\u300e.bmp\u300f<\/a> <a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_read_targa_file\/\">\u300e.tga\u300f<\/a> <a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_read_pcx_file\/\">\u300e.pcx\u300f<\/a><\/td>\n<td width=\"242\">\u8f09\u5165\u7d0b\u7406\u6587\u4ef6<\/td>\n<\/tr>\n<tr>\n<td width=\"312\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_texture\/\">glGenTextures(1, &amp;texture-&gt;ID);<\/a><\/p>\n<p><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_texture\/\">glBindTexture(GL_TEXTURE_2D, texture-&gt;ID);<\/a><\/td>\n<td width=\"242\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_texture\/\">\u751f\u6210\u7d0b\u7406\u55ae\u5143\u7d81\u5b9a\u7d0b\u7406<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6fc0\u6d3b\u591a\u7d0b\u7406\u6620\u5c04<\/p>\n<p>void Active_Multitexture(MULTITEXTURE_PTR multitexture)<\/p>\n<p>{<\/p>\n<p>glActiveTextureARB(GL_TEXTURE0_ARB);<\/p>\n<p>glEnable(GL_TEXTURE_2D);<\/p>\n<p>glBindTexture(GL_TEXTURE_2D, multitexture-&gt;texture0.ID);\/\/ \u7d81\u5b9a\u7d0b\u7406<\/p>\n<p>glActiveTextureARB(GL_TEXTURE1_ARB);<\/p>\n<p>glEnable(GL_TEXTURE_2D);<\/p>\n<p>glBindTexture(GL_TEXTURE_2D, multitexture-&gt;texture1.ID);\/\/ \u7d81\u5b9a\u7d0b\u7406<\/p>\n<p>}<\/p>\n<p>OpenGL\u6700\u591a\u652f\u630132\u500b\u7d0b\u7406\u300eGL_TEXTURE0_ARB\u300f~\u300eGL_TEXTURE31_ARB\u300f<\/p>\n<p>\u4f46\u6700\u5f8c\u901a\u904e\u67e5\u8a62\u7576\u524d\u7248\u672c\u652f\u6301\u7684\u6700\u5927\u55ae\u5143\u91cf<\/p>\n<p>int maxTexUnits;<\/p>\n<p>glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB,&amp;maxTexUnits);<\/p>\n<p>&nbsp;<\/p>\n<p>4.\u8a2d\u7f6e\u7d0b\u7406\u5750\u6a19<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"397\">&nbsp;<\/td>\n<td width=\"156\">\u7c21\u4ecb<\/td>\n<\/tr>\n<tr>\n<td width=\"397\">void glMultiTexCoord2fARB(GLenum texUnit,float coords);<\/td>\n<td width=\"156\">\u8a2d\u7f6e\u7d0b\u7406\u5750\u6a19<\/td>\n<\/tr>\n<tr>\n<td width=\"397\">texUnit: GL_TEXTURE0_ARB~GL_TEXTURE31_ARB<\/td>\n<td width=\"156\">\u7d0b\u7406\u55ae\u5143\u7d22\u5f15<\/td>\n<\/tr>\n<tr>\n<td width=\"397\">Coords:<\/td>\n<td width=\"156\">\u7d0b\u7406\u5750\u6a19<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>OpenGL\u53ef\u540c\u6642\u5c0d\u591a\u908a\u5f62\u6620\u5c04\u591a\u500b\u7d0b\u7406,\u7a31\u70ba\u300e\u591a\u7d0b\u7406\u6620\u5c04\u300f. \u5b83\u662fOpenGL\u7684\u53ef\u9078\u64f4\u5c55\u5be6\u73fe,\u4e26\u975e\u6240\u6709\u7684Ope &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_multitexture\/\" class=\"more-link\">\u7e7c\u7e8c\u95b1\u8b80 <span class=\"screen-reader-text\">OpenGL\u4e4b\u591a\u7d0b\u7406\u6620\u5c04<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[62],"tags":[50],"class_list":["post-3884","post","type-post","status-publish","format-standard","hentry","category-opengl","tag-opengl","entry"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/3884","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/comments?post=3884"}],"version-history":[{"count":3,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/3884\/revisions"}],"predecessor-version":[{"id":3890,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/3884\/revisions\/3890"}],"wp:attachment":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/media?parent=3884"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/categories?post=3884"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/tags?post=3884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}