From deaab618f8127d544dcc0c06ad0bfd97bd2b81a2 Mon Sep 17 00:00:00 2001 From: Meow J Date: Fri, 3 Jul 2015 16:45:45 +0800 Subject: [PATCH] Prepare for the convert --- 02 Lighting/03 Materials.md | 63 +-- 02 Lighting/04 Lighting maps.md | 72 ++-- 02 Lighting/05 Light casters.md | 204 ++------- 05 Advanced Lighting/06 HDR.md | 2 +- 05 Advanced Lighting/07 Bloom.md | 5 - img/I.png | Bin 0 -> 432 bytes img/Kc.png | Bin 0 -> 576 bytes img/Kl.png | Bin 0 -> 574 bytes img/Kq.png | Bin 0 -> 612 bytes img/Light_casters2.png | Bin 0 -> 1135 bytes img/Light_casters3.png | Bin 0 -> 887 bytes img/d.png | Bin 0 -> 489 bytes img/epsilon.png | Bin 0 -> 461 bytes img/gamma.png | Bin 0 -> 460 bytes img/phi.png | Bin 0 -> 502 bytes img/theta.png | Bin 0 -> 487 bytes .../01}/04 Hello Triangle.md | 0 {01 Getting started => old/01}/05 Shaders.md | 387 ++++++++++-------- {01 Getting started => old/01}/06 Textures.md | 0 .../01}/07 Transformations.md | 0 old/05/07 Bloom.md | 11 + 21 files changed, 324 insertions(+), 420 deletions(-) delete mode 100644 05 Advanced Lighting/07 Bloom.md create mode 100644 img/I.png create mode 100644 img/Kc.png create mode 100644 img/Kl.png create mode 100644 img/Kq.png create mode 100644 img/Light_casters2.png create mode 100644 img/Light_casters3.png create mode 100644 img/d.png create mode 100644 img/epsilon.png create mode 100644 img/gamma.png create mode 100644 img/phi.png create mode 100644 img/theta.png rename {01 Getting started => old/01}/04 Hello Triangle.md (100%) rename {01 Getting started => old/01}/05 Shaders.md (58%) rename {01 Getting started => old/01}/06 Textures.md (100%) rename {01 Getting started => old/01}/07 Transformations.md (100%) create mode 100644 old/05/07 Bloom.md diff --git a/02 Lighting/03 Materials.md b/02 Lighting/03 Materials.md index 95089d4..e1ae562 100644 --- a/02 Lighting/03 Materials.md +++ b/02 Lighting/03 Materials.md @@ -1,8 +1,10 @@ -本文作者JoeyDeVries,由[Django](http://bullteacher.com/14-materials.html)翻译自[http://learnopengl.com](http://learnopengl.com/#!Lighting/Materials) +鏈枃浣滆匤oeyDeVries锛岀敱[Django](http://bullteacher.com/14-materials.html)缈昏瘧鑷猍http://learnopengl.com](http://learnopengl.com/#!Lighting/Materials) -在真实世界里,每个物体会对光产生不同的反作用。钢比陶瓷花瓶更闪闪发光。比如一块木头不会和钢一样对光做出相同反作用。每个物体对specular高光也有不同的反应。有些物体不会散射很多光却会反射很多光,结果看起来就有一个较小的高光点,其他物体散射的更多,就会产生一个半径更大的高光。如果我们想要在OpenGL中模拟几种类型的物体,我们必须为每个物体定义材质属性。 +# 鏉愯川 -在前面的教程中,我们指定一个物体和一个光的颜色来定义物体的图像输出,并使之结合ambient和specular亮度元素。当描述物体的时候,我们可以为3种光照元素:ambient、diffuse、specular光照分别定义一个材质颜色。通过为每个元素指定一个颜色,我们已经对物体的颜色输出有了精密的控制。现在把一个发亮元素添加到这三个颜色里,这是我们需要的所有材质属性: +鍦ㄧ湡瀹炰笘鐣岄噷锛屾瘡涓墿浣撲細瀵瑰厜浜х敓涓嶅悓鐨勫弽浣滅敤銆傞挗姣旈櫠鐡疯姳鐡舵洿闂棯鍙戝厜銆傛瘮濡備竴鍧楁湪澶翠笉浼氬拰閽竴鏍峰鍏夊仛鍑虹浉鍚屽弽浣滅敤銆傛瘡涓墿浣撳specular楂樺厜涔熸湁涓嶅悓鐨勫弽搴斻傛湁浜涚墿浣撲笉浼氭暎灏勫緢澶氬厜鍗翠細鍙嶅皠寰堝鍏夛紝缁撴灉鐪嬭捣鏉ュ氨鏈変竴涓緝灏忕殑楂樺厜鐐癸紝鍏朵粬鐗╀綋鏁e皠鐨勬洿澶氾紝灏变細浜х敓涓涓崐寰勬洿澶х殑楂樺厜銆傚鏋滄垜浠兂瑕佸湪OpenGL涓ā鎷熷嚑绉嶇被鍨嬬殑鐗╀綋锛屾垜浠繀椤讳负姣忎釜鐗╀綋瀹氫箟鏉愯川灞炴с + +鍦ㄥ墠闈㈢殑鏁欑▼涓紝鎴戜滑鎸囧畾涓涓墿浣撳拰涓涓厜鐨勯鑹叉潵瀹氫箟鐗╀綋鐨勫浘鍍忚緭鍑猴紝骞朵娇涔嬬粨鍚坅mbient鍜宻pecular浜害鍏冪礌銆傚綋鎻忚堪鐗╀綋鐨勬椂鍊欙紝鎴戜滑鍙互涓3绉嶅厜鐓у厓绱狅細ambient銆乨iffuse銆乻pecular鍏夌収鍒嗗埆瀹氫箟涓涓潗璐ㄩ鑹层傞氳繃涓烘瘡涓厓绱犳寚瀹氫竴涓鑹诧紝鎴戜滑宸茬粡瀵圭墿浣撶殑棰滆壊杈撳嚭鏈変簡绮惧瘑鐨勬帶鍒躲傜幇鍦ㄦ妸涓涓彂浜厓绱犳坊鍔犲埌杩欎笁涓鑹查噷锛岃繖鏄垜浠渶瑕佺殑鎵鏈夋潗璐ㄥ睘鎬э細 ```c++ #version 330 core @@ -15,22 +17,22 @@ struct Material }; uniform Material material; ``` -在像素着色器中,我们创建一个结构体,来储存物体的材质属性。我们也可以把它们储存为独立的uniform值,但是作为一个结构体来储存可以更有条理。我们首先定义结构体的布局,然后简单声明一个uniform变量,以新近创建的结构体作为它的类型。 +鍦ㄥ儚绱犵潃鑹插櫒涓紝鎴戜滑鍒涘缓涓涓粨鏋勪綋锛屾潵鍌ㄥ瓨鐗╀綋鐨勬潗璐ㄥ睘鎬с傛垜浠篃鍙互鎶婂畠浠偍瀛樹负鐙珛鐨剈niform鍊硷紝浣嗘槸浣滀负涓涓粨鏋勪綋鏉ュ偍瀛樺彲浠ユ洿鏈夋潯鐞嗐傛垜浠鍏堝畾涔夌粨鏋勪綋鐨勫竷灞锛岀劧鍚庣畝鍗曞0鏄庝竴涓猽niform鍙橀噺锛屼互鏂拌繎鍒涘缓鐨勭粨鏋勪綋浣滀负瀹冪殑绫诲瀷銆 -就像你所看到的,我们为每个Phong光照的元素都定义一个颜色向量。ambient材质向量定义了在ambient光照下这个物体反射的是什么颜色;通常这是和物体颜色相同的颜色。diffuse材质向量定义了在diffuse光照下物体的颜色。diffuse颜色被设置为(和ambient光照一样)物体要求的颜色。specular材质向量设置的是物体受到的specular光的影响的颜色(或者可能是反射一个物体特定的specular高光颜色)。最后,shininess影响specular高光的散射/半径。 +灏卞儚浣犳墍鐪嬪埌鐨勶紝鎴戜滑涓烘瘡涓狿hong鍏夌収鐨勫厓绱犻兘瀹氫箟涓涓鑹插悜閲忋俛mbient鏉愯川鍚戦噺瀹氫箟浜嗗湪ambient鍏夌収涓嬭繖涓墿浣撳弽灏勭殑鏄粈涔堥鑹诧紱閫氬父杩欐槸鍜岀墿浣撻鑹茬浉鍚岀殑棰滆壊銆俤iffuse鏉愯川鍚戦噺瀹氫箟浜嗗湪diffuse鍏夌収涓嬬墿浣撶殑棰滆壊銆俤iffuse棰滆壊琚缃负锛堝拰ambient鍏夌収涓鏍凤級鐗╀綋瑕佹眰鐨勯鑹层俿pecular鏉愯川鍚戦噺璁剧疆鐨勬槸鐗╀綋鍙楀埌鐨剆pecular鍏夌殑褰卞搷鐨勯鑹诧紙鎴栬呭彲鑳芥槸鍙嶅皠涓涓墿浣撶壒瀹氱殑specular楂樺厜棰滆壊锛夈傛渶鍚庯紝shininess褰卞搷specular楂樺厜鐨勬暎灏/鍗婂緞銆 -这四个元素定义了一个物体的材质,通过它们我们能够模拟很多真实世界的材质。这里有一个列表devernay.free.fr展示了几种材质属性,这些材质属性模拟外部世界的真实材质。下面的图片展示了几种真实世界材质对我们的立方体的影响: +杩欏洓涓厓绱犲畾涔変簡涓涓墿浣撶殑鏉愯川锛岄氳繃瀹冧滑鎴戜滑鑳藉妯℃嫙寰堝鐪熷疄涓栫晫鐨勬潗璐ㄣ傝繖閲屾湁涓涓垪琛╠evernay.free.fr灞曠ず浜嗗嚑绉嶆潗璐ㄥ睘鎬э紝杩欎簺鏉愯川灞炴фā鎷熷閮ㄤ笘鐣岀殑鐪熷疄鏉愯川銆備笅闈㈢殑鍥剧墖灞曠ず浜嗗嚑绉嶇湡瀹炰笘鐣屾潗璐ㄥ鎴戜滑鐨勭珛鏂逛綋鐨勫奖鍝嶏細 ![](http://www.learnopengl.com/img/lighting/materials_real_world.png) -就像你所看到的,正确的指定一个物体的材质属性,似乎就是改变我们物体的相关属性的比例。效果显然很引人注目,但是对于大多数真实效果,我们最终需要更加复杂的形状,而不单单是一个立方体。在下面教程部分里,我们会讨论更复杂的形状。 +灏卞儚浣犳墍鐪嬪埌鐨勶紝姝g‘鐨勬寚瀹氫竴涓墿浣撶殑鏉愯川灞炴э紝浼间箮灏辨槸鏀瑰彉鎴戜滑鐗╀綋鐨勭浉鍏冲睘鎬х殑姣斾緥銆傛晥鏋滄樉鐒跺緢寮曚汉娉ㄧ洰锛屼絾鏄浜庡ぇ澶氭暟鐪熷疄鏁堟灉锛屾垜浠渶缁堥渶瑕佹洿鍔犲鏉傜殑褰㈢姸锛岃屼笉鍗曞崟鏄竴涓珛鏂逛綋銆傚湪涓嬮潰鏁欑▼閮ㄥ垎閲岋紝鎴戜滑浼氳璁烘洿澶嶆潅鐨勫舰鐘躲 -为一个物体赋予正确的材质是一件高难的手艺,这需要大量实验和丰富的经验,所以由于错误的设置材质而毁了物体的画面质量是件经常发生的事。 +涓轰竴涓墿浣撹祴浜堟纭殑鏉愯川鏄竴浠堕珮闅剧殑鎵嬭壓锛岃繖闇瑕佸ぇ閲忓疄楠屽拰涓板瘜鐨勭粡楠岋紝鎵浠ョ敱浜庨敊璇殑璁剧疆鏉愯川鑰屾瘉浜嗙墿浣撶殑鐢婚潰璐ㄩ噺鏄欢缁忓父鍙戠敓鐨勪簨銆 -让我们试试在着色器中实现这样的一个材质系统。 +璁╂垜浠瘯璇曞湪鐫鑹插櫒涓疄鐜拌繖鏍风殑涓涓潗璐ㄧ郴缁熴 -##14.1 设置材质 +## 璁剧疆鏉愯川 -我们在像素着色器中创建了一个uniform材质结构体,所以下面我们希望改变光照计算来顺应新的材质属性。由于所有材质变量都是储存在结构体中,我们可以从uniform变量material取得它们: +鎴戜滑鍦ㄥ儚绱犵潃鑹插櫒涓垱寤轰簡涓涓猽niform鏉愯川缁撴瀯浣擄紝鎵浠ヤ笅闈㈡垜浠笇鏈涙敼鍙樺厜鐓ц绠楁潵椤哄簲鏂扮殑鏉愯川灞炴с傜敱浜庢墍鏈夋潗璐ㄥ彉閲忛兘鏄偍瀛樺湪缁撴瀯浣撲腑锛屾垜浠彲浠ヤ粠uniform鍙橀噺material鍙栧緱瀹冧滑锛 ```c++ void main() { @@ -53,9 +55,9 @@ void main() color = vec4(result, 1.0f); } ``` -就像你所看到的,我么现在获得所有材质结构体的属性,无论在哪儿我们都需要它们,这次通过材质颜色的帮助,计算结果输出的颜色。物体的每个材质属性都乘以它们对应的光照元素。 +灏卞儚浣犳墍鐪嬪埌鐨勶紝鎴戜箞鐜板湪鑾峰緱鎵鏈夋潗璐ㄧ粨鏋勪綋鐨勫睘鎬э紝鏃犺鍦ㄥ摢鍎挎垜浠兘闇瑕佸畠浠紝杩欐閫氳繃鏉愯川棰滆壊鐨勫府鍔╋紝璁$畻缁撴灉杈撳嚭鐨勯鑹层傜墿浣撶殑姣忎釜鏉愯川灞炴ч兘涔樹互瀹冧滑瀵瑰簲鐨勫厜鐓у厓绱犮 -通过设置适当的uniform,我们可以在应用中设置物体的材质。当设置uniform时,在GLSL中的一个结构体不会被认为有什么特别之处。一个结构体值扮演uniform变量的封装体,所以如果我们希望填充这个结构体,我们就仍然必须设置单独的uniform,但是这次带有结构体名字作为前缀: +閫氳繃璁剧疆閫傚綋鐨剈niform锛屾垜浠彲浠ュ湪搴旂敤涓缃墿浣撶殑鏉愯川銆傚綋璁剧疆uniform鏃讹紝鍦℅LSL涓殑涓涓粨鏋勪綋涓嶄細琚涓烘湁浠涔堢壒鍒箣澶勩備竴涓粨鏋勪綋鍊兼壆婕攗niform鍙橀噺鐨勫皝瑁呬綋锛屾墍浠ュ鏋滄垜浠笇鏈涘~鍏呰繖涓粨鏋勪綋锛屾垜浠氨浠嶇劧蹇呴』璁剧疆鍗曠嫭鐨剈niform锛屼絾鏄繖娆″甫鏈夌粨鏋勪綋鍚嶅瓧浣滀负鍓嶇紑锛 ```c++ GLint matAmbientLoc = glGetUniformLocation(lightingShader.Program, "material.ambient"); GLint matDiffuseLoc = glGetUniformLocation(lightingShader.Program, "material.diffuse"); @@ -67,26 +69,26 @@ glUniform3f(matDiffuseLoc, 1.0f, 0.5f, 0.31f); glUniform3f(matSpecularLoc, 0.5f, 0.5f, 0.5f); glUniform1f(matShineLoc, 32.0f); ``` -我们设置ambient和diffuse元素我们喜欢物体所呈现的颜色,设置物体的specular元素为中等亮度颜色;我们不希望specular元素对这个指定物体产生过于强烈的影响。我们同样保持光亮为32。我们现在可以简单的在应用中影响物体的材质。 +鎴戜滑璁剧疆ambient鍜宒iffuse鍏冪礌鎴戜滑鍠滄鐗╀綋鎵鍛堢幇鐨勯鑹诧紝璁剧疆鐗╀綋鐨剆pecular鍏冪礌涓轰腑绛変寒搴﹂鑹诧紱鎴戜滑涓嶅笇鏈泂pecular鍏冪礌瀵硅繖涓寚瀹氱墿浣撲骇鐢熻繃浜庡己鐑堢殑褰卞搷銆傛垜浠悓鏍蜂繚鎸佸厜浜负32銆傛垜浠幇鍦ㄥ彲浠ョ畝鍗曠殑鍦ㄥ簲鐢ㄤ腑褰卞搷鐗╀綋鐨勬潗璐ㄣ -运行程序,会得到下面这样的结果: +杩愯绋嬪簭锛屼細寰楀埌涓嬮潰杩欐牱鐨勭粨鏋滐細 ![](http://www.learnopengl.com/img/lighting/materials_with_material.png) -看起来真不怎么样对吗? +鐪嬭捣鏉ョ湡涓嶆庝箞鏍峰鍚楋紵 -##14.2 光的属性 +## 鍏夌殑灞炴 -这个物体太亮了。物体过亮的原因是ambient、diffuse和specular颜色被从任何一个光源全力地反射。光源对ambient、diffuse和specular元素同时有着不同的亮度。前面的教程,我们通过使用一个强度值改变ambient和specular亮度的方式,解决了这个问题,但是这次为每个光照元素指定了亮度向量。如果我们想象lightColor是vec3(1.0),代码看起来像是这样: +杩欎釜鐗╀綋澶寒浜嗐傜墿浣撹繃浜殑鍘熷洜鏄痑mbient銆乨iffuse鍜宻pecular棰滆壊琚粠浠讳綍涓涓厜婧愬叏鍔涘湴鍙嶅皠銆傚厜婧愬ambient銆乨iffuse鍜宻pecular鍏冪礌鍚屾椂鏈夌潃涓嶅悓鐨勪寒搴︺傚墠闈㈢殑鏁欑▼锛屾垜浠氳繃浣跨敤涓涓己搴﹀兼敼鍙榓mbient鍜宻pecular浜害鐨勬柟寮忥紝瑙e喅浜嗚繖涓棶棰橈紝浣嗘槸杩欐涓烘瘡涓厜鐓у厓绱犳寚瀹氫簡浜害鍚戦噺銆傚鏋滄垜浠兂璞ightColor鏄痸ec3(1.0)锛屼唬鐮佺湅璧锋潵鍍忔槸杩欐牱锛 ```c++ vec3 ambient = vec3(1.0f) * material.ambient; vec3 diffuse = vec3(1.0f) * (diff * material.diffuse); vec3 specular = vec3(1.0f) * (spec * material.specular); ``` -所以物体的每个材质属性返回了每个光照元素的全亮度。这些vec3(1.0)值可以各自独立的影响每个光源,这通常就是我们想要的。现在物体的ambient元素完全地影响了立方体的颜色,可视ambient元素uyinggai对最终颜色有这么大的影响,所以我们要通过设置光的ambient亮度为一个小一点的值的方式,限制ambient颜色: +鎵浠ョ墿浣撶殑姣忎釜鏉愯川灞炴ц繑鍥炰簡姣忎釜鍏夌収鍏冪礌鐨勫叏浜害銆傝繖浜泇ec3(1.0)鍊煎彲浠ュ悇鑷嫭绔嬬殑褰卞搷姣忎釜鍏夋簮锛岃繖閫氬父灏辨槸鎴戜滑鎯宠鐨勩傜幇鍦ㄧ墿浣撶殑ambient鍏冪礌瀹屽叏鍦板奖鍝嶄簡绔嬫柟浣撶殑棰滆壊锛屽彲瑙哸mbient鍏冪礌uyinggai瀵规渶缁堥鑹叉湁杩欎箞澶х殑褰卞搷锛屾墍浠ユ垜浠閫氳繃璁剧疆鍏夌殑ambient浜害涓轰竴涓皬涓鐐圭殑鍊肩殑鏂瑰紡锛岄檺鍒禷mbient棰滆壊锛 ```c++ vec3 result = vec3(0.1f) * material.ambient; ``` -我们可以用同样的方式影响光源的diffuse和specular亮度。这和我们前面教程所做的极为相似;你可以说我们已经创建了一些光的属性各自独立地来影响每个光照元素。我们希望为光的属性创建一些与材质结构体相似的东西: +鎴戜滑鍙互鐢ㄥ悓鏍风殑鏂瑰紡褰卞搷鍏夋簮鐨刣iffuse鍜宻pecular浜害銆傝繖鍜屾垜浠墠闈㈡暀绋嬫墍鍋氱殑鏋佷负鐩镐技锛涗綘鍙互璇存垜浠凡缁忓垱寤轰簡涓浜涘厜鐨勫睘鎬у悇鑷嫭绔嬪湴鏉ュ奖鍝嶆瘡涓厜鐓у厓绱犮傛垜浠笇鏈涗负鍏夌殑灞炴у垱寤轰竴浜涗笌鏉愯川缁撴瀯浣撶浉浼肩殑涓滆タ锛 ```c++ struct Light { @@ -97,15 +99,15 @@ struct Light }; uniform Light light; ``` -一个光源的ambient、diffuse和specular光都有不同的亮度。ambient光通常设置为一个比较低的亮度,因为饿哦们不希望ambient颜色成为主导。光源的diffuse元素通常设置为我们希望光所具有的颜色;经常是一个明亮的白色。specular元素通常设置为vec3(1.0f)的全亮度的发光度。要记住的是我们同样把光的位置添加到结构体中。 +涓涓厜婧愮殑ambient銆乨iffuse鍜宻pecular鍏夐兘鏈変笉鍚岀殑浜害銆俛mbient鍏夐氬父璁剧疆涓轰竴涓瘮杈冧綆鐨勪寒搴︼紝鍥犱负楗垮摝浠笉甯屾湜ambient棰滆壊鎴愪负涓诲銆傚厜婧愮殑diffuse鍏冪礌閫氬父璁剧疆涓烘垜浠笇鏈涘厜鎵鍏锋湁鐨勯鑹诧紱缁忓父鏄竴涓槑浜殑鐧借壊銆俿pecular鍏冪礌閫氬父璁剧疆涓簐ec3(1.0f)鐨勫叏浜害鐨勫彂鍏夊害銆傝璁颁綇鐨勬槸鎴戜滑鍚屾牱鎶婂厜鐨勪綅缃坊鍔犲埌缁撴瀯浣撲腑銆 -就像材质uniform一样,我么你需要更新像素着色器: +灏卞儚鏉愯川uniform涓鏍凤紝鎴戜箞浣犻渶瑕佹洿鏂板儚绱犵潃鑹插櫒锛 ```c++ vec3 ambient = light.ambient * material.ambient; vec3 diffuse = light.diffuse * (diff * material.diffuse); vec3 specular = light.specular * (spec * material.specular); ``` -然后我们要在应用里设置光的亮度: +鐒跺悗鎴戜滑瑕佸湪搴旂敤閲岃缃厜鐨勪寒搴︼細 ```c++ GLint lightAmbientLoc = glGetUniformLocation(lightingShader.Program, "light.ambient"); GLint lightDiffuseLoc = glGetUniformLocation(lightingShader.Program, "light.diffuse"); @@ -115,20 +117,21 @@ glUniform3f(lightAmbientLoc, 0.2f, 0.2f, 0.2f); glUniform3f(lightDiffuseLoc, 0.5f, 0.5f, 0.5f); // Let's darken the light a bit to fit the scene glUniform3f(lightSpecularLoc, 1.0f, 1.0f, 1.0f); ``` -现在,我们调整了光如何影响物体所有的材质的,我们得到一个更像前面教程的视觉输出。这次我们完全控制了物体光照和材质: +鐜板湪锛屾垜浠皟鏁翠簡鍏夊浣曞奖鍝嶇墿浣撴墍鏈夌殑鏉愯川鐨勶紝鎴戜滑寰楀埌涓涓洿鍍忓墠闈㈡暀绋嬬殑瑙嗚杈撳嚭銆傝繖娆℃垜浠畬鍏ㄦ帶鍒朵簡鐗╀綋鍏夌収鍜屾潗璐細 ![](http://www.learnopengl.com/img/lighting/materials_light.png) -现在改变物体的外观相对简单了些。我们做点更有趣的事! +鐜板湪鏀瑰彉鐗╀綋鐨勫瑙傜浉瀵圭畝鍗曚簡浜涖傛垜浠仛鐐规洿鏈夎叮鐨勪簨锛 -##14.3 不同的光的颜色 +## 涓嶅悓鐨勫厜鐨勯鑹 -目前为止,我们只是使用光的颜色去改变它们的独立元素,选择的是从白到灰到黑范围的颜色,不是动感的物体的真实颜色(只是亮度)。由于我们现在简单的取得了光的属性,我们可以随着时间改变它们的颜色,获得的效果有很意思。由于没见识都已经在像素着色器做好了,改变光的颜色很简单,可以立即创建出一些有趣的效果: +鐩墠涓烘锛屾垜浠彧鏄娇鐢ㄥ厜鐨勯鑹插幓鏀瑰彉瀹冧滑鐨勭嫭绔嬪厓绱狅紝閫夋嫨鐨勬槸浠庣櫧鍒扮伆鍒伴粦鑼冨洿鐨勯鑹诧紝涓嶆槸鍔ㄦ劅鐨勭墿浣撶殑鐪熷疄棰滆壊锛堝彧鏄寒搴︼級銆傜敱浜庢垜浠幇鍦ㄧ畝鍗曠殑鍙栧緱浜嗗厜鐨勫睘鎬э紝鎴戜滑鍙互闅忕潃鏃堕棿鏀瑰彉瀹冧滑鐨勯鑹诧紝鑾峰緱鐨勬晥鏋滄湁寰堟剰鎬濄傜敱浜庢病瑙佽瘑閮藉凡缁忓湪鍍忕礌鐫鑹插櫒鍋氬ソ浜嗭紝鏀瑰彉鍏夌殑棰滆壊寰堢畝鍗曪紝鍙互绔嬪嵆鍒涘缓鍑轰竴浜涙湁瓒g殑鏁堟灉锛 -就像你所看见的,不同的光的颜色极大地影响了物体的颜色输出。由于光的颜色直接影响物体反射的颜色(你可能想起颜色教程),它对视觉输出有显著的影响。 -利用sin和glfwGetTime,改变光的ambient和diffuse颜色,我们可以随着时间流逝简单的改变光的颜色: +灏卞儚浣犳墍鐪嬭鐨勶紝涓嶅悓鐨勫厜鐨勯鑹叉瀬澶у湴褰卞搷浜嗙墿浣撶殑棰滆壊杈撳嚭銆傜敱浜庡厜鐨勯鑹茬洿鎺ュ奖鍝嶇墿浣撳弽灏勭殑棰滆壊锛堜綘鍙兘鎯宠捣棰滆壊鏁欑▼锛夛紝瀹冨瑙嗚杈撳嚭鏈夋樉钁楃殑褰卞搷銆 + +鍒╃敤sin鍜実lfwGetTime锛屾敼鍙樺厜鐨刟mbient鍜宒iffuse棰滆壊锛屾垜浠彲浠ラ殢鐫鏃堕棿娴侀濈畝鍗曠殑鏀瑰彉鍏夌殑棰滆壊锛 ```c++ glm::vec3 lightColor; lightColor.x = sin(glfwGetTime() * 2.0f); lightColor.y = sin(glfwGetTime() * 0.7f); @@ -140,4 +143,4 @@ glm::vec3 ambientColor = diffuseColor * glm::vec3(0.2f); // Low influence glUniform3f(lightAmbientLoc, ambientColor.x, ambientColor.y, ambientColor.z); glUniform3f(lightDiffuseLoc, diffuseColor.x, diffuseColor.y, diffuseColor.z); ``` -尝试和实验使用这些光照和材质值,看看它们怎样影响图像输出的。你可以从这里找到应用,和像素着色器的源码。 +灏濊瘯鍜屽疄楠屼娇鐢ㄨ繖浜涘厜鐓у拰鏉愯川鍊硷紝鐪嬬湅瀹冧滑鎬庢牱褰卞搷鍥惧儚杈撳嚭鐨勩備綘鍙互浠庤繖閲屾壘鍒板簲鐢紝鍜屽儚绱犵潃鑹插櫒鐨勬簮鐮併 diff --git a/02 Lighting/04 Lighting maps.md b/02 Lighting/04 Lighting maps.md index a352d51..8b29ad5 100644 --- a/02 Lighting/04 Lighting maps.md +++ b/02 Lighting/04 Lighting maps.md @@ -1,27 +1,29 @@ -本文作者JoeyDeVries,由[Django](http://bullteacher.com/15-lighting-maps.html)翻译自[http://learnopengl.com](http://www.learnopengl.com/#!Lighting/Lighting-maps) +鏈枃浣滆匤oeyDeVries锛岀敱[Django](http://bullteacher.com/15-lighting-maps.html)缈昏瘧鑷猍http://learnopengl.com](http://www.learnopengl.com/#!Lighting/Lighting-maps) -前面的教程,我们讨论了每个物体都拥有各自不同的材质,因而会对光做出不同的反应。在一个光照场景中,给每个物体和其他物体不同的外观很棒,但是这仍然不会对一个物体的图像输出提供很多的伸缩性。 +# 鍏夌収璐村浘 -前面的教程我们为一个物体的作为一个整体定义了一个材质,但是现实世界的物体通常不会只有这么一种材质,而是由多种材质组成。想象一辆车:它的外表质地光亮,车窗会部分反射环境,它的轮胎没有specular高光,轮彀却非常闪亮(在洗过之后)。汽车同样有diffuse和ambient颜色,它们在整个车上都不相同;一辆车显示了多种不同的ambient/diffuse颜色。总之,这样一个物体每个部分都有多种材质属性。 +鍓嶉潰鐨勬暀绋嬶紝鎴戜滑璁ㄨ浜嗘瘡涓墿浣撻兘鎷ユ湁鍚勮嚜涓嶅悓鐨勬潗璐紝鍥犺屼細瀵瑰厜鍋氬嚭涓嶅悓鐨勫弽搴斻傚湪涓涓厜鐓у満鏅腑锛岀粰姣忎釜鐗╀綋鍜屽叾浠栫墿浣撲笉鍚岀殑澶栬寰堟锛屼絾鏄繖浠嶇劧涓嶄細瀵逛竴涓墿浣撶殑鍥惧儚杈撳嚭鎻愪緵寰堝鐨勪几缂╂с -所以,前面的材质系统对于除了最简单的模型以外都是不够的,所以我们需要扩展前面的系统,我们要介绍diffuse和specular贴图。它们允许你对一个物体的diffuse(对于简洁的ambient成分来说,它们几乎总是是一样的)和specular成分能够有更精确的影响。 +鍓嶉潰鐨勬暀绋嬫垜浠负涓涓墿浣撶殑浣滀负涓涓暣浣撳畾涔変簡涓涓潗璐紝浣嗘槸鐜板疄涓栫晫鐨勭墿浣撻氬父涓嶄細鍙湁杩欎箞涓绉嶆潗璐紝鑰屾槸鐢卞绉嶆潗璐ㄧ粍鎴愩傛兂璞′竴杈嗚溅锛氬畠鐨勫琛ㄨ川鍦板厜浜紝杞︾獥浼氶儴鍒嗗弽灏勭幆澧冿紝瀹冪殑杞儙娌℃湁specular楂樺厜锛岃疆褰鍗撮潪甯搁棯浜紙鍦ㄦ礂杩囦箣鍚庯級銆傛苯杞﹀悓鏍锋湁diffuse鍜宎mbient棰滆壊锛屽畠浠湪鏁翠釜杞︿笂閮戒笉鐩稿悓锛涗竴杈嗚溅鏄剧ず浜嗗绉嶄笉鍚岀殑ambient/diffuse棰滆壊銆傛讳箣锛岃繖鏍蜂竴涓墿浣撴瘡涓儴鍒嗛兘鏈夊绉嶆潗璐ㄥ睘鎬с + +鎵浠ワ紝鍓嶉潰鐨勬潗璐ㄧ郴缁熷浜庨櫎浜嗘渶绠鍗曠殑妯″瀷浠ュ閮芥槸涓嶅鐨勶紝鎵浠ユ垜浠渶瑕佹墿灞曞墠闈㈢殑绯荤粺锛屾垜浠浠嬬粛diffuse鍜宻pecular璐村浘銆傚畠浠厑璁镐綘瀵逛竴涓墿浣撶殑diffuse锛堝浜庣畝娲佺殑ambient鎴愬垎鏉ヨ锛屽畠浠嚑涔庢绘槸鏄竴鏍风殑锛夊拰specular鎴愬垎鑳藉鏈夋洿绮剧‘鐨勫奖鍝嶃 -##15.1 diffuse贴图 +## 婕弽灏勮创鍥 -我们希望通过某种方式对每个原始像素独立设置diffuse颜色。有可以让我们基于物体原始像素的位置来获取颜色值的系统吗? +鎴戜滑甯屾湜閫氳繃鏌愮鏂瑰紡瀵规瘡涓師濮嬪儚绱犵嫭绔嬭缃甦iffuse棰滆壊銆傛湁鍙互璁╂垜浠熀浜庣墿浣撳師濮嬪儚绱犵殑浣嶇疆鏉ヨ幏鍙栭鑹插肩殑绯荤粺鍚楋紵 -这可能听起来极其相似,坦白来讲我们我们使用这样的系统已经有一会儿了。听起来很像在一个较早的教程中谈论的纹理,它基本就是一个纹理。我们其实是使用同一个潜在原则下的不同名称:使用一张图片包裹住物体,我们为每个原始像素索引独立颜色值。在有光的场景里,通常叫做diffuse贴图(这通常是3D艺术家的叫法),因为这个纹理图像表现了所有物体的diffuse颜色。 +杩欏彲鑳藉惉璧锋潵鏋佸叾鐩镐技锛屽潶鐧芥潵璁叉垜浠垜浠娇鐢ㄨ繖鏍风殑绯荤粺宸茬粡鏈変竴浼氬効浜嗐傚惉璧锋潵寰堝儚鍦ㄤ竴涓緝鏃╃殑鏁欑▼涓皥璁虹殑绾圭悊锛屽畠鍩烘湰灏辨槸涓涓汗鐞嗐傛垜浠叾瀹炴槸浣跨敤鍚屼竴涓綔鍦ㄥ師鍒欎笅鐨勪笉鍚屽悕绉帮細浣跨敤涓寮犲浘鐗囧寘瑁逛綇鐗╀綋锛屾垜浠负姣忎釜鍘熷鍍忕礌绱㈠紩鐙珛棰滆壊鍊笺傚湪鏈夊厜鐨勫満鏅噷锛岄氬父鍙仛diffuse璐村浘锛堣繖閫氬父鏄3D鑹烘湳瀹剁殑鍙硶锛夛紝鍥犱负杩欎釜绾圭悊鍥惧儚琛ㄧ幇浜嗘墍鏈夌墿浣撶殑diffuse棰滆壊銆 -为了强调diffuse贴图,我们将会使用下面的图片,它是一个有一圈钢边的木箱: +涓轰簡寮鸿皟diffuse璐村浘锛屾垜浠皢浼氫娇鐢ㄤ笅闈㈢殑鍥剧墖锛屽畠鏄竴涓湁涓鍦堥挗杈圭殑鏈ㄧ锛 ![](http://www.learnopengl.com/img/textures/container2.png) -在着色器中使用diffuse贴图和纹理教程介绍的一样。这次我们把纹理储存为sampler2D,它在Material结构体中。我们使用diffuse贴图替代早期定义的vec3类型的diffuse颜色。 +鍦ㄧ潃鑹插櫒涓娇鐢╠iffuse璐村浘鍜岀汗鐞嗘暀绋嬩粙缁嶇殑涓鏍枫傝繖娆℃垜浠妸绾圭悊鍌ㄥ瓨涓簊ampler2D锛屽畠鍦∕aterial缁撴瀯浣撲腑銆傛垜浠娇鐢╠iffuse璐村浘鏇夸唬鏃╂湡瀹氫箟鐨剉ec3绫诲瀷鐨刣iffuse棰滆壊銆 -要记住的是sampler2D也叫做模糊类型,这意味着我们不能以某种类型对它实例化,只能用uniform定义它们。如果我们用结构体而不是uniform实例化(就像函数的参数那样),GLSL会抛出奇怪的错误;这同样也适用于其他模糊类型。 -我们也要移除amibient材质颜色向量,因为ambient颜色绝大多数情况等于diffuse颜色,所以不需要分别去储存它: +瑕佽浣忕殑鏄痵ampler2D涔熷彨鍋氭ā绯婄被鍨嬶紝杩欐剰鍛崇潃鎴戜滑涓嶈兘浠ユ煇绉嶇被鍨嬪瀹冨疄渚嬪寲锛屽彧鑳界敤uniform瀹氫箟瀹冧滑銆傚鏋滄垜浠敤缁撴瀯浣撹屼笉鏄痷niform瀹炰緥鍖栵紙灏卞儚鍑芥暟鐨勫弬鏁伴偅鏍凤級锛孏LSL浼氭姏鍑哄鎬殑閿欒锛涜繖鍚屾牱涔熼傜敤浜庡叾浠栨ā绯婄被鍨嬨 +鎴戜滑涔熻绉婚櫎amibient鏉愯川棰滆壊鍚戦噺锛屽洜涓篴mbient棰滆壊缁濆ぇ澶氭暟鎯呭喌绛変簬diffuse棰滆壊锛屾墍浠ヤ笉闇瑕佸垎鍒幓鍌ㄥ瓨瀹冿細 ```c++ struct Material { @@ -32,18 +34,18 @@ struct Material ... in vec2 TexCoords; ``` -如果你非把ambient颜色设置为不同的值不可(不同于diffuse值),你可以继续保持ambient的vec3,但是整个物体的ambient颜色会继续保持不变。为了使每个原始像素得到不同ambient值,你需要对ambient值单独使用另一个纹理。 -注意,在像素着色器中我们将会再次需要纹理坐标,所以我们声明一个额外输入变量。然后我们简单地从纹理采样,来获得原始像素的diffuse颜色值: +濡傛灉浣犻潪鎶奱mbient棰滆壊璁剧疆涓轰笉鍚岀殑鍊间笉鍙紙涓嶅悓浜巇iffuse鍊硷級锛屼綘鍙互缁х画淇濇寔ambient鐨剉ec3锛屼絾鏄暣涓墿浣撶殑ambient棰滆壊浼氱户缁繚鎸佷笉鍙樸備负浜嗕娇姣忎釜鍘熷鍍忕礌寰楀埌涓嶅悓ambient鍊硷紝浣犻渶瑕佸ambient鍊煎崟鐙娇鐢ㄥ彟涓涓汗鐞嗐 +娉ㄦ剰锛屽湪鍍忕礌鐫鑹插櫒涓垜浠皢浼氬啀娆¢渶瑕佺汗鐞嗗潗鏍囷紝鎵浠ユ垜浠0鏄庝竴涓澶栬緭鍏ュ彉閲忋傜劧鍚庢垜浠畝鍗曞湴浠庣汗鐞嗛噰鏍凤紝鏉ヨ幏寰楀師濮嬪儚绱犵殑diffuse棰滆壊鍊硷細 ```c++ vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords)); ``` -同样,不要忘记把ambient材质的颜色设置为diffuse材质的颜色: +鍚屾牱锛屼笉瑕佸繕璁版妸ambient鏉愯川鐨勯鑹茶缃负diffuse鏉愯川鐨勯鑹诧細 ```c++ vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords)); ``` -这就是diffuse贴图的全部内容了。就像你看到的,这不是什么新的东西,但是它却极大提升了视觉品质。为了让它工作,我们需要用到纹理坐标更新顶点数据,把它们作为顶点属性传递到像素着色器,把纹理加载,把纹理绑定到合适的纹理单元。 +杩欏氨鏄痙iffuse璐村浘鐨勫叏閮ㄥ唴瀹逛簡銆傚氨鍍忎綘鐪嬪埌鐨勶紝杩欎笉鏄粈涔堟柊鐨勪笢瑗匡紝浣嗘槸瀹冨嵈鏋佸ぇ鎻愬崌浜嗚瑙夊搧璐ㄣ備负浜嗚瀹冨伐浣滐紝鎴戜滑闇瑕佺敤鍒扮汗鐞嗗潗鏍囨洿鏂伴《鐐规暟鎹紝鎶婂畠浠綔涓洪《鐐瑰睘鎬т紶閫掑埌鍍忕礌鐫鑹插櫒锛屾妸绾圭悊鍔犺浇锛屾妸绾圭悊缁戝畾鍒板悎閫傜殑绾圭悊鍗曞厓銆 -更新的顶点数据可以从这里找到。顶点数据现在包括了顶点位置,法线向量和纹理坐标,每个立方体的顶点都有这些属性。让我们更新顶点着色器来接受纹理坐标作为顶点属性,然后发送到像素着色器: +鏇存柊鐨勯《鐐规暟鎹彲浠ヤ粠杩欓噷鎵惧埌銆傞《鐐规暟鎹幇鍦ㄥ寘鎷簡椤剁偣浣嶇疆锛屾硶绾垮悜閲忓拰绾圭悊鍧愭爣锛屾瘡涓珛鏂逛綋鐨勯《鐐归兘鏈夎繖浜涘睘鎬с傝鎴戜滑鏇存柊椤剁偣鐫鑹插櫒鏉ユ帴鍙楃汗鐞嗗潗鏍囦綔涓洪《鐐瑰睘鎬э紝鐒跺悗鍙戦佸埌鍍忕礌鐫鑹插櫒锛 ```c++ #version 330 core layout (location = 0) in vec3 position; @@ -58,48 +60,48 @@ void main() TexCoords = texCoords; } ``` -要保证更新的顶点属性指针,不仅是VAO匹配新的顶点数据,也要把箱子图片加载为纹理。在绘制箱子之前,我们希望首选纹理单元被赋为material.diffuse这个uniform采样器,并绑定箱子的纹理到这个纹理单元: +瑕佷繚璇佹洿鏂扮殑椤剁偣灞炴ф寚閽堬紝涓嶄粎鏄疺AO鍖归厤鏂扮殑椤剁偣鏁版嵁锛屼篃瑕佹妸绠卞瓙鍥剧墖鍔犺浇涓虹汗鐞嗐傚湪缁樺埗绠卞瓙涔嬪墠锛屾垜浠笇鏈涢閫夌汗鐞嗗崟鍏冭璧嬩负material.diffuse杩欎釜uniform閲囨牱鍣紝骞剁粦瀹氱瀛愮殑绾圭悊鍒拌繖涓汗鐞嗗崟鍏冿細 ```c++ glUniform1i(glGetUniformLocation(lightingShader.Program, "material.diffuse"), 0); ... glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, diffuseMap); ``` -现在,使用一个diffuse贴图,我们在细节上再次获得惊人的提升,这次添加到箱子上的光照开始闪光了(名符其实)。你的箱子现在可能看起来像这样: +鐜板湪锛屼娇鐢ㄤ竴涓猟iffuse璐村浘锛屾垜浠湪缁嗚妭涓婂啀娆¤幏寰楁儕浜虹殑鎻愬崌锛岃繖娆℃坊鍔犲埌绠卞瓙涓婄殑鍏夌収寮濮嬮棯鍏変簡锛堝悕绗﹀叾瀹烇級銆備綘鐨勭瀛愮幇鍦ㄥ彲鑳界湅璧锋潵鍍忚繖鏍凤細 ![](http://www.learnopengl.com/img/lighting/materials_diffuse_map.png) -你可以在这里得到应用的全部代码。 +浣犲彲浠ュ湪杩欓噷寰楀埌搴旂敤鐨勫叏閮ㄤ唬鐮併 -##15.2 specular贴图 +## 闀滈潰璐村浘 -你可能注意到,specular高光看起来不怎么样,由于我们的物体是个箱子,大部分是木头,我们知道木头是不会有镜面高光的。我们通过把物体设置specular材质设置为vec3(0.0f)来修正它。但是这样意味着铁边会不再显示镜面高光,我们知道钢铁是会显示一些镜面高光的。我们会想要控制物体部分地显示镜面高光,它带有修改了的亮度。这个问题看起来和diffuse贴图的讨论一样。是巧合吗?我想不是。 +浣犲彲鑳芥敞鎰忓埌锛宻pecular楂樺厜鐪嬭捣鏉ヤ笉鎬庝箞鏍凤紝鐢变簬鎴戜滑鐨勭墿浣撴槸涓瀛愶紝澶ч儴鍒嗘槸鏈ㄥご锛屾垜浠煡閬撴湪澶存槸涓嶄細鏈夐暅闈㈤珮鍏夌殑銆傛垜浠氳繃鎶婄墿浣撹缃畇pecular鏉愯川璁剧疆涓簐ec3(0.0f)鏉ヤ慨姝e畠銆備絾鏄繖鏍锋剰鍛崇潃閾佽竟浼氫笉鍐嶆樉绀洪暅闈㈤珮鍏夛紝鎴戜滑鐭ラ亾閽㈤搧鏄細鏄剧ず涓浜涢暅闈㈤珮鍏夌殑銆傛垜浠細鎯宠鎺у埗鐗╀綋閮ㄥ垎鍦版樉绀洪暅闈㈤珮鍏夛紝瀹冨甫鏈変慨鏀逛簡鐨勪寒搴︺傝繖涓棶棰樼湅璧锋潵鍜宒iffuse璐村浘鐨勮璁轰竴鏍枫傛槸宸у悎鍚楋紵鎴戞兂涓嶆槸銆 -我们同样适用一个纹理贴图,来获得镜面高光。这意味着我们需要生成一个黑白(或者你喜欢的颜色)纹理来定义specular亮度,把它应用到物体的每个部分。下面是一个specular贴图的例子: +鎴戜滑鍚屾牱閫傜敤涓涓汗鐞嗚创鍥撅紝鏉ヨ幏寰楅暅闈㈤珮鍏夈傝繖鎰忓懗鐫鎴戜滑闇瑕佺敓鎴愪竴涓粦鐧斤紙鎴栬呬綘鍠滄鐨勯鑹诧級绾圭悊鏉ュ畾涔塻pecular浜害锛屾妸瀹冨簲鐢ㄥ埌鐗╀綋鐨勬瘡涓儴鍒嗐備笅闈㈡槸涓涓猻pecular璐村浘鐨勪緥瀛愶細 ![](http://www.learnopengl.com/img/textures/container2_specular.png) -一个specular高光的亮度可以通过图片中每个纹理的亮度来获得。specular贴图的每个像素可以显示为一个颜色向量,比如:在那里黑色代表颜色向量vec3(0.0f),灰色是vec3(0.5f)。在像素着色器中,我们采样相应的颜色值,把它乘以光的specular亮度。像素越“白”,乘积的结果越大,物体的specualr部分越亮。 +涓涓猻pecular楂樺厜鐨勪寒搴﹀彲浠ラ氳繃鍥剧墖涓瘡涓汗鐞嗙殑浜害鏉ヨ幏寰椼俿pecular璐村浘鐨勬瘡涓儚绱犲彲浠ユ樉绀轰负涓涓鑹插悜閲忥紝姣斿锛氬湪閭i噷榛戣壊浠h〃棰滆壊鍚戦噺vec3(0.0f)锛岀伆鑹叉槸vec3(0.5f)銆傚湪鍍忕礌鐫鑹插櫒涓紝鎴戜滑閲囨牱鐩稿簲鐨勯鑹插硷紝鎶婂畠涔樹互鍏夌殑specular浜害銆傚儚绱犺秺鈥滅櫧鈥濓紝涔樼Н鐨勭粨鏋滆秺澶э紝鐗╀綋鐨剆pecualr閮ㄥ垎瓒婁寒銆 -由于箱子几乎是由木头组成,木头作为一个材质不会有镜面高光,整个不透部分的diffuse纹理被用黑色覆盖:黑色部分不会包含任何specular高光。箱子的铁边有一个修改的specular亮度,它自身更容易受到镜面高光影响,木纹部分则不会。 +鐢变簬绠卞瓙鍑犱箮鏄敱鏈ㄥご缁勬垚锛屾湪澶翠綔涓轰竴涓潗璐ㄤ笉浼氭湁闀滈潰楂樺厜锛屾暣涓笉閫忛儴鍒嗙殑diffuse绾圭悊琚敤榛戣壊瑕嗙洊锛氶粦鑹查儴鍒嗕笉浼氬寘鍚换浣晄pecular楂樺厜銆傜瀛愮殑閾佽竟鏈変竴涓慨鏀圭殑specular浜害锛屽畠鑷韩鏇村鏄撳彈鍒伴暅闈㈤珮鍏夊奖鍝嶏紝鏈ㄧ汗閮ㄥ垎鍒欎笉浼氥 -从技术上来讲,木头也有镜面高光,尽管这个闪亮值很小(更多的光被散射),影响很小,但是为了学习目的,我们可以假装木头不会有任何specular光反射。 -使用Photoshop或Gimp之类的工具,剪切一些部分,非常容易变换一个diffuse纹理,为specular图片,以增加亮度/对比度的方式,可以把这个部分变换为黑色或白色。 +浠庢妧鏈笂鏉ヨ锛屾湪澶翠篃鏈夐暅闈㈤珮鍏夛紝灏界杩欎釜闂寒鍊煎緢灏忥紙鏇村鐨勫厜琚暎灏勶級锛屽奖鍝嶅緢灏忥紝浣嗘槸涓轰簡瀛︿範鐩殑锛屾垜浠彲浠ュ亣瑁呮湪澶翠笉浼氭湁浠讳綍specular鍏夊弽灏勩 +浣跨敤Photoshop鎴朑imp涔嬬被鐨勫伐鍏凤紝鍓垏涓浜涢儴鍒嗭紝闈炲父瀹规槗鍙樻崲涓涓猟iffuse绾圭悊锛屼负specular鍥剧墖锛屼互澧炲姞浜害/瀵规瘮搴︾殑鏂瑰紡锛屽彲浠ユ妸杩欎釜閮ㄥ垎鍙樻崲涓洪粦鑹叉垨鐧借壊銆 -###15.2.1 specular贴图采样 +###15.2.1 specular璐村浘閲囨牱 -一个specular贴图和其他纹理一样,所以代码和diffuse贴图的代码也相似。确保合理的加载了图片,生成一个纹理对象。由于我们在同样的像素着色器中使用另一个纹理采样器,我们必须为specular贴图使用一个不同的纹理单元(查看纹理),所以在渲染前让我们把它绑定到合适的纹理单元 +涓涓猻pecular璐村浘鍜屽叾浠栫汗鐞嗕竴鏍凤紝鎵浠ヤ唬鐮佸拰diffuse璐村浘鐨勪唬鐮佷篃鐩镐技銆傜‘淇濆悎鐞嗙殑鍔犺浇浜嗗浘鐗囷紝鐢熸垚涓涓汗鐞嗗璞°傜敱浜庢垜浠湪鍚屾牱鐨勫儚绱犵潃鑹插櫒涓娇鐢ㄥ彟涓涓汗鐞嗛噰鏍峰櫒锛屾垜浠繀椤讳负specular璐村浘浣跨敤涓涓笉鍚岀殑绾圭悊鍗曞厓锛堟煡鐪嬬汗鐞嗭級锛屾墍浠ュ湪娓叉煋鍓嶈鎴戜滑鎶婂畠缁戝畾鍒板悎閫傜殑绾圭悊鍗曞厓 ```c++ glUniform1i(glGetUniformLocation(lightingShader.Program, "material.specular"), 1); ... glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, specularMap); ``` -然后更新像素着色器材质属性,接受一个sampler2D作为这个specular部分的类型,而不是vec3: +鐒跺悗鏇存柊鍍忕礌鐫鑹插櫒鏉愯川灞炴э紝鎺ュ彈涓涓猻ampler2D浣滀负杩欎釜specular閮ㄥ垎鐨勭被鍨嬶紝鑰屼笉鏄痸ec3锛 ```c++ struct Material { @@ -108,20 +110,20 @@ struct Material float shininess; }; ``` -最后我们希望采样这个specular贴图,来获取原始像素相应的specular亮度: +鏈鍚庢垜浠笇鏈涢噰鏍疯繖涓猻pecular璐村浘锛屾潵鑾峰彇鍘熷鍍忕礌鐩稿簲鐨剆pecular浜害锛 ```c++ vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords)); vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords)); vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords)); color = vec4(ambient + diffuse + specular, 1.0f); ``` -通过使用一个specular贴图我们可以定义极为精细的细节,物体的这个部分会获得闪亮的属性,我们可以设置它们相应的亮度。specular贴图给我们一个附加的高于diffuse贴图的控制权限。 +閫氳繃浣跨敤涓涓猻pecular璐村浘鎴戜滑鍙互瀹氫箟鏋佷负绮剧粏鐨勭粏鑺傦紝鐗╀綋鐨勮繖涓儴鍒嗕細鑾峰緱闂寒鐨勫睘鎬э紝鎴戜滑鍙互璁剧疆瀹冧滑鐩稿簲鐨勪寒搴︺俿pecular璐村浘缁欐垜浠竴涓檮鍔犵殑楂樹簬diffuse璐村浘鐨勬帶鍒舵潈闄愩 -如果你不想成为主流,你可以在specular贴图里使用颜色,不单单为每个原始像素设置specular亮度,同时也设置specular高光的颜色。从真实角度来说,specular的颜色基本是由光源自身决定的,所以它不会生成真实的图像(这就是为什么图片通常是黑色和白色的:我们只关心亮度)。 -如果你现在运行应用,你可以清晰地看到箱子的材质现在非常类似真实的铁边的木头箱子了: +濡傛灉浣犱笉鎯虫垚涓轰富娴侊紝浣犲彲浠ュ湪specular璐村浘閲屼娇鐢ㄩ鑹诧紝涓嶅崟鍗曚负姣忎釜鍘熷鍍忕礌璁剧疆specular浜害锛屽悓鏃朵篃璁剧疆specular楂樺厜鐨勯鑹层備粠鐪熷疄瑙掑害鏉ヨ锛宻pecular鐨勯鑹插熀鏈槸鐢卞厜婧愯嚜韬喅瀹氱殑锛屾墍浠ュ畠涓嶄細鐢熸垚鐪熷疄鐨勫浘鍍忥紙杩欏氨鏄负浠涔堝浘鐗囬氬父鏄粦鑹插拰鐧借壊鐨勶細鎴戜滑鍙叧蹇冧寒搴︼級銆 +濡傛灉浣犵幇鍦ㄨ繍琛屽簲鐢紝浣犲彲浠ユ竻鏅板湴鐪嬪埌绠卞瓙鐨勬潗璐ㄧ幇鍦ㄩ潪甯哥被浼肩湡瀹炵殑閾佽竟鐨勬湪澶寸瀛愪簡锛 ![](http://www.learnopengl.com/img/lighting/materials_specular_map.png) -你可以在这里找到全部源码。也对比一下你的顶点着色器和像素着色器。 +浣犲彲浠ュ湪杩欓噷鎵惧埌鍏ㄩ儴婧愮爜銆備篃瀵规瘮涓涓嬩綘鐨勯《鐐圭潃鑹插櫒鍜屽儚绱犵潃鑹插櫒銆 -使用diffuse和specular贴图,我们可以给相关但简单物体添加一个极为明显的细节。我们可以使用其他纹理贴图,比如法线/bump贴图或者反射贴图,给物体添加更多的细节。但是这些在后面教程才会涉及。把你的箱子给你所有的朋友和家人看,有一天你会很满足,我们的箱子会比现在更漂亮! \ No newline at end of file +浣跨敤diffuse鍜宻pecular璐村浘锛屾垜浠彲浠ョ粰鐩稿叧浣嗙畝鍗曠墿浣撴坊鍔犱竴涓瀬涓烘槑鏄剧殑缁嗚妭銆傛垜浠彲浠ヤ娇鐢ㄥ叾浠栫汗鐞嗚创鍥撅紝姣斿娉曠嚎/bump璐村浘鎴栬呭弽灏勮创鍥撅紝缁欑墿浣撴坊鍔犳洿澶氱殑缁嗚妭銆備絾鏄繖浜涘湪鍚庨潰鏁欑▼鎵嶄細娑夊強銆傛妸浣犵殑绠卞瓙缁欎綘鎵鏈夌殑鏈嬪弸鍜屽浜虹湅锛屾湁涓澶╀綘浼氬緢婊¤冻锛屾垜浠殑绠卞瓙浼氭瘮鐜板湪鏇存紓浜紒 \ No newline at end of file diff --git a/02 Lighting/05 Light casters.md b/02 Lighting/05 Light casters.md index cd1a347..12ad71c 100644 --- a/02 Lighting/05 Light casters.md +++ b/02 Lighting/05 Light casters.md @@ -1,12 +1,14 @@ 鏈枃浣滆匤oeyDeVries锛岀敱[Django](http://bullteacher.com/16-light-casters.html)缈昏瘧鑷猍http://learnopengl.com](http://www.learnopengl.com/#!Lighting/Light-casters) +#鎶曞厜鐗 + 鎴戜滑鐩墠浣跨敤鐨勬墍鏈夊厜鐓ч兘鏉ヨ嚜浜庝竴涓崟鐙殑鍏夋簮锛岃繖鏄┖闂翠腑鐨勪竴涓偣銆傚畠鐨勬晥鏋滀笉閿欙紝浣嗘槸鍦ㄧ湡瀹炰笘鐣岋紝鎴戜滑鏈夊绉嶇被鍨嬬殑鍏夛紝瀹冧滑姣忎釜琛ㄧ幇閮戒笉鍚屻備竴涓厜婧愭妸鍏夋姇灏勫埌鐗╀綋涓婏紝鍙仛鎶曞厜銆傝繖涓暀绋嬮噷鎴戜滑璁ㄨ鍑犵涓嶅悓鐨勬姇鍏夌被鍨嬨傚涔犳ā鎷熶笉鍚岀殑鍏夋簮鏄綘鏈潵涓板瘜浣犵殑鍦烘櫙鐨勫彟涓涓伐鍏枫 鎴戜滑棣栧厛璁ㄨ瀹氬悜鍏夛紙directional light锛夛紝鎺ョ潃鏄綔涓轰箣鍓嶅鍒扮煡璇嗙殑鎵╁睍鐨勭偣鍏夛紙point light锛夛紝鏈鍚庢垜浠璁鸿仛鍏夌伅锛坰pot light锛夈備笅闈㈢殑鏁欑▼鎴戜滑浼氭妸杩欏嚑绉嶄笉鍚岀殑鍏夌被鍨嬫暣鍚堝埌涓涓満鏅腑銆 -##16.1 瀹氬悜鍏 +## 瀹氬悜鍏 褰撲竴涓厜婧愬緢杩滅殑鏃跺欙紝鏉ヨ嚜鍏夋簮鐨勬瘡鏉″厜绾挎帴杩戜簬骞宠銆傝繖鐪嬭捣鏉ュ氨鍍忔墍鏈夌殑鍏夌嚎鏉ヨ嚜浜庡悓涓涓柟鍚戯紝鏃犺鐗╀綋鍜岃瀵熻呭湪鍝効銆傚綋涓涓厜婧愯璁剧疆涓烘棤闄愯繙鏃讹紝瀹冭绉颁负瀹氬悜鍏夛紝鍥犱负鎵鏈夌殑鍏夌嚎閮芥湁鐫鍚屼竴涓柟鍚戯紱瀹冧細鐙珛浜庡厜婧愮殑浣嶇疆銆 @@ -94,7 +96,7 @@ else if(lightVector.w == 1.0) ![Latex Formula](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/Light_casters1.png) -鍦ㄨ繖閲孖鏄綋鍓嶇墖娈电殑鍏夌殑浜害锛宒浠h〃鐗囨鍒板厜婧愮殑璺濈銆備负浜嗚绠楄“鍑忓硷紝鎴戜滑瀹氫箟3涓」锛氬父鏁伴」Kc锛屼竴娆¢」Kl鍜屼簩娆¢」Kq銆 +鍦ㄨ繖閲![I](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/I.png)鏄綋鍓嶇墖娈电殑鍏夌殑浜害锛![d](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/d.png)浠h〃鐗囨鍒板厜婧愮殑璺濈銆備负浜嗚绠楄“鍑忓硷紝鎴戜滑瀹氫箟3涓」锛氬父鏁伴」![Kc](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/Kc.png)锛屼竴娆¢」![Kl](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/Kl.png)鍜屼簩娆¢」![Kq](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/Kq.png)銆 甯告暟椤归氬父鏄1.0锛屽畠鐨勪綔鐢ㄦ槸淇濊瘉鍧熷姘歌繙涓嶄細姣1灏忥紝鍥犱负瀹冨彲浠ュ埄鐢ㄤ竴瀹氱殑璺濈澧炲姞浜害锛岃繖涓粨鏋滀笉浼氬奖鍝嶅埌鎴戜滑鎵瀵绘壘鐨勩 涓娆¢」鐢ㄤ簬涓庤窛绂诲肩浉绉帮紝杩欏洖浠ョ嚎鎬х殑鏂瑰紡鍑忓皯浜害銆 @@ -110,89 +112,22 @@ else if(lightVector.w == 1.0) ###16.3.1 閫夋嫨姝g‘鐨勫 浣嗘槸锛屾垜浠妸杩欎笁涓」璁剧疆涓轰粈涔堝煎憿锛熸纭殑鍊肩殑璁剧疆鐢卞緢澶氬洜绱犲喅瀹氾細鐜銆佷綘甯屾湜鍏夋墍瑕嗙洊鐨勮窛绂昏寖鍥淬佸厜鐨勭被鍨嬬瓑銆傚ぇ澶氭暟鍦哄悎锛岃繖鏄粡楠岀殑闂锛屼篃瑕侀傚害璋冩暣銆備笅闈㈢殑琛ㄦ牸灞曠ず涓浜涘悇椤圭殑鍊硷紝瀹冧滑妯℃嫙鐜板疄锛堟煇绉嶇被鍨嬬殑锛夊厜婧愶紝瑕嗙洊鐗瑰畾鐨勫崐寰勶紙璺濈锛夈傜涓钃濆畾涔変竴涓厜鐨勮窛绂伙紝瀹冭鐩栨墍缁欏畾鐨勯」銆傝繖浜涘兼槸澶у鏁板厜鐨勮壇濂藉紑濮嬶紝瀹冩槸鏉ヨ嚜Ogre3D鐨勭淮鍩虹殑绀肩墿锛 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DistanceConstantLinearQuadratic
71.00.71.8
131.00.350.44
201.00.220.20
321.00.140.07
501.00.090.032
651.00.070.017
1001.00.0450.0075
1601.00.0270.0028
2001.00.0220.0019
3251.00.0140.0007
6001.00.0070.0002
32501.00.00140.000007
-灏卞儚浣犳墍鐪嬪埌鐨勶紝甯告暟椤筀c涓鐩撮兘鏄1.0銆備竴娆¢」Kl涓轰簡瑕嗙洊鏇磋繙鐨勮窛绂婚氬父寰堝皬锛屼簩娆¢」Kq灏辨洿灏忎簡銆傚皾璇曠敤杩欎簺鍊艰繘琛屽疄楠岋紝鐪嬬湅瀹冧滑鍦ㄤ綘鐨勫疄鐜颁腑鍚勮嚜鐨勬晥鏋溿傛垜浠殑鐜涓紝32鍒100鐨勮窛绂诲澶у鏁板厜閫氬父灏辫冻澶熶簡銆 + +Distance|Constant|Linear|Quadratic +-------|------|-----|------ +7|1.0|0.7|1.8 +13|1.0|0.35|0.44 +20|1.0|0.22|0.20 +32|1.0|0.14|0.07 +50|1.0|0.09|0.032 +65|1.0|0.07|0.017 +100|1.0|0.045|0.0075 +160|1.0|0.027|0.0028 +200|1.0|0.022|0.0019 +325|1.0|0.014|0.0007 +600|1.0|0.007|0.0002 +3250|1.0|0.0014|0.000007 +灏卞儚浣犳墍鐪嬪埌鐨勶紝甯告暟椤![Kc](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/Kc.png)涓鐩撮兘鏄1.0銆備竴娆¢」![Kl](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/Kl.png)涓轰簡瑕嗙洊鏇磋繙鐨勮窛绂婚氬父寰堝皬锛屼簩娆¢」![Kq](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/Kq.png)灏辨洿灏忎簡銆傚皾璇曠敤杩欎簺鍊艰繘琛屽疄楠岋紝鐪嬬湅瀹冧滑鍦ㄤ綘鐨勫疄鐜颁腑鍚勮嚜鐨勬晥鏋溿傛垜浠殑鐜涓紝32鍒100鐨勮窛绂诲澶у鏁板厜閫氬父灏辫冻澶熶簡銆 @@ -316,94 +251,21 @@ color = vec4(light.ambient*vec3(texture(material.diffuse,TexCoords)), 1.0f); 涓哄垱寤哄鍦嗛敟锛屾垜浠畝鍗曞畾涔夊彟涓涓綑寮﹀硷紝瀹冧唬琛ㄨ仛鍏夌伅鐨勬柟鍚戝悜閲忓拰澶栧渾閿ョ殑鍚戦噺锛堢瓑浜庡畠鐨勫崐寰勶級鐨勮搴︺傜劧鍚庯紝濡傛灉鐗囨鍦ㄥ唴鍦嗛敟鍜屽鍦嗛敟涔嬮棿锛屽氨浼氱粰瀹冭绠楀嚭涓涓0.0鍒1.0涔嬮棿鐨勪寒搴︺傚鏋滅墖娈靛湪鍐呭渾閿ヤ互鍐呰繖涓寒搴﹀氨绛変簬1.0锛屽鏋滃湪澶栭潰灏辨槸0.0銆 鎴戜滑鍙互浣跨敤涓嬮潰鐨勫叕寮忚绠楄繖鏍风殑鍊硷細 -[math] -杩欓噷蔚鏄唴閮紙蠁锛夊拰澶栭儴鍦嗛敟[math]鐨勫樊銆傜粨鏋淚鐨勫兼槸鑱氬厜鐏湪褰撳墠鐗囨鐨勪寒搴︺ +![Latex Formula](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/Light_casters1.png) +杩欓噷![Epsilon](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/epsilon.png)鏄唴閮紙![Phi](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/phi.png)锛夊拰澶栭儴鍦嗛敟(![Gamma](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/gamma.png))![Latex Formula](https://raw.githubusercontent.com/LearnOpenGL-CN/LearnOpenGL-CN/master/img/Light_casters3.png)鐨勫樊銆傜粨鏋淚鐨勫兼槸鑱氬厜鐏湪褰撳墠鐗囨鐨勪寒搴︺ 寰堥毦鐢ㄥ浘鐢绘弿杩板嚭杩欎釜鍏紡鏄庢牱宸ヤ綔鐨勶紝鎵浠ユ垜浠皾璇曚娇鐢ㄤ竴涓緥瀛愶細 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
in degrees(inner cutoff)in degrees(outer cutoff)in degreesI
0.87300.91250.82350.91 鈥 0.82 = 0.090.87 鈥 0.82 / 0.09 = 0.56
0.9260.91250.82350.91 鈥 0.82 = 0.090.9 鈥 0.82 / 0.09 = 0.89
0.97140.91250.82350.91 鈥 0.82 = 0.090.97 鈥 0.82 / 0.09 = 1.67
0.97140.91250.82350.91 鈥 0.82 = 0.090.97 鈥 0.82 / 0.09 = 1.67
0.83340.91250.82350.91 鈥 0.82 = 0.090.83 鈥 0.82 / 0.09 = 0.11
0.64500.91250.82350.91 鈥 0.82 = 0.090.64 鈥 0.82 / 0.09 = -2.0
0.966150.997812.50.95317.50.966 鈥 0.953 = 0.04480.966 鈥 0.953 / 0.0448 = 0.29
+ + +胃|胃 in degrees|蠁 (inner cutoff)|蠁 in degrees|纬 (outer cutoff)|纬 in degrees|蔚|l +--|---|---|---|---|---|---|--- +0.87|30|0.91|25|0.82|35|0.91 - 0.82 = 0.09|0.87 - 0.82 / 0.09 = 0.56 +0.9|26|0.91|25|0.82|35|0.91 - 0.82 = 0.09|0.9 - 0.82 / 0.09 = 0.89 +0.97|14|0.91|25|0.82|35|0.91 - 0.82 = 0.09|0.97 - 0.82 / 0.09 = 1.67 +0.97|14|0.91|25|0.82|35|0.91 - 0.82 = 0.09|0.97 - 0.82 / 0.09 = 1.67 +0.83|34|0.91|25|0.82|35|0.91 - 0.82 = 0.09|0.83 - 0.82 / 0.09 = 0.11 +0.64|50|0.91|25|0.82|35|0.91 - 0.82 = 0.09|0.64 - 0.82 / 0.09 = -2.0 +0.966|15|0.9978|12.5|0.953|17.5|0.966 - 0.953 = 0.0448|0.966 - 0.953 / 0.0448 = 0.29 灏卞儚浣犵湅鍒扮殑閭f牱鎴戜滑鍩烘湰鏄牴鎹稿湪澶栦綑寮﹀拰鍐呬綑寮︿箣闂存彃鍊笺傚鏋滀綘浠嶇劧涓嶆槑鐧芥庝箞缁х画锛屼笉瑕佹媴蹇冦備綘鍙互绠鍗曠殑浣跨敤杩欎釜鍏紡璁$畻锛屽綋浣犳洿鍔犺侀亾鍜屾槑鐧界殑鏃跺欏啀鏉ョ湅銆 鐢变簬鎴戜滑鐜板湪鏈変簡涓涓寒搴﹀硷紝褰撳湪鑱氬厜鐏鐨勬椂鍊欐槸涓礋鐨勶紝褰撳湪鍐呴儴鍦嗛敟浠ュ唴澶т簬1銆傚鏋滄垜浠傚綋鍦版妸杩欎釜鍊煎浐瀹氾紝鎴戜滑鍦ㄥ儚绱犵潃鑹插櫒涓氨鍐嶄笉闇瑕乮f-else浜嗭紝鎴戜滑鍙互绠鍗曞湴鐢ㄨ绠楀嚭鐨勪寒搴﹀间箻浠ュ厜鐨勫厓绱狅細 diff --git a/05 Advanced Lighting/06 HDR.md b/05 Advanced Lighting/06 HDR.md index 77d5826..1adb82e 100644 --- a/05 Advanced Lighting/06 HDR.md +++ b/05 Advanced Lighting/06 HDR.md @@ -1,4 +1,4 @@ -鏈枃浣滆匤oeyDeVries锛岀敱Meow J缈昏瘧鑷猍http://learnopengl.com](http://learnopengl.com/#!Getting-started/Shaders) +鏈枃浣滆匤oeyDeVries锛岀敱Meow J缈昏瘧鑷猍http://learnopengl.com](http://learnopengl.com/#!Advanced-Lighting/HDR) ## HDR diff --git a/05 Advanced Lighting/07 Bloom.md b/05 Advanced Lighting/07 Bloom.md deleted file mode 100644 index fd7f075..0000000 --- a/05 Advanced Lighting/07 Bloom.md +++ /dev/null @@ -1,5 +0,0 @@ -鏈枃浣滆匤oeyDeVries锛岀敱Meow J缈昏瘧鑷猍http://learnopengl.com](http://learnopengl.com/#!Getting-started/Shaders) - -## 娉涘厜(Bloom) - -#WIP \ No newline at end of file diff --git a/img/I.png b/img/I.png new file mode 100644 index 0000000000000000000000000000000000000000..4bd389f521ab6bed20fe3db513d7c7eb9d9668e6 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^+(697!2%?MGxX$u6id3JuOkD)#(wTUiL5|AV{wqX z6T`Z5GB1G~g=CK)Uj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G& z@^*J&_}|`tWO>_45U54*zIJt9gvaY>Eak7aXIv?qiBNx56eYH&8tqj4;eW# zRnT0htDHlxknw?1sI?z@?!%t`INCvM5H z`EyOiw$o|5ZQg{=`=-Ty==G)smxYQh54%3IdrF7@d?9eu9%!FxiEBhjN@7W>RdP`( zkYX@0Ff`RQFxNFO4l%H>GBmX^GS)UQure@+$@c}h8lfRKKP5A*61N6jqp!?B4eTHr za)3rxFnFeQMt=kf@qmPq^KRKbLh*2~7ZlY=J)j literal 0 HcmV?d00001 diff --git a/img/Kc.png b/img/Kc.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a0e3789df6bb72f897c1a5edb3963f83271bfb GIT binary patch literal 576 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoP!2%>%)c0zGsB}kPM+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE z?e4>+sSM@Amfv#i(`n!`QAyf6Av5kwAhz(9gyHrln7!w zD8Qk~=Io)#;^d`x{J`-A*NtveuXudx=WH+iNyoI`dpYfy+sCM=#+I|@?9{9}RhI4) ztxs)&>R$Gf&s;fRdpi1GNn&oKfB%Z)oR6>nX(#z;xQW*N{wX9h^}?n1%tjohhuo_k zauj(j(mQatB6jCPpTql}dS$d8&~4xA?$e_w7r1jDFNf(O?GoPV3B}7))&`b;_D)_C zx0B^@Wl9vsXTM8FSKi@mj0*V3a{54vz+s=>zJ?3W552hWwK0VKv;Mz|OF40$9wuBq zI`_x9x`INEy%)nd9`6vUNZk3CnQ^n#_Gvk9{sDcjTH+c}l9E`GYL#4+3Zxi}3=BkHOH?pv%qv8Bm77)78&q Iol`;+050jw=l}o! literal 0 HcmV?d00001 diff --git a/img/Kl.png b/img/Kl.png new file mode 100644 index 0000000000000000000000000000000000000000..4b99f9fed4d675a35f560bd95f2026ee6b267386 GIT binary patch literal 574 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6K!2%?u-u2D^QY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|6p}rHd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_HU8X#UUXIG#NP=YDR z+ueoXe|!I#{XiaPfk$L9koEv$x0Bg+K*k487sn8d^SzT23lAIcwA#OCJ0QWNC=tVU zRDk0qZq6-4@42B@Uxz!<$Z&6fu=nDjG6PYjg%tiT=;9U>~=~@48x?eeFvWV zeLRq~OZawO%9g!NzVCZ@Dlgx$^Vs_B%bga6^Jkg_j2AZ=JALm@j4^j^pR;9~71#cY zm#?Q+<;KOc6j-&C3GY{l{m)>ZEBD~EOvEmr-&IRoBT7;dOH!?pi&B9UgOP!usjh*! zu7PogfrXW!xs{=@wt<0_fx$J=S&1kba`RI%(<*UmSni>87pQ>~WJ3Q|pg12$yePFeKc}=LGe3{P(A1#I&HfoshQZU-&t;uc GLK6U9S literal 0 HcmV?d00001 diff --git a/img/Kq.png b/img/Kq.png new file mode 100644 index 0000000000000000000000000000000000000000..0b4223a1e12cfb30a89f41647b831ecf5e47fec5 GIT binary patch literal 612 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)q!2%>diJDCSQY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|6p}rHd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9 z$=lt9;eUJonf*W>XMsm#F_88EW4Dvpc0i-WJY5_^EKX0Ia8r8`S^=C9z=rgsf11m3pYFW|9q z?FmaXoynh-{8iL5_hrGH!aGj6;wDk%fg8gjWR@;)5lN7oA(+I$eCd(EubVc%T&=y{ zojjDb;{M9oorc#mlaD3sta_*X|AmOe)Y;1?ZcUFnYn^`K>qEbN@tbo_InP=2cg`gD zAL;Yu{_p?6woJRCu|QeA1{hSTC9V-ADTyViR>?)FK#IZ0z|d6Jz+BhBIK;rh%Fx`( z*g)IBz{5cYA6b-rgDVb@NxHVj9wYLRo-~`!_12npV!8^WiWzvt8KtUdmU~+y= wei4HK7#y1aZ6Q#c4FVdQ&MBb@07NX@T>t<8 literal 0 HcmV?d00001 diff --git a/img/Light_casters2.png b/img/Light_casters2.png new file mode 100644 index 0000000000000000000000000000000000000000..2c0f5bba0bf30eeeb6ac2c94b82c8372151200cb GIT binary patch literal 1135 zcmeAS@N?(olHy`uVBq!ia0vp^r9f=S!2%=~O<$t`q*&4&eH|GXHuiJ>Nn{1`8Huup|2Z6TvXO}c|Up}~$ z`Q}Q670i$LbjlmtMN_8md9Zh0Vf13{yu+yFc;Vo)b_1Dd$tjI|OD>*XzgM!X@}_^E z@KX5>#RHozY}N06U!^4VNjhSZ$Ahygz7-fcZtQY$d3HLBKW=KnjNeKH*Cix>ZhSp= zmBh0(U)>d-H7pmXdp}z%n5TScN@IT=PxZG|5=up}Q@H2sd@!*$R7y&JA4CB)uZmoIid2 zRd3dlec7#&r&c-t)m%KQeexsL^CDkk8ts|;`(&6tc1xyjh}pX+b8)}*_m(5?R_Uc^ zxfL(F-SvL@D#l5lF6vCHnz+i~;XcRfd2i#g{^dMXZ`8Rd@;Z*$VyOhj=?`;dcbc8) znAdbm|LWA}mJ=ro+_$E8tiJVN`+6(+9HGP=w>fwEEwtPodg#a3S1fmb33dxrZ&(p} zr()@<2|`*DVR0Q&+qeFd`+oe0(X+1nb22qHcdkT5|73FtyZw^Y)wA=@uiqMRz2$8I z?q@zsa-O$hSzhb<&;&z?f5!Xg$Q@~le)#&V8p93Qoqi&Vqn6n%wql!BYoC}dVQo8g z`kq;PTyGx;oV|YOtxsakY%%kF8SI;1U;TXQO8CmYmG!>w9GEU1%ih5Gz|WhJ*VS|S zr9FqYznmSU9BLRL)g3f@zUQUu^EWVsGUOY7t%*9zw~8U}%$02cFQ;eSU7h~s@}yUF zGplZi?pPrzWOQHs$Pu%wJ2K_MPYZ0GzM41l)%)_g?-lF{ZP5?%@ADVOaB!N>aEhAz zIdui&jagaeYws#oSv@RTSOtStA*m`G*QiV_>3{eo^~+x7{nz#ODlW9RQ268Nf0J9c z|7J!c-hQ7l&xzsuMw>17Ps;pB&|u{Ju<&n+-5-X3TnASDm~!sxubP!n4|dya2{-u@ zbN1zn15ZD!{P)u9;)j)b4b7i7x9vOLY|GZc88uI1vk%`@;~#0v3d(6~8nw-AWNwxH zW8{(f*)DDMej6}TsFt`!l%yn@ zPt46ttgVhoEhx^+$*+WzlgyA3=Ylzwh$=J2NEwzEzZv=Ey>K! X1KMuzwY(HmA~1Nm`njxgN@xNALk#N_ literal 0 HcmV?d00001 diff --git a/img/Light_casters3.png b/img/Light_casters3.png new file mode 100644 index 0000000000000000000000000000000000000000..3add000fe3969cdda749d0e59e13b4ef634a5ba8 GIT binary patch literal 887 zcmeAS@N?(olHy`uVBq!ia0vp^g+MIH!2%@LT;R+BQY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|6p}rHd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9 z$=lt9;eUJonf*W>XMsm#F_88EW4Dvpc0d)vo-U3d5r^+if1P{VK%{lQbPB^&Wdmu0 zmn=)o0(Lu2<&{Zka=Lrq?t)UY3FaPCc%KNS{<2G_zpah9%0aqH$Ty81UXcuI$r!4k8!RA)!e&cJB~ zGSOaq8mhB@25xww!M;iP{k8utPc&ZdKm6z)qq047zJ|pFp^1rxIRTd6c@W~kqk?pw%U)sep14h=M$Gd=)Sh; z>F#UWYgiWu{9k9s`q#gS@38mxNW;j-<_@MticbrZPVN>y|ITH>eT$ocmGymc*B8t@ zY$7c-%~8=~+L5D^Hhw!;?aVvna#V+3l%16+(><%Fzn1;y`7^^ji7naR|X0hOv_$fapQD|2$u)XmzQEai(FcEb40VX? z(H`+oL+Vhf(w~>|_6&6|mT9dD`Irn$C#of`5hW>!C8<`)MX5lF!N|bSRM)^<*T6W$ zz{1MN%*wz>+rYrez~I!2IVC6>a`RI%(<*Um*u7Qd1WO>_45U54*zIJt9gs2C)5S4F;&SS_K;I()A}tT!n{n)5WS{EL z)clA+M<>Wb)kMR=`SpT@d@GnQl^Xos5bN|}=63t~XFWfp=Uzh(48+k?xI`P))k@d@{`X%v7L5RZCnW zN>UO_QmvAUQh^kMk%6J9u7SC(fpLg|g_WV1m65Twfq|8Q!S;x6dr&mw=BH$)RpQog zjMWdQo`D@?Lk`gB3WgNrFm_>R;L!YU3xVQ%An~Hq;{2S_lFa-( X218SWE;svUAX7YD{an^LB{Ts5iw&hM literal 0 HcmV?d00001 diff --git a/img/epsilon.png b/img/epsilon.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc22d93f1de94a8547ec88fb13006d3ada2feca GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^AT|#N3y}Pn^h6s-v7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgBWNcITwWnidMV_;}#VPN~y z1Cv-6^MwF?3kN1gCJ%*D1DiV&J{8}4mSVm+dQngnyR>eZ(iXi(E4DV~*jU8wPseuX+N5;^)|G_*Qc250ldd z2QAl}h%lflR7+eVN>UO_QmvAUQh^kMk%6J9u7SC(fpLg|g_V(+m64^kfq|8QLD#AC zpHVdA=BH$)RpQq0dwRJ)Py-*xh8&>L6$~+{1;v>;`FTC_#EgJ4JRq6m{G9wE1_LlS mH2>Q|n2w^<;{2S_lFa-(pbZ9J%S%Dw&EVp0*}aIAngIhZYQ(tfQ)KS7sn8Z%eiM01)CUnj((I^QD7E4!@zsO zK|JSyWFtqEqf`d7t(1*DgS^YVyzOuQ-JZ=cclnN$Npn|ET2yXoxw=>E>dckBr{i{H zI4$SHobDSkiJUKrnzlgyA3=Ylz owh$=J2U1^@TAZI#T9TQc$6#n`(B)?T3@F3k>FVdQ&MBb@07fN_=l}o! literal 0 HcmV?d00001 diff --git a/img/phi.png b/img/phi.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1877540d6ab90d17e1f86f4843418f17cf41d3 GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bM!2%@TDA-2>DVB6cUq=Rpjs4tz5?O(K#^NA% zCx&(BWL^R}3dtTpz6=aiY77hwEes65fI%cV=qOioFaOIm`==h5j)4`(*Ro0Hy|w z*Ax5Xn3BJJI+WsYT8jPeLd7-Jrk3vgXLg+G&$;gvf0cJw=(FgS z`lV8!lT}MxBT7;dOH!?pi&B9UgOP!usjh*!u7PogfrXW^ft9JTwt<0_fx(OSX38iU za`RI%(<*Umn7OHMK2QS}$c7xC(G?6a1sRz-0v*86X5aydCg`THmwy%v7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgBWNcITwWnidMV_;}#VPN7*{m5I5Pk*T(Uft7*5DwD`BC>nC}Q!>*kacj7p`4AKsJRlo#fJRp^ z#FS*DmL$HBU;&0dL_9e^C%=fn01OVz|F#e)&IeLolv^kKmhJ!m literal 0 HcmV?d00001 diff --git a/01 Getting started/04 Hello Triangle.md b/old/01/04 Hello Triangle.md similarity index 100% rename from 01 Getting started/04 Hello Triangle.md rename to old/01/04 Hello Triangle.md diff --git a/01 Getting started/05 Shaders.md b/old/01/05 Shaders.md similarity index 58% rename from 01 Getting started/05 Shaders.md rename to old/01/05 Shaders.md index e14fa87..f693d85 100644 --- a/01 Getting started/05 Shaders.md +++ b/old/01/05 Shaders.md @@ -11,26 +11,31 @@ GLSL鏄啓娉曠被浼糃璇█锛孏LSL鏄笓闂ㄩ拡瀵瑰浘褰互鍙婂悜閲忓拰鐭╅樀鍙 鐫鑹插櫒閫氬父鍏锋湁浠ヤ笅缁撴瀯锛 +```c++ +#version version_number + +in type in_variable_name; +in type in_variable_name; - #version version_number - in type in_variable_name; - in type in_variable_name; - 6.2 Types 52 - out type out_variable_name; - uniform type uniform_name; - int main() - { - // Process input(s) and do some weird graphics stuff - ... - // Output processed stuff to output variable - out_variable_name = weird_stuff_we_processed; - } +out type out_variable_name; + +uniform type uniform_name; + +int main() +{ + // Process input(s) and do some weird graphics stuff + ... + // Output processed stuff to output variable + out_variable_name = weird_stuff_we_processed; +} +``` 鎵璋撶殑椤剁偣鐫鑹插櫒灏辫椤剁偣灞炴т綔涓鸿緭鍏ョ殑鐫鑹插櫒锛岄《鐐瑰睘鎬х殑涓暟涓昏鍙楅檺浜庣‖浠跺疄鐜帮紝OpenGL鐨勪繚璇佹绘湁鑷冲皯16涓洓鍒嗛噺鐨勯《鐐瑰彲浠ヤ娇鐢紝浣嗘槸纭欢鍙兘涓浜涳紝鍙互閫氳繃鏌ヨ锛**GL_MAX_VERTEX_ATTRIBS** - - GLint nrAttributes; - glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes); - std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes << std::endl; +```c++ +GLint nrAttributes; +glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes); +std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes << std::endl; +``` 杩欎釜缁撴灉鏈灏忚繑鍥16锛屼竴鑸儏鍐典笅浣跨敤銆 @@ -52,49 +57,58 @@ GLSL璺熶竴鑸殑缂栫▼璇█涓鏍凤紝瀹氫箟浜嗕竴浜涘父鐢ㄧ殑鏁版嵁绫诲瀷锛屽熀 澶у鏁版儏鍐典笅鎴戜滑浣跨敤vecn锛屽洜涓烘诞鐐瑰瀷瓒冲婊¤冻鎴戜滑澶у鏁伴渶姹傘 鍚戦噺鐨勫垎閲忓彲浠ラ氳繃vec.x鏉ヨ闂涓涓垎閲忥紝鍚屾椂鍙互浣跨敤.x,.y,.z,.w鏉ヨ闂竴涓悜閲忕殑鍥涗釜鎴愬憳锛屽悓鏍峰彲浠ヤ娇鐢╮gba鏉ヨ闂鑹插煎搴旂殑鍚戦噺锛岀汗鐞嗗潗鏍囧垯鍙互浣跨敤stpq鏉ヨ闂垎閲忕殑鍊笺 鍚戦噺鐨勮闂柟寮忔敮鎸佽叮鍛虫у拰鎵╁睍鎬э紝琚О涓轰氦鍙夋贩鍚堟э紝瀹炰緥濡備笅锛 - - vec2 someVec; - vec4 differentVec = someVec.xyxx; - vec3 anotherVec = differentVec.zyw; - vec4 otherVec = someVec.xxxx + anotherVec.yxzy; +```c++ +vec2 someVec; +vec4 differentVec = someVec.xyxx; +vec3 anotherVec = differentVec.zyw; +vec4 otherVec = someVec.xxxx + anotherVec.yxzy; +``` 鍙互浣跨敤浠绘剰缁勫悎鏉ョ粍鎴愭柊鍚戦噺锛屽悓鏃朵篃鍙互鎶婄淮搴﹀皬鐨勫悜閲忔斁鍦ㄩ珮绾害鍚戦噺鐨勬瀯閫犲嚱鏁伴噷鏉ユ瀯鎴愭柊鐨勫悜閲忋傚涓嬩唬鐮侊細 - - vec2 vect = vec2(0.5f, 0.7f); - vec4 result = vec4(vect, 0.0f, 0.0f); - vec4 otherResult = vec4(result.xyz, 1.0f); - +```c++ +vec2 vect = vec2(0.5f, 0.7f); +vec4 result = vec4(vect, 0.0f, 0.0f); +vec4 otherResult = vec4(result.xyz, 1.0f); +``` ###杈撳叆鍜岃緭鍑 鐫鑹插櫒鏄繍琛屽湪GPU涓婄殑灏忕▼搴忥紝浣嗘槸楹婚泙铏藉皬浜旇剰淇卞叏锛屼篃浼氭湁杈撳叆鍜岃緭鍑烘潵鏋勬垚瀹屾暣鐨勭▼搴忥紝GLSL浣跨敤in鍜宱ut鍏抽敭瀛楁潵瀹氫箟杈撳叆鍜岃緭鍑恒傛瘡涓潃鑹插櫒鍙互鏄繖浜涘叧閿瓧鏉ユ寚瀹氳緭鍏ュ拰杈撳嚭锛岃緭鍏ュ彉閲忕粡杩囧鐞嗕互鍚庝細寰楀埌閫傚悎涓嬩釜澶勭悊闃舵鍙互浣跨敤鐨勮緭鍑哄彉閲忥紝椤剁偣鐫鑹插櫒鍜岀墖娈电潃鑹插櫒鏈夌偣灏忓嵈鍒 椤剁偣鐫鑹插櫒鎺ュ彈鐗瑰畾鏍煎紡鐨勮緭鍏ワ紝鍚﹀垯涓嶈兘姝g‘浣跨敤銆傞《鐐圭潃鑹插櫒鐩存帴鎺ュ彈杈撳叆鐨勯《鐐规暟鎹紝浣嗘槸闇瑕佸湪CPU涓杈规寚瀹氭暟鎹殑瀵瑰簲鐨勪綅缃紝鍓嶉潰鐨勬暀绋嬪彲浠ュ埌瀵逛綅缃0鐨勮緭鍏ワ紙location=0锛夛紝鎵浠ラ《鐐圭潃鑹插櫒闇瑕佷竴涓壒瀹氱殑澹版槑鏉ョ‘瀹欳PU鍜孏PU鏁版嵁瀵瑰簲鍏宠仈鍏崇郴锛 - 涔熷彲浠ヤ娇鐢*glGetAttribLocation*鏉ユ煡璇㈠搴旂殑浣嶇疆锛岃繖鏍峰彲浠ョ渷鐣ayout鐨勫0鏄庯紝浣嗘槸鎴戣寰楀彲浠ユ槸鐢╨ayout澹版槑姣旇緝濂斤紝杩欎篃鍙互鍑忓皯GPU鐨勪竴浜涘伐浣 +
+涔熷彲浠ヤ娇鐢*glGetAttribLocation*鏉ユ煡璇㈠搴旂殑浣嶇疆锛岃繖鏍峰彲浠ョ渷鐣ayout鐨勫0鏄庯紝浣嗘槸鎴戣寰楀彲浠ユ槸鐢╨ayout澹版槑姣旇緝濂斤紝杩欎篃鍙互鍑忓皯GPU鐨勪竴浜涘伐浣 +
+ + 瀵逛簬鐗囨鐫鑹插櫒鏈変釜vec4鐨勯鑹蹭綔涓虹壒瀹氱殑杈撳嚭锛屽洜涓虹墖娈靛鐞嗗悗鏈缁堟槸瑕佺敓浜т竴涓鑹叉潵鏄剧ず鐨勩傚惁鍒欏皢杈撳嚭榛戣壊鎴栫櫧鑹查鑹蹭綔涓鸿緭鍑恒 濡傛灉鎴戜滑鎯充粠涓涓潃鑹插櫒鍚戝彟澶栦竴涓彂閫佹暟鎹紝鎴戜滑闇瑕佸湪鍙戦佹柟瀹氫箟涓涓緭鍑猴紝鐒跺悗鍐嶆帴鏀舵柟椤朵竴涓緭鍏ワ紝鍚屾椂淇濊瘉杩欎袱涓彉閲忕被鍨嬪拰鍚嶅瓧鏄浉鍚岀殑銆 涓嬮潰鏄竴涓疄渚嬫潵灞曠ず濡備綍浠庨《鐐圭潃鑹插櫒浼犻掍竴涓鑹插艰窡鐗囨鐫鑹插櫒浣跨敤锛 ***椤剁偣鐫鑹插櫒*** +```c++ +#version 330 core +layout (location = 0) in vec3 position; // The position variable has attribute position 0 + +out vec4 vertexColor; // Specify a color output to the fragment shader - #version 330 core - layout (location = 0) in vec3 position; // The position variable has attribute position 0 - out vec4 vertexColor; // Specify a color output to the fragment shader - void main() - { - gl_Position = vec4(position, 1.0); - vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f); - } - +void main() +{ + gl_Position = vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor + vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f); // Set the output variable to a dark-red color +} +``` ***鐗囨鐫鑹插櫒*** +```c++ +#version 330 core +in vec4 vertexColor; // The input variable from the vertex shader (same name and same type) + +out vec4 color; - #version 330 core - in vec4 vertexColor; // 浠庨《鐐圭潃鑹插櫒鑾峰緱杈撳叆 (鍚嶅瓧鍜岀被鍨嬮兘鏄竴鏍风殑) - out vec4 color; - void main() - { - color = vertexColor; - } - +void main() +{ + color = vertexColor; +} +``` 鍙互鐪嬪埌鍦ㄩ《鐐圭潃鑹插櫒鐢熷懡浜嗕竴涓悜閲忥細*vertexColor* 鏈塷ut淇グ锛屽悓鏃跺湪鐗囨鐫鑹插櫒澹版槑浜嗕竴涓*vertexColor* 浣跨敤in鏉ヤ慨楗帮紝杩欐牱鐗囨鐫鑹插櫒灏卞彲浠ヨ幏鍙栭《鐐圭潃鑹插櫒澶勭悊鐨*vertexColor*鐨勭粨鏋滀簡銆 鏍规嵁涓婇潰shader锛屽彲浠ュ緱鍑轰笅鍥剧殑鏁堟灉锛 @@ -109,26 +123,30 @@ GLSL璺熶竴鑸殑缂栫▼璇█涓鏍凤紝瀹氫箟浜嗕竴浜涘父鐢ㄧ殑鏁版嵁绫诲瀷锛屽熀 2.涓嶅彉鎬э紝涓鏃﹁缃簡鍊硷紝鍦ㄦ覆鏌撹繃绋嬩腑灏变笉鑳借鏀瑰彉锛屽彧鏈変粠鏂拌缃墠鑳芥敼鍙樸 澹版槑甯搁噺闈炲父绠鍗曚娇鐢╱niform 鏀惧湪绫诲瀷鍜屽彉閲忓悕鍓嶉潰鍗冲彲銆備笅闈㈢湅涓涓緥瀛愶細 +```c++ +#version 330 core + +out vec4 color; + +uniform vec4 ourColor; // We set this variable in the OpenGL code. - #version 330 core - out vec4 color; - uniform vec4 ourColor; // - code. - void main() - { - color = ourColor; - } +void main() +{ + color = ourColor; +} +``` 澹版槑浜嗕竴涓猳urColor涓哄父閲忕被鍨嬶紝鐒跺悗鎶婂畠鐨勫间粯缁欎簡杈撳嚭鍙橀噺color銆 - - 娉ㄦ剰锛氬鏋滃0鏄庝簡涓涓粠鏉ユ病鐢ㄥ埌甯搁噺锛孏LSL鐨勭紪璇戝櫒浼氶粯璁ゅ垹闄よ繖涓父閲忥紝鐢辨鍙兘瀵艰嚧涓浜涜帿鍚嶇殑闂銆 +
+娉ㄦ剰锛氬鏋滃0鏄庝簡涓涓粠鏉ユ病鐢ㄥ埌甯搁噺锛孏LSL鐨勭紪璇戝櫒浼氶粯璁ゅ垹闄よ繖涓父閲忥紝鐢辨鍙兘瀵艰嚧涓浜涜帿鍚嶇殑闂銆 +
鐜板湪杩欎釜甯搁噺杩樻槸涓┖鍊硷紝鎺ヤ笅鏉ョ粰ourColor鍦–PU绔紶閫掓暟鎹粰瀹冦傛濊矾锛氳幏鍙杘urColor鍦ㄧ储寮曚綅缃紝鐒跺悗浼犻掓暟鎹粰杩欎釜浣嶇疆銆傚彟澶栧仛涓浜涘皬鍔ㄤ綔锛屼笉浼犻掑浐瀹氱殑杩欎釜锛屼紶閫掍竴涓殢鏃堕棿鍙樺寲鐨勫硷紝濡備笅锛 - - GLfloat timeValue = glfwGetTime(); - GLfloat greenValue = (sin(timeValue) / 2) + 0.5; - GLint vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor"); - glUseProgram(shaderProgram); - glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f); - +```c++ +GLfloat timeValue = glfwGetTime(); +GLfloat greenValue = (sin(timeValue) / 2) + 0.5; +GLint vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor"); +glUseProgram(shaderProgram); +glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f); +``` 棣栧厛閫氳繃glfwGetTime鍑芥暟鑾峰彇绋嬪簭杩愯鏃堕棿锛堢鏁帮級銆傜劧鍚庝娇鐢╯in鍑芥暟灏唃reenValue鐨勫兼帶鍒跺湪0-1銆 鐒跺悗浣跨敤glGetUniformLocation鍑芥暟鏌ヨourColor鐨勭储寮曚綅缃傛槸涓涓弬鏁版槸瑕佹煡璇㈢殑鐫鑹插櫒绋嬪簭锛岀浜屼釜鍙傛暟鏄父閲忓湪鐫鑹插櫒涓0鏄庣殑鍙橀噺鍚嶃傚鏋済lGetUniformLocation鍑芥暟杩斿洖-1锛岃〃鏄庢病鎵惧埌瀵瑰簲鐨勫父閲忕殑绱㈠紩浣嶇疆銆 @@ -137,29 +155,32 @@ GLSL璺熶竴鑸殑缂栫▼璇█涓鏍凤紝瀹氫箟浜嗕竴浜涘父鐢ㄧ殑鏁版嵁绫诲瀷锛屽熀 娉ㄦ剰锛氫娇鐢╣lGetUniformLocation 涓嶉渶瑕佸湪glUseProgram涔嬪悗锛屼絾鏄痝lUniform4f涓瀹氳鍦╨UseProgram涔嬪悗锛屽洜涓烘垜浠篃鍙兘瀵瑰綋鍓嶆縺娲荤殑鐫鑹插櫒绋嬪簭浼犻掓暟鎹 鍒扮洰鍓嶄负姝㈠凡缁忓浼氫簡杩欎箞缁欏父閲忎紶閫掓暟鎹拰娓叉煋浣跨敤杩欎簺鏁版嵁锛屽鏋滄垜浠兂姣忓抚鏀瑰彉甯搁噺鐨勫硷紝鎴戜滑闇瑕佸湪涓诲惊鐜殑涓嶅仠鐨勮绠楀拰鏇存柊甯搁噺鐨勫笺 +```c++ +while(!glfwWindowShouldClose(window)) +{ + // Check and call events + glfwPollEvents(); - while(!glfwWindowShouldClose(window)) - { - // Check and call events - glfwPollEvents(); - // Render - // Clear the colorbuffer - glClearColor(0.2f, 0.3f, 0.3f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - // Be sure to activate the shader - glUseProgram(shaderProgram); - // Update the uniform color - GLfloat timeValue = glfwGetTime(); - GLfloat greenValue = (sin(timeValue) / 2) + 0.5; - GLint vertexColorLocation = glGetUniformLocation( - shaderProgram, "ourColor"); - glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f,1.0f); - // Now draw the triangle - glBindVertexArray(VAO); - glDrawArrays(GL_TRIANGLES, 0, 3); - glBindVertexArray(0); - } + // Render + // Clear the colorbuffer + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + // Be sure to activate the shader + glUseProgram(shaderProgram); + + // Update the uniform color + GLfloat timeValue = glfwGetTime(); + GLfloat greenValue = (sin(timeValue) / 2) + 0.5; + GLint vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor"); + glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f); + + // Now draw the triangle + glBindVertexArray(VAO); + glDrawArrays(GL_TRIANGLES, 0, 3); + glBindVertexArray(0); +} +``` 濡傛灉杩愯姝e父鐨勮瘽鎴戜滑鑳界湅鍒颁竴涓豢鑹插埌榛戣壊锛岄粦鑹插埌缁胯壊鍙樺寲鐨勪笁瑙掑舰锛 鍙互鏌ョ湅瀹屾暣鐨勪唬鐮乕瀹炰緥](http://learnopengl.com/code_viewer.php?code=getting-started/shaders-interpolated) @@ -169,114 +190,124 @@ GLSL璺熶竴鑸殑缂栫▼璇█涓鏍凤紝瀹氫箟浜嗕竴浜涘父鐢ㄧ殑鏁版嵁绫诲瀷锛屽熀 缂栧啓銆佺紪璇戝拰绠$悊鐫鑹插櫒绋嬪簭鏄潪甯哥箒閲嶇殑宸ヤ綔锛屼负浜嗗噺杞昏繖涓伐浣滈噺鎴戜滑鑷繁瀹氫箟涓涓潃鑹插櫒绋嬪簭绠$悊鍣紝璐熻矗璇诲彇鐫鑹插櫒绋嬪簭鏂囦欢锛岀劧鍚庣紪璇戜粬浠紝閾炬帴骞舵鏌ョ潃鑹插櫒绋嬪簭鏈夋棤閿欒鍙戠敓銆傝繖涔熷彲浠ヨ鎴戜滑鎶婂凡缁忓鍒扮殑鐭ヨ瘑灏佽鍒版娊璞$殑瀵硅薄閲屻 鎴戜滑棣栧厛椤朵竴涓潃鑹插櫒绋嬪簭鐨勫ご鏂囦欢锛屽涓嬶細 +```c++ +#ifndef SHADER_H +#define SHADER_H - #ifndef SHADER_H - #define SHADER_H - #include - #include - #include - #include - using namespace std; - #include ; // Include glew to get all the required - OpenGL headers - class Shader - { - public: - // The program ID +#include +#include +#include +#include +using namespace std; + +#include ; // Include glew to get all the required OpenGL headers + +class Shader +{ +public: + // The program ID GLuint Program; // Constructor reads and builds the shader - Shader(const GLchar* vertexSourcePath, const GLchar*fragmentSourcePath); - // Use the program - void Use(); - }; - #endif - + Shader(const GLchar* vertexSourcePath, const GLchar* fragmentSourcePath); + // Use the program + void Use(); +}; + +#endif +``` 鐫鑹插櫒绋嬪簭绫诲寘鍚竴涓潃鑹插櫒绋嬪簭ID锛屾湁涓涓帴鍙楅《鐐瑰拰鐗囨绋嬪簭鐨勬帴鍙o紝杩欎釜涓や釜璺緞灏辨槸鏅氱殑鏂囨湰鏂囦欢灏卞彲浠ヤ簡銆 Use鍑芥暟鏄竴涓伐鍏峰睘鎬х殑鍑芥暟锛屼富瑕佹槸鎺у埗褰撳墠鐫鑹插櫒绋嬪簭鏄惁婵娲汇 璇诲彇鐫鑹插櫒绋嬪簭鏂囦欢 - - Shader(const GLchar* vertexPath, const GLchar* fragmentPath) - { - // 1. Retrieve the vertex/fragment source code from - filePath - std::string vertexCode; - std::string fragmentCode; - try - { - // Open files - std::ifstream vShaderFile(vertexPath); - std::ifstream fShaderFile(fragmentPath); - std::stringstream vShaderStream, fShaderStream; - // Read file鈥檚 buffer contents into streams - vShaderStream << vShaderFile.rdbuf(); - fShaderStream << fShaderFile.rdbuf(); - // close file handlers - vShaderFile.close(); - fShaderFile.close(); - // Convert stream into GLchar array - vertexCode = vShaderStream.str(); - fragmentCode = fShaderStream.str(); - } - catch(std::exception e) - { - std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << - std::endl; - } - +```c++ +Shader(const GLchar* vertexPath, const GLchar* fragmentPath) +{ + // 1. Retrieve the vertex/fragment source code from filePath + std::string vertexCode; + std::string fragmentCode; + std::ifstream vShaderFile; + std::ifstream fShaderFile; + // ensures ifstream objects can throw exceptions: + vShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit); + fShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit); + try + { + // Open files + vShaderFile.open(vertexPath); + fShaderFile.open(fragmentPath); + std::stringstream vShaderStream, fShaderStream; + // Read file's buffer contents into streams + vShaderStream << vShaderFile.rdbuf(); + fShaderStream << fShaderFile.rdbuf(); + // close file handlers + vShaderFile.close(); + fShaderFile.close(); + // Convert stream into GLchar array + vertexCode = vShaderStream.str(); + fragmentCode = fShaderStream.str(); + } + catch(std::ifstream::failure e) + { + std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl; + } + const GLchar* vShaderCode = vertexCode.c_str(); + const GLchar* fShaderCode = fragmentCode.c_str(); + [...] +``` 鎺ヤ笅鏉ョ紪璇戝拰閾炬帴杩欎簺绋嬪簭锛屽悓鏃舵敹闆嗕竴浜涚紪璇戝拰閾炬帴鐨勯敊璇紝鏉ュ府鍔╂垜浠皟璇曘 - - // 2. Compile shaders - GLuint vertex, fragment; - GLint success; - GLchar infoLog[512]; - // Vertex Shader - vertex = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vertex, 1, &vShaderCode, NULL); - glCompileShader(vertex); - // Print compile errors if any - glGetShaderiv(vertex, GL_COMPILE_STATUS, &success); - if(!success) - { - glGetShaderInfoLog(vertex, 512, NULL, infoLog); - std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" - << infoLog << std::endl; - }; - // Similiar for Fragment Shader - [...] - // Shader Program - this->Program = glCreateProgram(); - glAttachShader(this->Program, vertex); - glAttachShader(this->Program, fragment); - glLinkProgram(this->Program); - // Print linking errors if any - glGetProgramiv(this->Program, GL_LINK_STATUS, &success); - if(!success) - { - glGetProgramInfoLog(this->Program, 512, NULL, infoLog); - std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << - infoLog << std::endl; - } - // Delete the shaders as they鈥檙e linked into our program now - and no longer necessery - glDeleteShader(vertex); - glDeleteShader(fragment); - +```c++ +// 2. Compile shaders +GLuint vertex, fragment; +GLint success; +GLchar infoLog[512]; + +// Vertex Shader +vertex = glCreateShader(GL_VERTEX_SHADER); +glShaderSource(vertex, 1, &vShaderCode, NULL); +glCompileShader(vertex); +// Print compile errors if any +glGetShaderiv(vertex, GL_COMPILE_STATUS, &success); +if(!success) +{ + glGetShaderInfoLog(vertex, 512, NULL, infoLog); + std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; +}; + +// Similiar for Fragment Shader +[...] + +// Shader Program +this->Program = glCreateProgram(); +glAttachShader(this->Program, vertex); +glAttachShader(this->Program, fragment); +glLinkProgram(this->Program); +// Print linking errors if any +glGetProgramiv(this->Program, GL_LINK_STATUS, &success); +if(!success) +{ + glGetProgramInfoLog(this->Program, 512, NULL, infoLog); + std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; +} + +// Delete the shaders as they're linked into our program now and no longer necessery +glDeleteShader(vertex); +glDeleteShader(fragment); +``` 鏈鍚庢潵瀹炵幇涓涓猽se鍑芥暟 void Use() { glUseProgram(this->Program); } 鎺ヤ笅鏉ユ槸涓涓娇鐢ㄨ繖涓畝鍗曞疄渚嬶細 - - Shader ourShader("path/to/shaders/shader.vs", "path/to/shaders/shader.frag"); - ... - while(...) - { - ourShader.Use(); - glUniform1f(glGetUniformLocation(ourShader.Program, " - someUniform"), 1.0f); - DrawStuff(); - } +```c++ +Shader ourShader("path/to/shaders/shader.vs", "path/to/shaders/shader.frag"); +... +while(...) +{ + ourShader.Use(); + glUniform1f(glGetUniformLocation(ourShader.Program, "someUniform"), 1.0f); + DrawStuff(); +} +``` 涓婇潰鎴戜滑宸茬粡鎶婇《鐐圭潃鑹插櫒鍜岀墖娈电潃鑹插櫒浠g爜鍒嗗埆鏀惧湪shader.vs鍜宻hader.frag閲岄潰浜嗭紝杩欎簺鏂囦欢鐨勫悕瀛楀拰鍚庣紑鍚嶉兘鍙互闅忔剰鍛藉悕鐨勶紝鍙绗﹀悎鏂囦欢鍚嶈鑼冨氨濂姐 瀹屾暣鐨勪唬鐮佸疄渚嬶細 diff --git a/01 Getting started/06 Textures.md b/old/01/06 Textures.md similarity index 100% rename from 01 Getting started/06 Textures.md rename to old/01/06 Textures.md diff --git a/01 Getting started/07 Transformations.md b/old/01/07 Transformations.md similarity index 100% rename from 01 Getting started/07 Transformations.md rename to old/01/07 Transformations.md diff --git a/old/05/07 Bloom.md b/old/05/07 Bloom.md new file mode 100644 index 0000000..041b1db --- /dev/null +++ b/old/05/07 Bloom.md @@ -0,0 +1,11 @@ +鏈枃浣滆匤oeyDeVries锛岀敱Meow J缈昏瘧鑷猍http://learnopengl.com](http://learnopengl.com/#!Advanced-Lighting/Bloom) + +## 娉涘厜(Bloom) + +浜厜婧愪笌琚厜鐓у尯鍩熷父甯稿緢闅句紶杈剧粰瑙備紬锛屽洜涓烘樉绀哄櫒鐨勫厜寮哄害鑼冨洿鏄彈闄愬埗鐨. 鍏朵腑涓涓В鍐虫柟妗堟槸璁╄繖浜涘厜婧愭硾鍏(Glow)浠庤屽尯鍒嗕寒鍏夋簮: 璁╁厜婕(bleed)鍑哄厜婧. 杩欐湁鏁堣瑙備紬鎰熻鍒板厜婧愬拰鍏夌収鍖哄煙闈炲父鐨勪寒. + +鍏夌殑鏄氳繃涓涓悗鏈熷鐞嗘晥鏋滃彨鍋氭硾鍏(Bloom)鏉ュ畬鎴愮殑. 娉涘厜璁╂墍鏈夊厜鐓у湴鍖轰竴绉嶅湪鍙戝厜鐨勬晥鏋.涓嬮潰涓や釜鍦烘櫙灏辨槸鏈夋硾鍏(鍙)涓庢棤娉涘厜(宸)鐨勫尯鍒(鍥惧儚鏉ヨ嚜浜庤櫄骞诲紩鎿(Unreal)): + +![](http://learnopengl.com/img/advanced-lighting/bloom_example.png) + +娉涘厜鎻愪緵浜嗗浜庣墿浣撲寒搴︽樉鐪肩殑瑙嗚鏆楃ず锛屽洜涓烘硾鍏夎兘缁欐垜浠墿浣撶湡鐨勬槸寰堜寒鐨勮瑙夋晥鏋. 濡傛灉鎴戜滑鑳藉寰堝ソ鐨勫畬鎴愬畠(鏈変竴浜涙父鎴忓疄鐜扮殑寰堢碂绯)锛屾硾鍏夊皢鑳藉緢澶х▼搴︾殑鍔犲己鎴戜滑鍦烘櫙鐨勫厜鐓ф晥鏋滐紝骞朵笖涔熻兘缁欐垜浠緢澶氱壒鏁. \ No newline at end of file