{"id":3892,"date":"2018-03-28T20:14:54","date_gmt":"2018-03-28T12:14:54","guid":{"rendered":"http:\/\/www.bookcard.net\/wordpress\/?p=3892"},"modified":"2018-10-14T21:21:42","modified_gmt":"2018-10-14T13:21:42","slug":"opengl_multitexterrain","status":"publish","type":"post","link":"https:\/\/www.bookcard.net\/wordpress\/opengl_multitexterrain\/","title":{"rendered":"OpenGL\u4e4b\u591a\u7d0b\u7406\u5730\u5f62"},"content":{"rendered":"<figure id=\"attachment_3893\" aria-describedby=\"caption-attachment-3893\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGL_MultitexTerrain.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3893\" src=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGL_MultitexTerrain.jpg\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGL_MultitexTerrain.jpg 1024w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGL_MultitexTerrain-300x225.jpg 300w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGL_MultitexTerrain-768x576.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-3893\" class=\"wp-caption-text\">OpenGL\u4e4b\u591a\u7d0b\u7406\u5730\u5f62<\/figcaption><\/figure>\n<p>\u591a\u7d0b\u7406\u5730\u5f62\u4f7f\u7528\u300e\u8349\u5730\u7d0b\u7406(2D\u7d0b\u7406)\u300f\u8207\u300e\u9ad8\u5ea6\u7d0b\u7406(1D\u7d0b\u7406)\u300f\u76f8\u7d50\u5408,\u6839\u64da\u6d77\u5e73\u9762\u7684\u9ad8\u5ea6\u70ba\u5730\u5f62\u9032\u884c\u8457\u8272.\u300e\u9ad8\u5ea6\u7d0b\u7406(1D\u7d0b\u7406)\u300f\u5373\u53ea\u67091\u884c\u7684\u7d0b\u7406,\u8f09\u5165\u5f8c\u9700\u6309\u4ee5\u4e0b\u4ee3\u78bc\u8f09\u5165\u7d0b\u7406<\/p>\n<p>Load_File_Texture(&amp;terrain-&gt;height_texture, NULL, &#8220;height.tga&#8221;);\/\/ \u8f09\u5165&#8221;\u9ad8\u5ea6&#8221;\u7d0b\u7406<\/p>\n<p>Bind_Image_Texture(&amp;terrain-&gt;height_texture); \/\/ \u7d81\u5b9a&#8221;\u9ad8\u5ea6&#8221;\u7d0b\u7406<\/p>\n<p>glGenTextures(1, &amp;texture-&gt;ID);\/\/ \u751f\u6210\u7d0b\u7406<\/p>\n<p>glBindTexture(GL_TEXTURE_1D, texture-&gt;ID);\/\/ \u7d81\u5b9a\u7d0b\u7406<\/p>\n<p>glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);\/\/\u593e\u6301\u7d0b\u7406<\/p>\n<p>glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);<\/p>\n<p>glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, texture-&gt;width, 0,GL_RGB,GL_UNSIGNED_BYTE,texture-&gt;image); \/\/ \u8f09\u5165\u7d0b\u7406<\/p>\n<p>\/\/ \u7d0b\u7406\u55ae\u51431<\/p>\n<p>glActiveTexture(GL_TEXTURE1);\/\/ \u6fc0\u6d3b\u7d0b\u7406\u55ae\u51431<\/p>\n<p>glEnable(GL_TEXTURE_GEN_S);\/\/ S\u5ea7\u6a19<\/p>\n<p>glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);\/\/\u7d0b\u7406\u5750\u6a19\u7684\u751f\u6210\u6a21\u5f0f<\/p>\n<p>GLfloat waterPlane[] = { 0.0, 1.0, 0.0, -TERRAIN_WATER_HEIGHT };<\/p>\n<p>glTexGenfv(GL_S, GL_OBJECT_PLANE, waterPlane);\/\/\u7d0b\u7406\u5750\u6a19\u7684\u751f\u6210<\/p>\n<p>\/\/ \u7d0b\u7406\u55ae\u51430<\/p>\n<p>glActiveTexture(GL_TEXTURE0);\/\/ \u6fc0\u6d3b\u7d0b\u7406\u55ae\u51430<\/p>\n<p>glEnable(GL_DEPTH_TEST);\/\/ \u6df1\u5ea6\u6e2c\u8a66<\/p>\n<p>glEnable(GL_TEXTURE_2D);\/\/ \u555f\u75282D\u7d0b\u7406\u6620\u5c04<\/p>\n<p>&nbsp;<\/p>\n<p>\u7e6a\u756b\u7d0b\u7406\u5730\u5f62\u7684\u51fd\u662f\u4ee3\u78bc<\/p>\n<p>void Draw_Height_Terrain(TERRAIN_PTR terrain)<\/p>\n<p>{<\/p>\n<p>\/\/ \u6fc0\u6d3b\u7d0b\u7406\u55ae\u51430<\/p>\n<p>glActiveTexture(GL_TEXTURE0);<\/p>\n<p>glEnable(GL_TEXTURE_2D);\/\/ 2D\u7d0b\u7406<\/p>\n<p>glBindTexture(GL_TEXTURE_2D, terrain-&gt;grass.ID);<\/p>\n<p>glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);\/\/ \u5e73\u92ea\u6548\u679c<\/p>\n<p>\/\/ \u6fc0\u6d3b\u7d0b\u7406\u55ae\u51431<\/p>\n<p>glActiveTexture(GL_TEXTURE1);<\/p>\n<p>glEnable(GL_TEXTURE_1D);\/\/ 1D\u7d0b\u7406(\u55ae\u884c)<\/p>\n<p>glBindTexture(GL_TEXTURE_1D, terrain-&gt;height_texture.ID);\/\/\u9ad8\u5ea6\u7d0b\u7406\u7d81\u5b9a\u5230\u5b83\u4e0a\u9762<\/p>\n<p>glMatrixMode(GL_TEXTURE);\/\/ \u5207\u63db\u5230\u7d0b\u7406\u77e9\u9663<\/p>\n<p>glLoadIdentity();<\/p>\n<p>glScalef(1.0f \/ TERRAIN_MAX_HEIGHT, 1.0, 1.0);\/\/ \u8a2d\u5b9as\u5750\u6a19\u6bd4\u4f8b\u5c3a.<\/p>\n<p>glMatrixMode(GL_MODELVIEW);\/\/ \u5207\u63db\u5230\u8996\u53e3\u77e9\u9663<\/p>\n<p>\/\/ \u7e6a\u756b\u5730\u5f62<\/p>\n<p>glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);<\/p>\n<p>for (int z = 0; z &lt; terrain-&gt;width &#8211; 1; ++z)<\/p>\n<p>{<\/p>\n<p>glBegin(GL_TRIANGLE_STRIP);<\/p>\n<p>for (int x = 0; x &lt; terrain-&gt;width; ++x)<\/p>\n<p>{<\/p>\n<p>GLfloat scaledHeight = terrain-&gt;data[z * terrain-&gt;width + x] \/ terrain-&gt;scale;<\/p>\n<p>GLfloat nextScaledHeight = terrain-&gt;data[(z + 1)*terrain-&gt;width + x] \/ terrain-&gt;scale;<\/p>\n<p>\/\/ \u6307\u5b9a\u7d0b\u7406\u55ae\u51430\u7684\u7d0b\u7406\u5ea7\u6a19<\/p>\n<p>glMultiTexCoord2f(GL_TEXTURE0, (GLfloat)x \/ terrain-&gt;width * 8.0f , (GLfloat)z \/ terrain-&gt;width * 8.0f);<\/p>\n<p>glVertex3f((GLfloat)x &#8211; terrain-&gt;width \/ 2.0f, scaledHeight, (GLfloat)z &#8211; terrain-&gt;width \/ 2.0f);<\/p>\n<p>\/\/ \u6307\u5b9a\u7d0b\u7406\u55ae\u51430\u7684\u7d0b\u7406\u5ea7\u6a19<\/p>\n<p>glMultiTexCoord2f(GL_TEXTURE0, (GLfloat)x \/ terrain-&gt;width * 8.0f, (GLfloat)(z + 1) \/ terrain-&gt;width * 8.0f );<\/p>\n<p>glVertex3f((GLfloat)x &#8211; terrain-&gt;width \/ 2.0f, nextScaledHeight, (GLfloat)(z + 1) &#8211; terrain-&gt;width \/ 2.0f);<\/p>\n<p>}<\/p>\n<p>glEnd();<\/p>\n<p>}<\/p>\n<p>glDisable(GL_TEXTURE_1D);\/\/ \u7981\u7528\u7d0b\u7406\u55ae\u51431<\/p>\n<p>glActiveTexture(GL_TEXTURE0);\/\/ \u6fc0\u6d3b\u7d0b\u7406\u55ae\u51430<\/p>\n<p>\/\/\u7e6a\u756b\u6c34\u9762<\/p>\n<p>glBindTexture(GL_TEXTURE_2D, terrain-&gt;water.ID);\/\/ \u6c34\u9762\u7d0b\u7406<\/p>\n<p>glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);<\/p>\n<p>glBegin(GL_QUADS);<\/p>\n<p>glTexCoord2f(0.0, 0.0);<\/p>\n<p>glVertex3f(-terrain-&gt;width \/ 2.1f, terrain-&gt;water_height, terrain-&gt;width \/ 2.1f);<\/p>\n<p>glTexCoord2f(terrain-&gt;width \/ 4.0f, 0.0);<\/p>\n<p>glVertex3f(terrain-&gt;width \/ 2.1f, terrain-&gt;water_height, terrain-&gt;width \/ 2.1f);<\/p>\n<p>glTexCoord2f(terrain-&gt;width \/ 4.0f, terrain-&gt;width \/ 4.0f);<\/p>\n<p>glVertex3f(terrain-&gt;width \/ 2.1f, terrain-&gt;water_height, -terrain-&gt;width \/ 2.1f);<\/p>\n<p>glTexCoord2f(0.0, terrain-&gt;width \/ 4.0f);<\/p>\n<p>glVertex3f(-terrain-&gt;width \/ 2.1f, terrain-&gt;water_height, -terrain-&gt;width \/ 2.1f);<\/p>\n<p>glEnd();<\/p>\n<p>}<\/p>\n<p>\u6f14\u793a\u7a0b\u5f0f<a href=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/03\/OpenGLMultitexTerrain.zip\">\u4e0b\u8f09<\/a>:<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u591a\u7d0b\u7406\u5730\u5f62\u4f7f\u7528\u300e\u8349\u5730\u7d0b\u7406(2D\u7d0b\u7406)\u300f\u8207\u300e\u9ad8\u5ea6\u7d0b\u7406(1D\u7d0b\u7406)\u300f\u76f8\u7d50\u5408,\u6839\u64da\u6d77\u5e73\u9762\u7684\u9ad8\u5ea6\u70ba\u5730\u5f62\u9032\u884c\u8457\u8272.\u300e\u9ad8\u5ea6 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_multitexterrain\/\" class=\"more-link\">\u7e7c\u7e8c\u95b1\u8b80 <span class=\"screen-reader-text\">OpenGL\u4e4b\u591a\u7d0b\u7406\u5730\u5f62<\/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-3892","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\/3892","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=3892"}],"version-history":[{"count":1,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/3892\/revisions"}],"predecessor-version":[{"id":3895,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/3892\/revisions\/3895"}],"wp:attachment":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/media?parent=3892"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/categories?post=3892"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/tags?post=3892"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}