[{"data":1,"prerenderedAt":1599},["ShallowReactive",2],{"page-\u002Fgraphy\u002Fopengel\u002F材质":3},{"id":4,"title":5,"body":6,"description":12,"extension":1593,"meta":1594,"navigation":87,"path":1595,"seo":1596,"stem":1597,"__hash__":1598},"content\u002Fgraphy\u002Fopengel\u002F材质.md","材质",{"type":7,"value":8,"toc":1590},"minimark",[9,13,98,101,117,144,150,153,563,570,577,580,813,818,821,832,910,924,950,967,1015,1035,1040,1098,1101,1370,1374,1381,1586],[10,11,12],"p",{},"材质也就是将我们之前使用的三个光照结合起来，增加一个反光度分量，差不多像这样：",[14,15,20],"pre",{"className":16,"code":17,"language":18,"meta":19,"style":19},"language-glsl shiki shiki-themes github-light github-dark","#version 330 core\nstruct Material {\n    vec3 ambient;\n    vec3 diffuse;\n    vec3 specular;\n    float shininess;\n}; \n\nuniform Material material;\n","glsl","",[21,22,23,39,49,55,61,67,76,82,89],"code",{"__ignoreMap":19},[24,25,28,32,36],"span",{"class":26,"line":27},"line",1,[24,29,31],{"class":30},"sVt8B","#version ",[24,33,35],{"class":34},"sj4cs","330",[24,37,38],{"class":30}," core\n",[24,40,42,46],{"class":26,"line":41},2,[24,43,45],{"class":44},"szBVR","struct",[24,47,48],{"class":30}," Material {\n",[24,50,52],{"class":26,"line":51},3,[24,53,54],{"class":30},"    vec3 ambient;\n",[24,56,58],{"class":26,"line":57},4,[24,59,60],{"class":30},"    vec3 diffuse;\n",[24,62,64],{"class":26,"line":63},5,[24,65,66],{"class":30},"    vec3 specular;\n",[24,68,70,73],{"class":26,"line":69},6,[24,71,72],{"class":44},"    float",[24,74,75],{"class":30}," shininess;\n",[24,77,79],{"class":26,"line":78},7,[24,80,81],{"class":30},"}; \n",[24,83,85],{"class":26,"line":84},8,[24,86,88],{"emptyLinePlaceholder":87},true,"\n",[24,90,92,95],{"class":26,"line":91},9,[24,93,94],{"class":44},"uniform",[24,96,97],{"class":30}," Material material;\n",[10,99,100],{},"分别是 环境光照、漫反射光照、镜面光照、反光度分量",[10,102,103,104,108,109,112,113,116],{},"在",[105,106,107],"strong",{},"片段着色器","中，我们",[105,110,111],{},"创建一个结构体(Struct)来储存物体的材质属性","。我们",[105,114,115],{},"也可以把它们储存为独立的uniform值","，但是作为一个结构体来储存会更有条理一些。我们首先定义结构体的布局(Layout)，然后简单地以刚创建的结构体作为类型声明一个uniform变量。",[10,118,119,120,123,124,127,128,131,132,135,136,139,140,143],{},"我们为风氏光照模型的",[105,121,122],{},"每个分量都定义一个颜色向量","。ambient材质向量",[105,125,126],{},"定义了在环境光照下这个表面反射的是什么颜色","，",[105,129,130],{},"通常与表面的颜色相同","。diffuse材质向量定义了在",[105,133,134],{},"漫反射光照下表面的颜色","。漫反射颜色（和环境光照一样）也被设置为我们期望的物体颜色。",[105,137,138],{},"specular材质向量设置的是表面上镜面高光的颜色","（或者甚至可能反映一个特定表面的颜色）。最后，",[105,141,142],{},"shininess影响镜面高光的散射\u002F半径","。",[10,145,146],{},[147,148],"img",{"alt":147,"src":149},".\u002Fassets\u002Fmaterials_real_world.png",[10,151,152],{},"我们可以从uniform变量material中访问它们：",[14,154,158],{"className":155,"code":156,"language":157,"meta":19,"style":19},"language-c++ shiki shiki-themes github-light github-dark","#version 330 core\nout vec4 FragColor;\n\nstruct Material{\n    vec3 ambient;\n    vec3 diffuse;\n    vec3 specular;\n    float shininess;\n};\n\nuniform vec3 lightColor;\nuniform vec3 lightPos;\nuniform vec3 viewPos;\nuniform Material material;\nin vec3 Normal;\nin vec3 FragPos;\n\nvoid main()\n{\n    vec3 ambient = lightColor * material.ambient;\n    \n    \u002F\u002F 漫反射\n    vec3 norm = normalize(Normal);\n    vec3 lightDir = normalize(lightPos - FragPos);\n    float diff = max(dot(norm, lightDir), 0.0);\n    vec3 diffuse = lightColor * (diff * material.diffuse);\n    \n    \u002F\u002F 镜面反射\n    vec3 viewDir = normalize(viewPos - FragPos);\n    vec3 reflectDir = reflect(-lightDir, norm);\n    float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);\n    vec3 specular = lightColor * (spec * material.specular);\n    \n    \u002F\u002F 最终结果\n    vec3 result = ambient + diffuse + specular;\n    FragColor = vec4(result, 1.0);\n}\n\n","c++",[21,159,160,168,173,177,188,196,203,210,216,221,226,232,238,244,250,256,262,267,279,284,304,310,317,333,354,382,404,409,415,434,454,484,506,511,517,538,557],{"__ignoreMap":19},[24,161,162,164,166],{"class":26,"line":27},[24,163,31],{"class":30},[24,165,35],{"class":34},[24,167,38],{"class":30},[24,169,170],{"class":26,"line":41},[24,171,172],{"class":30},"out vec4 FragColor;\n",[24,174,175],{"class":26,"line":51},[24,176,88],{"emptyLinePlaceholder":87},[24,178,179,181,185],{"class":26,"line":57},[24,180,45],{"class":44},[24,182,184],{"class":183},"sScJk"," Material",[24,186,187],{"class":30},"{\n",[24,189,190,193],{"class":26,"line":63},[24,191,192],{"class":183},"    vec3",[24,194,195],{"class":30}," ambient;\n",[24,197,198,200],{"class":26,"line":69},[24,199,192],{"class":183},[24,201,202],{"class":30}," diffuse;\n",[24,204,205,207],{"class":26,"line":78},[24,206,192],{"class":183},[24,208,209],{"class":30}," specular;\n",[24,211,212,214],{"class":26,"line":84},[24,213,72],{"class":44},[24,215,75],{"class":30},[24,217,218],{"class":26,"line":91},[24,219,220],{"class":30},"};\n",[24,222,224],{"class":26,"line":223},10,[24,225,88],{"emptyLinePlaceholder":87},[24,227,229],{"class":26,"line":228},11,[24,230,231],{"class":30},"uniform vec3 lightColor;\n",[24,233,235],{"class":26,"line":234},12,[24,236,237],{"class":30},"uniform vec3 lightPos;\n",[24,239,241],{"class":26,"line":240},13,[24,242,243],{"class":30},"uniform vec3 viewPos;\n",[24,245,247],{"class":26,"line":246},14,[24,248,249],{"class":30},"uniform Material material;\n",[24,251,253],{"class":26,"line":252},15,[24,254,255],{"class":30},"in vec3 Normal;\n",[24,257,259],{"class":26,"line":258},16,[24,260,261],{"class":30},"in vec3 FragPos;\n",[24,263,265],{"class":26,"line":264},17,[24,266,88],{"emptyLinePlaceholder":87},[24,268,270,273,276],{"class":26,"line":269},18,[24,271,272],{"class":44},"void",[24,274,275],{"class":183}," main",[24,277,278],{"class":30},"()\n",[24,280,282],{"class":26,"line":281},19,[24,283,187],{"class":30},[24,285,287,289,292,295,298,301],{"class":26,"line":286},20,[24,288,192],{"class":183},[24,290,291],{"class":30}," ambient ",[24,293,294],{"class":44},"=",[24,296,297],{"class":30}," lightColor ",[24,299,300],{"class":44},"*",[24,302,303],{"class":30}," material.ambient;\n",[24,305,307],{"class":26,"line":306},21,[24,308,309],{"class":30},"    \n",[24,311,313],{"class":26,"line":312},22,[24,314,316],{"class":315},"sJ8bj","    \u002F\u002F 漫反射\n",[24,318,320,322,325,327,330],{"class":26,"line":319},23,[24,321,192],{"class":183},[24,323,324],{"class":30}," norm ",[24,326,294],{"class":44},[24,328,329],{"class":183}," normalize",[24,331,332],{"class":30},"(Normal);\n",[24,334,336,338,341,343,345,348,351],{"class":26,"line":335},24,[24,337,192],{"class":183},[24,339,340],{"class":30}," lightDir ",[24,342,294],{"class":44},[24,344,329],{"class":183},[24,346,347],{"class":30},"(lightPos ",[24,349,350],{"class":44},"-",[24,352,353],{"class":30}," FragPos);\n",[24,355,357,359,362,364,367,370,373,376,379],{"class":26,"line":356},25,[24,358,72],{"class":44},[24,360,361],{"class":30}," diff ",[24,363,294],{"class":44},[24,365,366],{"class":183}," max",[24,368,369],{"class":30},"(",[24,371,372],{"class":183},"dot",[24,374,375],{"class":30},"(norm, lightDir), ",[24,377,378],{"class":34},"0.0",[24,380,381],{"class":30},");\n",[24,383,385,387,390,392,394,396,399,401],{"class":26,"line":384},26,[24,386,192],{"class":183},[24,388,389],{"class":30}," diffuse ",[24,391,294],{"class":44},[24,393,297],{"class":30},[24,395,300],{"class":44},[24,397,398],{"class":30}," (diff ",[24,400,300],{"class":44},[24,402,403],{"class":30}," material.diffuse);\n",[24,405,407],{"class":26,"line":406},27,[24,408,309],{"class":30},[24,410,412],{"class":26,"line":411},28,[24,413,414],{"class":315},"    \u002F\u002F 镜面反射\n",[24,416,418,420,423,425,427,430,432],{"class":26,"line":417},29,[24,419,192],{"class":183},[24,421,422],{"class":30}," viewDir ",[24,424,294],{"class":44},[24,426,329],{"class":183},[24,428,429],{"class":30},"(viewPos ",[24,431,350],{"class":44},[24,433,353],{"class":30},[24,435,437,439,442,444,447,449,451],{"class":26,"line":436},30,[24,438,192],{"class":183},[24,440,441],{"class":30}," reflectDir ",[24,443,294],{"class":44},[24,445,446],{"class":183}," reflect",[24,448,369],{"class":30},[24,450,350],{"class":44},[24,452,453],{"class":30},"lightDir, norm);\n",[24,455,457,459,462,464,467,469,472,474,476,479,481],{"class":26,"line":456},31,[24,458,72],{"class":44},[24,460,461],{"class":30}," spec ",[24,463,294],{"class":44},[24,465,466],{"class":183}," pow",[24,468,369],{"class":30},[24,470,471],{"class":183},"max",[24,473,369],{"class":30},[24,475,372],{"class":183},[24,477,478],{"class":30},"(viewDir, reflectDir), ",[24,480,378],{"class":34},[24,482,483],{"class":30},"), material.shininess);\n",[24,485,487,489,492,494,496,498,501,503],{"class":26,"line":486},32,[24,488,192],{"class":183},[24,490,491],{"class":30}," specular ",[24,493,294],{"class":44},[24,495,297],{"class":30},[24,497,300],{"class":44},[24,499,500],{"class":30}," (spec ",[24,502,300],{"class":44},[24,504,505],{"class":30}," material.specular);\n",[24,507,509],{"class":26,"line":508},33,[24,510,309],{"class":30},[24,512,514],{"class":26,"line":513},34,[24,515,516],{"class":315},"    \u002F\u002F 最终结果\n",[24,518,520,522,525,527,529,532,534,536],{"class":26,"line":519},35,[24,521,192],{"class":183},[24,523,524],{"class":30}," result ",[24,526,294],{"class":44},[24,528,291],{"class":30},[24,530,531],{"class":44},"+",[24,533,389],{"class":30},[24,535,531],{"class":44},[24,537,209],{"class":30},[24,539,541,544,546,549,552,555],{"class":26,"line":540},36,[24,542,543],{"class":30},"    FragColor ",[24,545,294],{"class":44},[24,547,548],{"class":183}," vec4",[24,550,551],{"class":30},"(result, ",[24,553,554],{"class":34},"1.0",[24,556,381],{"class":30},[24,558,560],{"class":26,"line":559},37,[24,561,562],{"class":30},"}\n",[10,564,565,566,569],{},"可以看到，我们现在",[105,567,568],{},"在需要的地方访问了材质结构体中的所有属性","，并且这次是根据材质的颜色来计算最终的输出颜色的。物体的每个材质属性都乘上了它们各自对应的光照分量。",[10,571,572,573,576],{},"我们现在可以",[105,574,575],{},"通过设置适当的uniform来设置应用中物体的材质了","。GLSL中一个结构体在设置uniform时并无任何区别，结构体只是充当uniform变量们的一个命名空间。所以如果想填充这个结构体的话，我们必须设置每个单独的uniform，但要以结构体名为前缀：",[10,578,579],{},"然后我们去给unifrom去赋值，这样就可以看到效果了：",[14,581,583],{"className":155,"code":582,"language":157,"meta":19,"style":19},"        \u002F\u002F 使用光照着色器绘制物体\n        lightingShader.use();\n        lightingShader.setMat4(\"projection\", projection);\n        lightingShader.setMat4(\"view\", view);\n        lightingShader.setMat4(\"model\", model);\n        lightingShader.setVec3(\"lightColor\", 1.0f, 1.0f, 1.0f);   \u002F\u002F 白色光源\n        lightingShader.setVec3(\"lightPos\", lightPos.x, lightPos.y, lightPos.z);\n        lightingShader.setVec3(\"material.ambient\", 1.0f, 0.5f, 0.31f);\n        lightingShader.setVec3(\"material.diffuse\", 1.0f, 0.5f, 0.31f);\n        lightingShader.setVec3(\"material.specular\", 1.0f, 1.0f, 1.0f);\n        lightingShader.setFloat(\"material.shininess\", 32.0f);\n",[21,584,585,590,601,617,631,645,683,697,730,761,792],{"__ignoreMap":19},[24,586,587],{"class":26,"line":27},[24,588,589],{"class":315},"        \u002F\u002F 使用光照着色器绘制物体\n",[24,591,592,595,598],{"class":26,"line":41},[24,593,594],{"class":30},"        lightingShader.",[24,596,597],{"class":183},"use",[24,599,600],{"class":30},"();\n",[24,602,603,605,608,610,614],{"class":26,"line":51},[24,604,594],{"class":30},[24,606,607],{"class":183},"setMat4",[24,609,369],{"class":30},[24,611,613],{"class":612},"sZZnC","\"projection\"",[24,615,616],{"class":30},", projection);\n",[24,618,619,621,623,625,628],{"class":26,"line":57},[24,620,594],{"class":30},[24,622,607],{"class":183},[24,624,369],{"class":30},[24,626,627],{"class":612},"\"view\"",[24,629,630],{"class":30},", view);\n",[24,632,633,635,637,639,642],{"class":26,"line":63},[24,634,594],{"class":30},[24,636,607],{"class":183},[24,638,369],{"class":30},[24,640,641],{"class":612},"\"model\"",[24,643,644],{"class":30},", model);\n",[24,646,647,649,652,654,657,660,662,665,667,669,671,673,675,677,680],{"class":26,"line":69},[24,648,594],{"class":30},[24,650,651],{"class":183},"setVec3",[24,653,369],{"class":30},[24,655,656],{"class":612},"\"lightColor\"",[24,658,659],{"class":30},", ",[24,661,554],{"class":34},[24,663,664],{"class":44},"f",[24,666,659],{"class":30},[24,668,554],{"class":34},[24,670,664],{"class":44},[24,672,659],{"class":30},[24,674,554],{"class":34},[24,676,664],{"class":44},[24,678,679],{"class":30},");",[24,681,682],{"class":315},"   \u002F\u002F 白色光源\n",[24,684,685,687,689,691,694],{"class":26,"line":78},[24,686,594],{"class":30},[24,688,651],{"class":183},[24,690,369],{"class":30},[24,692,693],{"class":612},"\"lightPos\"",[24,695,696],{"class":30},", lightPos.x, lightPos.y, lightPos.z);\n",[24,698,699,701,703,705,708,710,712,714,716,719,721,723,726,728],{"class":26,"line":84},[24,700,594],{"class":30},[24,702,651],{"class":183},[24,704,369],{"class":30},[24,706,707],{"class":612},"\"material.ambient\"",[24,709,659],{"class":30},[24,711,554],{"class":34},[24,713,664],{"class":44},[24,715,659],{"class":30},[24,717,718],{"class":34},"0.5",[24,720,664],{"class":44},[24,722,659],{"class":30},[24,724,725],{"class":34},"0.31",[24,727,664],{"class":44},[24,729,381],{"class":30},[24,731,732,734,736,738,741,743,745,747,749,751,753,755,757,759],{"class":26,"line":91},[24,733,594],{"class":30},[24,735,651],{"class":183},[24,737,369],{"class":30},[24,739,740],{"class":612},"\"material.diffuse\"",[24,742,659],{"class":30},[24,744,554],{"class":34},[24,746,664],{"class":44},[24,748,659],{"class":30},[24,750,718],{"class":34},[24,752,664],{"class":44},[24,754,659],{"class":30},[24,756,725],{"class":34},[24,758,664],{"class":44},[24,760,381],{"class":30},[24,762,763,765,767,769,772,774,776,778,780,782,784,786,788,790],{"class":26,"line":223},[24,764,594],{"class":30},[24,766,651],{"class":183},[24,768,369],{"class":30},[24,770,771],{"class":612},"\"material.specular\"",[24,773,659],{"class":30},[24,775,554],{"class":34},[24,777,664],{"class":44},[24,779,659],{"class":30},[24,781,554],{"class":34},[24,783,664],{"class":44},[24,785,659],{"class":30},[24,787,554],{"class":34},[24,789,664],{"class":44},[24,791,381],{"class":30},[24,793,794,796,799,801,804,806,809,811],{"class":26,"line":228},[24,795,594],{"class":30},[24,797,798],{"class":183},"setFloat",[24,800,369],{"class":30},[24,802,803],{"class":612},"\"material.shininess\"",[24,805,659],{"class":30},[24,807,808],{"class":34},"32.0",[24,810,664],{"class":44},[24,812,381],{"class":30},[10,814,815],{},[147,816],{"alt":147,"src":817},".\u002Fassets\u002Fmaterials_with_material.png",[10,819,820],{},"效果如上，但这个真的非常的亮眼，因为环境光、漫反射、镜面光三个颜色对任何一个光源都是全力反射，光源对环境光和镜面光分量有不同的强度。",[10,822,823,824,827,828,831],{},"我们可以",[105,825,826],{},"为每个光照指定一个强度向量","，如果我们假设lightColor是",[21,829,830],{},"vec3(1.0)","，代码会看起来像这样：",[14,833,835],{"className":16,"code":834,"language":18,"meta":19,"style":19},"vec3 ambient  = vec3(1.0) * material.ambient;\nvec3 diffuse  = vec3(1.0) * (diff * material.diffuse);\nvec3 specular = vec3(1.0) * (spec * material.specular);\n",[21,836,837,861,886],{"__ignoreMap":19},[24,838,839,842,845,847,850,852,854,857,859],{"class":26,"line":27},[24,840,841],{"class":44},"vec3",[24,843,844],{"class":30}," ambient  ",[24,846,294],{"class":44},[24,848,849],{"class":44}," vec3",[24,851,369],{"class":30},[24,853,554],{"class":34},[24,855,856],{"class":30},") ",[24,858,300],{"class":44},[24,860,303],{"class":30},[24,862,863,865,868,870,872,874,876,878,880,882,884],{"class":26,"line":41},[24,864,841],{"class":44},[24,866,867],{"class":30}," diffuse  ",[24,869,294],{"class":44},[24,871,849],{"class":44},[24,873,369],{"class":30},[24,875,554],{"class":34},[24,877,856],{"class":30},[24,879,300],{"class":44},[24,881,398],{"class":30},[24,883,300],{"class":44},[24,885,403],{"class":30},[24,887,888,890,892,894,896,898,900,902,904,906,908],{"class":26,"line":51},[24,889,841],{"class":44},[24,891,491],{"class":30},[24,893,294],{"class":44},[24,895,849],{"class":44},[24,897,369],{"class":30},[24,899,554],{"class":34},[24,901,856],{"class":30},[24,903,300],{"class":44},[24,905,500],{"class":30},[24,907,300],{"class":44},[24,909,505],{"class":30},[10,911,912,913,916,917,919,920,923],{},"所以物体的",[105,914,915],{},"每个材质属性对每一个光照分量都返回了最大的强度","。对单个光源来说，这些",[21,918,830],{},"值同样可以对每种光源分别改变，而这通常就是我们想要的。现在，物体的环境光分量完全地影响了立方体的颜色，可是环境光分量实际上不应该对最终的颜色有这么大的影响，",[105,921,922],{},"所以我们会将光源的环境光强度设置为一个小一点的值，从而限制环境光颜色","：",[14,925,927],{"className":16,"code":926,"language":18,"meta":19,"style":19},"vec3 ambient = vec3(0.1) * material.ambient;\n",[21,928,929],{"__ignoreMap":19},[24,930,931,933,935,937,939,941,944,946,948],{"class":26,"line":27},[24,932,841],{"class":44},[24,934,291],{"class":30},[24,936,294],{"class":44},[24,938,849],{"class":44},[24,940,369],{"class":30},[24,942,943],{"class":34},"0.1",[24,945,856],{"class":30},[24,947,300],{"class":44},[24,949,303],{"class":30},[10,951,952,953,959,960,963,964,923],{},"我们可以用同样的方式影响光源的漫反射和镜面光强度。这和我们在[上一节](",[954,955,956],"a",{"href":956,"rel":957},"https:\u002F\u002Flearnopengl-cn.github.io\u002F02",[958],"nofollow"," Lighting\u002F02 Basic Lighting\u002F)中所做的极为相似，你可以认为我们已经",[105,961,962],{},"创建了一些光照属性来影响各个光照分量","。我们希望",[105,965,966],{},"为光照属性创建类似材质结构体的东西",[14,968,970],{"className":16,"code":969,"language":18,"meta":19,"style":19},"struct Light {\n    vec3 position;\n\n    vec3 ambient;\n    vec3 diffuse;\n    vec3 specular;\n};\n\nuniform Light light;\n",[21,971,972,979,984,988,992,996,1000,1004,1008],{"__ignoreMap":19},[24,973,974,976],{"class":26,"line":27},[24,975,45],{"class":44},[24,977,978],{"class":30}," Light {\n",[24,980,981],{"class":26,"line":41},[24,982,983],{"class":30},"    vec3 position;\n",[24,985,986],{"class":26,"line":51},[24,987,88],{"emptyLinePlaceholder":87},[24,989,990],{"class":26,"line":57},[24,991,54],{"class":30},[24,993,994],{"class":26,"line":63},[24,995,60],{"class":30},[24,997,998],{"class":26,"line":69},[24,999,66],{"class":30},[24,1001,1002],{"class":26,"line":78},[24,1003,220],{"class":30},[24,1005,1006],{"class":26,"line":84},[24,1007,88],{"emptyLinePlaceholder":87},[24,1009,1010,1012],{"class":26,"line":91},[24,1011,94],{"class":44},[24,1013,1014],{"class":30}," Light light;\n",[10,1016,1017,1020,1021,1024,1025,1028,1029,1031,1032,143],{},[105,1018,1019],{},"一个光源对它的ambient、diffuse和specular光照分量有着不同的强度","。环境光照通常",[105,1022,1023],{},"被设置为一个比较低的强度","，因为我们不希望环境光颜色太过主导。",[105,1026,1027],{},"光源的漫反射分量通常被设置为我们希望光所具有的那个颜色","，通常是一个比较明亮的白色。镜面光分量通常会保持为",[21,1030,830],{},"，以最大强度发光。注意我们也",[105,1033,1034],{},"将光源的位置向量加入了结构体",[10,1036,1037],{},[105,1038,1039],{},"和材质uniform一样，我们需要更新片段着色器：",[14,1041,1043],{"className":16,"code":1042,"language":18,"meta":19,"style":19},"vec3 ambient  = light.ambient * material.ambient;\nvec3 diffuse  = light.diffuse * (diff * material.diffuse);\nvec3 specular = light.specular * (spec * material.specular);\n",[21,1044,1045,1060,1079],{"__ignoreMap":19},[24,1046,1047,1049,1051,1053,1056,1058],{"class":26,"line":27},[24,1048,841],{"class":44},[24,1050,844],{"class":30},[24,1052,294],{"class":44},[24,1054,1055],{"class":30}," light.ambient ",[24,1057,300],{"class":44},[24,1059,303],{"class":30},[24,1061,1062,1064,1066,1068,1071,1073,1075,1077],{"class":26,"line":41},[24,1063,841],{"class":44},[24,1065,867],{"class":30},[24,1067,294],{"class":44},[24,1069,1070],{"class":30}," light.diffuse ",[24,1072,300],{"class":44},[24,1074,398],{"class":30},[24,1076,300],{"class":44},[24,1078,403],{"class":30},[24,1080,1081,1083,1085,1087,1090,1092,1094,1096],{"class":26,"line":51},[24,1082,841],{"class":44},[24,1084,491],{"class":30},[24,1086,294],{"class":44},[24,1088,1089],{"class":30}," light.specular ",[24,1091,300],{"class":44},[24,1093,500],{"class":30},[24,1095,300],{"class":44},[24,1097,505],{"class":30},[10,1099,1100],{},"这样的话我们就不需要LightColor了，大致改动会变成这样：",[14,1102,1104],{"className":155,"code":1103,"language":157,"meta":19,"style":19},"        \u002F\u002F 使用光照着色器绘制物体\n        lightingShader.use();\n        lightingShader.setMat4(\"projection\", projection);\n        lightingShader.setMat4(\"view\", view);\n        lightingShader.setMat4(\"model\", model);\n        lightingShader.setVec3(\"lightPos\", lightPos.x, lightPos.y, lightPos.z);\n        lightingShader.setVec3(\"light.ambient\",  0.2f, 0.2f, 0.2f);\n        lightingShader.setVec3(\"light.diffuse\",  0.5f, 0.5f, 0.5f);\n        lightingShader.setVec3(\"light.specular\", 1.0f, 1.0f, 1.0f); \n        lightingShader.setVec3(\"material.ambient\", 1.0f, 0.5f, 0.31f);\n        lightingShader.setVec3(\"material.diffuse\", 1.0f, 0.5f, 0.31f);\n        lightingShader.setVec3(\"material.specular\", 1.0f, 1.0f, 1.0f);\n        lightingShader.setFloat(\"material.shininess\", 32.0f);\n",[21,1105,1106,1110,1118,1130,1142,1154,1166,1199,1230,1262,1292,1322,1352],{"__ignoreMap":19},[24,1107,1108],{"class":26,"line":27},[24,1109,589],{"class":315},[24,1111,1112,1114,1116],{"class":26,"line":41},[24,1113,594],{"class":30},[24,1115,597],{"class":183},[24,1117,600],{"class":30},[24,1119,1120,1122,1124,1126,1128],{"class":26,"line":51},[24,1121,594],{"class":30},[24,1123,607],{"class":183},[24,1125,369],{"class":30},[24,1127,613],{"class":612},[24,1129,616],{"class":30},[24,1131,1132,1134,1136,1138,1140],{"class":26,"line":57},[24,1133,594],{"class":30},[24,1135,607],{"class":183},[24,1137,369],{"class":30},[24,1139,627],{"class":612},[24,1141,630],{"class":30},[24,1143,1144,1146,1148,1150,1152],{"class":26,"line":63},[24,1145,594],{"class":30},[24,1147,607],{"class":183},[24,1149,369],{"class":30},[24,1151,641],{"class":612},[24,1153,644],{"class":30},[24,1155,1156,1158,1160,1162,1164],{"class":26,"line":69},[24,1157,594],{"class":30},[24,1159,651],{"class":183},[24,1161,369],{"class":30},[24,1163,693],{"class":612},[24,1165,696],{"class":30},[24,1167,1168,1170,1172,1174,1177,1180,1183,1185,1187,1189,1191,1193,1195,1197],{"class":26,"line":78},[24,1169,594],{"class":30},[24,1171,651],{"class":183},[24,1173,369],{"class":30},[24,1175,1176],{"class":612},"\"light.ambient\"",[24,1178,1179],{"class":30},",  ",[24,1181,1182],{"class":34},"0.2",[24,1184,664],{"class":44},[24,1186,659],{"class":30},[24,1188,1182],{"class":34},[24,1190,664],{"class":44},[24,1192,659],{"class":30},[24,1194,1182],{"class":34},[24,1196,664],{"class":44},[24,1198,381],{"class":30},[24,1200,1201,1203,1205,1207,1210,1212,1214,1216,1218,1220,1222,1224,1226,1228],{"class":26,"line":84},[24,1202,594],{"class":30},[24,1204,651],{"class":183},[24,1206,369],{"class":30},[24,1208,1209],{"class":612},"\"light.diffuse\"",[24,1211,1179],{"class":30},[24,1213,718],{"class":34},[24,1215,664],{"class":44},[24,1217,659],{"class":30},[24,1219,718],{"class":34},[24,1221,664],{"class":44},[24,1223,659],{"class":30},[24,1225,718],{"class":34},[24,1227,664],{"class":44},[24,1229,381],{"class":30},[24,1231,1232,1234,1236,1238,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259],{"class":26,"line":91},[24,1233,594],{"class":30},[24,1235,651],{"class":183},[24,1237,369],{"class":30},[24,1239,1240],{"class":612},"\"light.specular\"",[24,1242,659],{"class":30},[24,1244,554],{"class":34},[24,1246,664],{"class":44},[24,1248,659],{"class":30},[24,1250,554],{"class":34},[24,1252,664],{"class":44},[24,1254,659],{"class":30},[24,1256,554],{"class":34},[24,1258,664],{"class":44},[24,1260,1261],{"class":30},"); \n",[24,1263,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290],{"class":26,"line":223},[24,1265,594],{"class":30},[24,1267,651],{"class":183},[24,1269,369],{"class":30},[24,1271,707],{"class":612},[24,1273,659],{"class":30},[24,1275,554],{"class":34},[24,1277,664],{"class":44},[24,1279,659],{"class":30},[24,1281,718],{"class":34},[24,1283,664],{"class":44},[24,1285,659],{"class":30},[24,1287,725],{"class":34},[24,1289,664],{"class":44},[24,1291,381],{"class":30},[24,1293,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318,1320],{"class":26,"line":228},[24,1295,594],{"class":30},[24,1297,651],{"class":183},[24,1299,369],{"class":30},[24,1301,740],{"class":612},[24,1303,659],{"class":30},[24,1305,554],{"class":34},[24,1307,664],{"class":44},[24,1309,659],{"class":30},[24,1311,718],{"class":34},[24,1313,664],{"class":44},[24,1315,659],{"class":30},[24,1317,725],{"class":34},[24,1319,664],{"class":44},[24,1321,381],{"class":30},[24,1323,1324,1326,1328,1330,1332,1334,1336,1338,1340,1342,1344,1346,1348,1350],{"class":26,"line":234},[24,1325,594],{"class":30},[24,1327,651],{"class":183},[24,1329,369],{"class":30},[24,1331,771],{"class":612},[24,1333,659],{"class":30},[24,1335,554],{"class":34},[24,1337,664],{"class":44},[24,1339,659],{"class":30},[24,1341,554],{"class":34},[24,1343,664],{"class":44},[24,1345,659],{"class":30},[24,1347,554],{"class":34},[24,1349,664],{"class":44},[24,1351,381],{"class":30},[24,1353,1354,1356,1358,1360,1362,1364,1366,1368],{"class":26,"line":240},[24,1355,594],{"class":30},[24,1357,798],{"class":183},[24,1359,369],{"class":30},[24,1361,803],{"class":612},[24,1363,659],{"class":30},[24,1365,808],{"class":34},[24,1367,664],{"class":44},[24,1369,381],{"class":30},[1371,1372,1373],"h2",{"id":1373},"不同的光源颜色",[10,1375,1376,1377,1380],{},"到目前为止，",[105,1378,1379],{},"我们都只对光源设置了从白到灰到黑范围内的颜色","，这样只会改变物体各个分量的强度，而不是它的真正颜色。由于现在能够非常容易地访问光照的属性了，我们可以随着时间改变它们的颜色，从而获得一些非常有意思的效果。由于所有的东西都在片段着色器中配置好了，修改光源的颜色非常简单，并立刻创造一些很有趣的效果：",[14,1382,1386],{"className":1383,"code":1384,"language":1385,"meta":19,"style":19},"language-csharp shiki shiki-themes github-light github-dark","glm::vec3 lightColor;\nlightColor.x = sin(glfwGetTime() * 2.0f);\nlightColor.y = sin(glfwGetTime() * 0.7f);\nlightColor.z = sin(glfwGetTime() * 1.3f);\n\nglm::vec3 diffuseColor = lightColor   * glm::vec3(0.5f); \u002F\u002F 降低影响\nglm::vec3 ambientColor = diffuseColor * glm::vec3(0.2f); \u002F\u002F 很低的影响\n\nlightingShader.setVec3(\"light.ambient\", ambientColor);\nlightingShader.setVec3(\"light.diffuse\", diffuseColor);\n","csharp",[21,1387,1388,1406,1431,1453,1475,1479,1519,1555,1559,1573],{"__ignoreMap":19},[24,1389,1390,1393,1396,1398,1400,1403],{"class":26,"line":27},[24,1391,1392],{"class":183},"glm",[24,1394,1395],{"class":30},":",[24,1397,1395],{"class":44},[24,1399,841],{"class":183},[24,1401,1402],{"class":183}," lightColor",[24,1404,1405],{"class":30},";\n",[24,1407,1408,1411,1413,1416,1418,1421,1424,1426,1429],{"class":26,"line":41},[24,1409,1410],{"class":30},"lightColor.x ",[24,1412,294],{"class":44},[24,1414,1415],{"class":183}," sin",[24,1417,369],{"class":30},[24,1419,1420],{"class":183},"glfwGetTime",[24,1422,1423],{"class":30},"() ",[24,1425,300],{"class":44},[24,1427,1428],{"class":34}," 2.0f",[24,1430,381],{"class":30},[24,1432,1433,1436,1438,1440,1442,1444,1446,1448,1451],{"class":26,"line":51},[24,1434,1435],{"class":30},"lightColor.y ",[24,1437,294],{"class":44},[24,1439,1415],{"class":183},[24,1441,369],{"class":30},[24,1443,1420],{"class":183},[24,1445,1423],{"class":30},[24,1447,300],{"class":44},[24,1449,1450],{"class":34}," 0.7f",[24,1452,381],{"class":30},[24,1454,1455,1458,1460,1462,1464,1466,1468,1470,1473],{"class":26,"line":57},[24,1456,1457],{"class":30},"lightColor.z ",[24,1459,294],{"class":44},[24,1461,1415],{"class":183},[24,1463,369],{"class":30},[24,1465,1420],{"class":183},[24,1467,1423],{"class":30},[24,1469,300],{"class":44},[24,1471,1472],{"class":34}," 1.3f",[24,1474,381],{"class":30},[24,1476,1477],{"class":26,"line":63},[24,1478,88],{"emptyLinePlaceholder":87},[24,1480,1481,1483,1485,1487,1489,1492,1495,1498,1500,1503,1506,1508,1510,1513,1516],{"class":26,"line":69},[24,1482,1392],{"class":183},[24,1484,1395],{"class":30},[24,1486,1395],{"class":44},[24,1488,841],{"class":183},[24,1490,1491],{"class":183}," diffuseColor",[24,1493,1494],{"class":44}," =",[24,1496,1497],{"class":30}," lightColor   ",[24,1499,300],{"class":44},[24,1501,1502],{"class":30}," glm",[24,1504,1505],{"class":44},"::",[24,1507,841],{"class":183},[24,1509,369],{"class":30},[24,1511,1512],{"class":34},"0.5f",[24,1514,1515],{"class":30},"); ",[24,1517,1518],{"class":315},"\u002F\u002F 降低影响\n",[24,1520,1521,1523,1525,1527,1529,1532,1534,1537,1539,1541,1543,1545,1547,1550,1552],{"class":26,"line":78},[24,1522,1392],{"class":183},[24,1524,1395],{"class":30},[24,1526,1395],{"class":44},[24,1528,841],{"class":183},[24,1530,1531],{"class":183}," ambientColor",[24,1533,1494],{"class":44},[24,1535,1536],{"class":30}," diffuseColor ",[24,1538,300],{"class":44},[24,1540,1502],{"class":30},[24,1542,1505],{"class":44},[24,1544,841],{"class":183},[24,1546,369],{"class":30},[24,1548,1549],{"class":34},"0.2f",[24,1551,1515],{"class":30},[24,1553,1554],{"class":315},"\u002F\u002F 很低的影响\n",[24,1556,1557],{"class":26,"line":84},[24,1558,88],{"emptyLinePlaceholder":87},[24,1560,1561,1564,1566,1568,1570],{"class":26,"line":91},[24,1562,1563],{"class":30},"lightingShader.",[24,1565,651],{"class":183},[24,1567,369],{"class":30},[24,1569,1176],{"class":612},[24,1571,1572],{"class":30},", ambientColor);\n",[24,1574,1575,1577,1579,1581,1583],{"class":26,"line":223},[24,1576,1563],{"class":30},[24,1578,651],{"class":183},[24,1580,369],{"class":30},[24,1582,1209],{"class":612},[24,1584,1585],{"class":30},", diffuseColor);\n",[1587,1588,1589],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":19,"searchDepth":41,"depth":41,"links":1591},[1592],{"id":1373,"depth":41,"text":1373},"md",{},"\u002Fgraphy\u002Fopengel\u002F材质",{"description":12},"graphy\u002Fopengel\u002F材质","8mPjx6PGcGAFLhLexquvUTzbZkV2THu38AacF6YQXAY",1792338204509]