{"id":4099,"date":"2018-05-19T00:42:34","date_gmt":"2018-05-18T16:42:34","guid":{"rendered":"http:\/\/www.bookcard.net\/wordpress\/?p=4099"},"modified":"2018-10-14T21:08:37","modified_gmt":"2018-10-14T13:08:37","slug":"opengl_shadow","status":"publish","type":"post","link":"https:\/\/www.bookcard.net\/wordpress\/opengl_shadow\/","title":{"rendered":"OpenGL\u4e4b\u9670\u5f71"},"content":{"rendered":"<figure id=\"attachment_4100\" aria-describedby=\"caption-attachment-4100\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/05\/OpenGL_Shadow.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-4100\" src=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/05\/OpenGL_Shadow.jpg\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/05\/OpenGL_Shadow.jpg 1024w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/05\/OpenGL_Shadow-300x225.jpg 300w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/05\/OpenGL_Shadow-768x576.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-4100\" class=\"wp-caption-text\">OpenGL\u9670\u5f71<\/figcaption><\/figure>\n<p>\u300e\u9670\u5f71\u300f\u6709\u5f88\u591a\u7a2e\u65b9\u6cd5,\u800c\u300e\u6295\u5c04\u9670\u5f71\u300f\u6280\u8853\u5df2\u88ab\u5927\u91cf\u7684\u61c9\u7528\u65bc\u904a\u6232,\u5f9e\u5149\u6e90\u4f4d\u7f6e\u900f\u8996\u6295\u5f713D\u7269\u9ad4,\u5f9e\u800c\u5c07\u9670\u5f71\u6295\u5c04\u5230\u5e73\u9762. \u800c\u4e14\u8996\u89ba\u6548\u679c\u4f73.\u7b97\u6cd5\u601d\u8def\u5982\u4e0b:<\/p>\n<ol>\n<li>\u555f\u7528\u300e<a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_stencil_buffer\/\">\u6a21\u677f\u7de9\u5b58<\/a>\u300f,\u5c07\u9670\u5f71\u7e6a\u756b\u9650\u5236\u5728\u76f8\u61c9\u7684\u5340\u57df\u4e2d<\/li>\n<li>\u69cb\u9020\u6295\u5f71\u77e9\u9663,\u6b64\u77e9\u9663\u6839\u64da\u300e\u5149\u6e90\u4f4d\u7f6e\u300f\u548c\u88ab\u300e\u6295\u5f71\u5e73\u9762\u300f\u4f4d\u7f6e\u4f86\u8a2d\u5b9a,\u4e26\u4e14\u8207\u6a21\u578b\u8996\u5716\u77e9\u9663\u76f8\u4e58.<\/li>\n<li>\u7981\u7528\u5149\u7167\u548c\u7d0b\u7406,\u4e26\u8a2d\u7f6e\u984f\u8272\u70ba\u9ed1\u8272.<\/li>\n<li>\u7981\u7528\u6df1\u5ea6\u6e2c\u8a66.<\/li>\n<li>\u555f\u7528\u900f\u660e\u6df7\u5408<\/li>\n<li>\u7e6a\u756b\u9670\u5f71<\/li>\n<\/ol>\n<p>\u843d\u96ea\u9670\u5f71\u6f14\u793a<a href=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/05\/OpenGLShadow.zip\">\u4e0b\u8f09<\/a>:<\/p>\n<p>\u69cb\u9020\u6295\u5f71\u77e9\u9663<\/p>\n<p>void Build_Matrix_Shadow(MATRIX4X4_PTR destMat, VECTOR4D_PTR lightPos, PLANE3D_PTR plane)<\/p>\n<p>{<\/p>\n<p>float dot;\/\/ \u9ede\u7a4d<\/p>\n<p>dot = plane-&gt;M[0] * lightPos-&gt;M[0] +<\/p>\n<p>plane-&gt;M[1] * lightPos-&gt;M[1] +<\/p>\n<p>plane-&gt;M[2] * lightPos-&gt;M[2] +<\/p>\n<p>plane-&gt;M[3] * lightPos-&gt;M[3];<\/p>\n<p>\/\/ \u7b2c\u4e00\u5217<\/p>\n<p>destMat-&gt;_M[0] = dot &#8211; lightPos-&gt;M[0] * plane-&gt;M[0];<\/p>\n<p>destMat-&gt;_M[4] = 0.0f &#8211; lightPos-&gt;M[0] * plane-&gt;M[1];<\/p>\n<p>destMat-&gt;_M[8] = 0.0f &#8211; lightPos-&gt;M[0] * plane-&gt;M[2];<\/p>\n<p>destMat-&gt;_M[12] = 0.0f &#8211; lightPos-&gt;M[0] * plane-&gt;M[3];<\/p>\n<p>\/\/ \u7b2c\u4e8c\u5217<\/p>\n<p>destMat-&gt;_M[1] = 0.0f &#8211; lightPos-&gt;M[1] * plane-&gt;M[0];<\/p>\n<p>destMat-&gt;_M[5] = dot &#8211; lightPos-&gt;M[1] * plane-&gt;M[1];<\/p>\n<p>destMat-&gt;_M[9] = 0.0f &#8211; lightPos-&gt;M[1] * plane-&gt;M[2];<\/p>\n<p>destMat-&gt;_M[13] = 0.0f &#8211; lightPos-&gt;M[1] * plane-&gt;M[3];<\/p>\n<p>\/\/ \u7b2c\u4e09\u5217<\/p>\n<p>destMat-&gt;_M[2] = 0.0f &#8211; lightPos-&gt;M[2] * plane-&gt;M[0];<\/p>\n<p>destMat-&gt;_M[6] = 0.0f &#8211; lightPos-&gt;M[2] * plane-&gt;M[1];<\/p>\n<p>destMat-&gt;_M[10] = dot &#8211; lightPos-&gt;M[2] * plane-&gt;M[2];<\/p>\n<p>destMat-&gt;_M[14] = 0.0f &#8211; lightPos-&gt;M[2] * plane-&gt;M[3];<\/p>\n<p>\/\/ \u7b2c\u56db\u5217<\/p>\n<p>destMat-&gt;_M[3] = 0.0f &#8211; lightPos-&gt;M[3] * plane-&gt;M[0];<\/p>\n<p>destMat-&gt;_M[7] = 0.0f &#8211; lightPos-&gt;M[3] * plane-&gt;M[1];<\/p>\n<p>destMat-&gt;_M[11] = 0.0f &#8211; lightPos-&gt;M[3] * plane-&gt;M[2];<\/p>\n<p>destMat-&gt;_M[15] = dot &#8211; lightPos-&gt;M[3] * plane-&gt;M[3];<\/p>\n<p>}<\/p>\n<p>MATRIX4X4 shadow_matrix; \/\/ \u6295\u5f71\u77e9\u9663<\/p>\n<p>GLfloat\u00a0\u00a0 light_pos[4] = { 150.0, 150.0, 150.0, 1.0 };\/\/ \u300e\u5149\u7167\u4f4d\u7f6e\u300f<\/p>\n<p>PLANE3D plane\u00a0 = { 0.0, 1.0, 0.0, 0.0 };\/\/ \u300e\u6295\u5f71\u5e73\u9762\u300f<\/p>\n<p>\u69cb\u9020\u6295\u5f71\u77e9\u9663<\/p>\n<p>Build_Matrix_Shadow(&amp;shadow_matrix,(VECTOR4D_PTR)&amp;Light_Pos,(PLANE3D_PTR) &amp;plane);<\/p>\n<p>\u6e32\u67d3\u9670\u5f71\u793a\u4f8b\u4ee3\u78bc<\/p>\n<p>\/\/ \u7981\u7528\u5c0d\u6240\u6709\u7684\u7136\u8272\u5206\u91cf\u7684\u4fee\u6539<\/p>\n<p>glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);<\/p>\n<p>\/\/ \u7981\u7528\u6df1\u5ea6\u6e2c\u8a66<\/p>\n<p>glEnable(GL_DEPTH_TEST);<\/p>\n<p>\/\/ \u6df1\u5ea6\u7de9\u5b58\u8a2d\u70ba\u53ea\u8b80<\/p>\n<p>glDepthMask(GL_FALSE);<\/p>\n<p>\/\/ \u555f\u7528\u6a21\u677f\u6e2c\u8a66<\/p>\n<p>glEnable(GL_STENCIL_TEST);<\/p>\n<p>\/\/ \u8a2d\u7f6e\u6a21\u677f\u6bd4\u8f03\u7a0b\u5e8f<\/p>\n<p>glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF);<\/p>\n<p>\/\/ \u8a2d\u7f6e\u6a21\u677fref\u64cd\u4f5c,<\/p>\n<p>glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);\/\/<\/p>\n<p>\/\/ \u7e6a\u756b\u5730\u677f,\u5c07\u6a21\u677f\u74b0\u5b58\u4e2d\u76f8\u61c9\u7684\u5730\u677f\u50cf\u7d20\u8a2d\u70ba1<\/p>\n<p>Draw_Floor();<\/p>\n<p>\/\/ \u555f\u7528\u6240\u6709\u984f\u8272\u5206\u91cf\u7684\u4fee\u6539<\/p>\n<p>glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);<\/p>\n<p>\/\/\u00a0 \u555f\u7528\u6df1\u5ea6\u6e2c\u8a66<\/p>\n<p>glEnable(GL_DEPTH_TEST);<\/p>\n<p>\/\/ \u6df1\u5ea6\u7de9\u5b58\u8a2d\u70ba\u53ef\u8b80\u5beb<\/p>\n<p>glDepthMask(GL_TRUE);<\/p>\n<p>\/\/ \u8a2d\u7f6e\u6a21\u677f\u6bd4\u8f03\u7a0b\u5e8f,\u53ea\u80fd\u5728\u6a21\u677f\u7de9\u5b58\u4e2d\u503c\u70ba1\u7684\u76f8\u61c9\u53bb\u5340\u57df\u7e6a\u88fd<\/p>\n<p>glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);<\/p>\n<p>\/\/ \u8a2d\u7f6e\u6a21\u677f\u64cd\u4f5c<\/p>\n<p>glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);\/\/ \u4fdd\u6301\u7576\u524d\u503c<\/p>\n<p>\/\/ \u7e6a\u88fd&#8221;\u93e1\u50cf&#8221;<\/p>\n<p>glPushMatrix();<\/p>\n<p>\/\/ \u53cd\u8f49<\/p>\n<p>glScalef(1.0f, -1.0f, 1.0f);<\/p>\n<p>\/\/\u7d50\u675f\u93e1\u50cf\u7e6a\u756b<\/p>\n<p>glPopMatrix();<\/p>\n<p>\/\/ \u7e6a\u756b\u5730\u677f<\/p>\n<p>Draw_Floor();<\/p>\n<p>\/\/ \u4ee5\u9ed1\u8272\u7e6a\u88fd\u9670\u5f71,\u5c07\u5176\u8207\u76f8\u61c9\u8868\u9762\u9032\u884c\u6df7\u5408,\u7121\u5149\u7167\u4e0d\u9032\u884c\u6df1\u5ea6\u6e2c\u8a66<\/p>\n<p>glPushMatrix();<\/p>\n<p>glPushAttrib(GL_ALL_ATTRIB_BITS);<\/p>\n<p>glDisable(GL_TEXTURE_2D);\/\/ \u7981\u75282D\u7d0b\u7406<\/p>\n<p>glDisable(GL_LIGHTING);\/\/ \u7981\u7528\u5149\u7167<\/p>\n<p>glDisable(GL_DEPTH_TEST);\/\/ \u7981\u7528\u6df1\u5ea6\u6e2c\u8a66<\/p>\n<p>glEnable(GL_BLEND);\/\/ \u555f\u7528\u6df7\u5408<\/p>\n<p>\/\/ \u78ba\u4fdd\u4e0d\u5728\u4efb\u4f55\u4e00\u500b\u5149\u67f5\u4f4d\u7f6e\u8655\u9032\u884c\u91cd\u8907\u7e6a\u88fd<\/p>\n<p>glStencilOp(GL_KEEP,GL_KEEP,GL_INCR);<\/p>\n<p>\/\/ \u9ed1\u8272\u9670\u5f71<\/p>\n<p>glColor4f(0.0f, 0.0f, 0.0f, blend);<\/p>\n<p>\/\/ \u4ee5\u9670\u5f71\u9032\u884c\u6295\u5f71<\/p>\n<p>glMultMatrixf((float*)&amp;shadow_matrix);\/\/ \u6295\u5f71\u77e9\u9663<\/p>\n<p>\/\/ \u7e6a\u756b\u7c92\u5b50\u66b4\u98a8\u96ea\u9670\u5f71<\/p>\n<p>Draw_Snowstorm(&amp;snowstorm, &amp;Camera3D, &amp;billboard);<\/p>\n<p>glEnable(GL_TEXTURE_2D);\/\/ \u7981\u75282D\u7d0b\u7406<\/p>\n<p>glEnable(GL_LIGHTING);\/\/ \u7981\u7528\u5149\u7167<\/p>\n<p>glEnable(GL_DEPTH_TEST);\/\/ \u7981\u7528\u6df1\u5ea6\u6e2c\u8a66<\/p>\n<p>glDisable(GL_BLEND);\/\/ \u555f\u7528\u6df7\u5408<\/p>\n<p>glPopAttrib();<\/p>\n<p>glPopMatrix();<\/p>\n<p>\/\/ \u7981\u7528\u6a21\u677f\u6e2c\u8a66<\/p>\n<p>glDisable(GL_STENCIL_TEST);<\/p>\n<p>\/\/ \u7e6a\u756b\u7c92\u5b50\u66b4\u98a8\u96ea<\/p>\n<p>Draw_Snowstorm();<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u300e\u9670\u5f71\u300f\u6709\u5f88\u591a\u7a2e\u65b9\u6cd5,\u800c\u300e\u6295\u5c04\u9670\u5f71\u300f\u6280\u8853\u5df2\u88ab\u5927\u91cf\u7684\u61c9\u7528\u65bc\u904a\u6232,\u5f9e\u5149\u6e90\u4f4d\u7f6e\u900f\u8996\u6295\u5f713D\u7269\u9ad4,\u5f9e\u800c\u5c07\u9670\u5f71\u6295\u5c04\u5230\u5e73\u9762 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_shadow\/\" class=\"more-link\">\u7e7c\u7e8c\u95b1\u8b80 <span class=\"screen-reader-text\">OpenGL\u4e4b\u9670\u5f71<\/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-4099","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\/4099","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=4099"}],"version-history":[{"count":2,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/4099\/revisions"}],"predecessor-version":[{"id":4104,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/4099\/revisions\/4104"}],"wp:attachment":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/media?parent=4099"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/categories?post=4099"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/tags?post=4099"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}