﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-计算机三维图形技术及应用(3D-CG)</title><link>http://www.cnblogs.com/CGDeveloper/</link><description>专注于计算机三维图形技术，致力于为客户提供最理想的产品和最完美的技术支持．欢迎与广大朋友们进行广泛的交流和各种形式的项目合作！</description><language>zh-cn</language><lastBuildDate>Wed, 03 Dec 2008 20:21:59 GMT</lastBuildDate><pubDate>Wed, 03 Dec 2008 20:21:59 GMT</pubDate><ttl>60</ttl><item><title>Bump mapping的GLSL实现</title><link>http://www.cnblogs.com/CGDeveloper/archive/2008/07/03/1234206.html</link><dc:creator>CGDeveloper</dc:creator><author>CGDeveloper</author><pubDate>Thu, 03 Jul 2008 09:57:00 GMT</pubDate><guid>http://www.cnblogs.com/CGDeveloper/archive/2008/07/03/1234206.html</guid><wfw:comment>http://www.cnblogs.com/CGDeveloper/comments/1234206.html</wfw:comment><comments>http://www.cnblogs.com/CGDeveloper/archive/2008/07/03/1234206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/CGDeveloper/comments/commentRss/1234206.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/CGDeveloper/services/trackbacks/1234206.html</trackback:ping><description><![CDATA[摘要: 如果物体表面细节很多，我们可以不断的精细化物体的几何数据，但是这样会产生大量的Lighting &amp; Transformation等计算，为了实现丰富真实的物体表面，除了贴上一般纹理之外，往往还使用Bump mapping（凹凸纹理）技术。Bump mapping并没有增加物体的几何复杂度，它只是在计算物体的光照效果时作了&#8220;弊&#8221;，不使用物体本身的法向量，而是使用了经过&nbsp;&nbsp;<a href='http://www.cnblogs.com/CGDeveloper/archive/2008/07/03/1234206.html'>阅读全文</a><img src ="http://www.cnblogs.com/CGDeveloper/aggbug/1234206.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43776/" target="_blank">[新闻]针对LINQ to SQL及ADO.NET Entity Framework的元数据同步工具</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>使用GLSL实现更多数量的局部光照</title><link>http://www.cnblogs.com/CGDeveloper/archive/2008/07/02/1233816.html</link><dc:creator>CGDeveloper</dc:creator><author>CGDeveloper</author><pubDate>Wed, 02 Jul 2008 03:16:00 GMT</pubDate><guid>http://www.cnblogs.com/CGDeveloper/archive/2008/07/02/1233816.html</guid><wfw:comment>http://www.cnblogs.com/CGDeveloper/comments/1233816.html</wfw:comment><comments>http://www.cnblogs.com/CGDeveloper/archive/2008/07/02/1233816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/CGDeveloper/comments/commentRss/1233816.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/CGDeveloper/services/trackbacks/1233816.html</trackback:ping><description><![CDATA[众所周知，OpenGL固定管线只提供了最多8盏灯光。如何使得自己的场景之中拥有更多的灯光效果呢？<br />
这里提供一种使用GLSL shader实现更多数量的局部光照。<br />
<br />
在GLSL里，首先建立光照参数数据结构：<br />
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;myLightParams<br />
<img id="Codehighlighter1_21_278_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_21_278_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_21_278_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_21_278_Closed_Text').style.display='inline';" align="top"  alt="" /><img id="Codehighlighter1_21_278_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_21_278_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_21_278_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_21_278_Open_Text').style.display='inline';" align="top"  alt="" /></span><span id="Codehighlighter1_21_278_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_21_278_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;enabled;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec4&nbsp;position;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec4&nbsp;ambient;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec4&nbsp;diffuse;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec4&nbsp;specular;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec3&nbsp;spotDirection;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;spotCutoff;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;spotExponent;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;constantAttenuation;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;linearAttenuation;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;quadraticAttenuation;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000;">;</span></div>
<br />
然后，需要app传入的参数：<br />
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;maxLightCount&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">32</span><span style="color: #000000;">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />uniform&nbsp;myLightParams&nbsp;light[maxLightCount];<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />uniform&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;bLocalViewer;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />uniform&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;bSeperateSpecualr;</span></div>
<br />
主函数：<br />
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main()<br />
<img id="Codehighlighter1_12_1336_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_12_1336_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_12_1336_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_12_1336_Closed_Text').style.display='inline';" align="top"  alt="" /><img id="Codehighlighter1_12_1336_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_12_1336_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_12_1336_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_12_1336_Open_Text').style.display='inline';" align="top"  alt="" /></span><span id="Codehighlighter1_12_1336_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_12_1336_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;gl_Position&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;gl_ModelViewProjectionMatrix&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;gl_Vertex;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec4&nbsp;pos&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;gl_ModelViewMatrix&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;gl_Vertex;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec3&nbsp;epos&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vec3(pos)</span><span style="color: #000000;">/</span><span style="color: #000000;">pos.w;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec3&nbsp;normal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;normalize(gl_NormalMatrix&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;gl_Normal);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec3&nbsp;eye;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(bLocalViewer)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eye&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">normalize(epos);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eye&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vec3(</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800080;">1.0</span><span style="color: #000000;">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec4&nbsp;amb&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vec4(</span><span style="color: #800080;">0</span><span style="color: #000000;">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec4&nbsp;diff&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vec4(</span><span style="color: #800080;">0</span><span style="color: #000000;">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec4&nbsp;spec&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vec4(</span><span style="color: #800080;">0</span><span style="color: #000000;">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">maxLightCount;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
<img id="Codehighlighter1_458_891_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_458_891_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_458_891_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_458_891_Closed_Text').style.display='inline';" align="top"  alt="" /><img id="Codehighlighter1_458_891_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_458_891_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_458_891_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_458_891_Open_Text').style.display='inline';" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_458_891_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_458_891_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(light[i].enabled&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(light[i].position.w&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">)<br />
<img id="Codehighlighter1_580_660_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_580_660_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_580_660_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_580_660_Closed_Text').style.display='inline';" align="top"  alt="" /><img id="Codehighlighter1_580_660_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_580_660_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_580_660_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_580_660_Open_Text').style.display='inline';" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_580_660_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_580_660_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DirectionalLight(i,&nbsp;eye,&nbsp;epos,&nbsp;normal,&nbsp;amb,&nbsp;diff,&nbsp;spec);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(light[i].spotCutoff&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">180.0</span><span style="color: #000000;">)<br />
<img id="Codehighlighter1_716_790_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_716_790_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_716_790_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_716_790_Closed_Text').style.display='inline';" align="top"  alt="" /><img id="Codehighlighter1_716_790_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_716_790_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_716_790_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_716_790_Open_Text').style.display='inline';" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_716_790_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_716_790_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PointLight(i,&nbsp;eye,&nbsp;epos,&nbsp;normal,&nbsp;amb,&nbsp;diff,&nbsp;spec);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
<img id="Codehighlighter1_812_885_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_812_885_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_812_885_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_812_885_Closed_Text').style.display='inline';" align="top"  alt="" /><img id="Codehighlighter1_812_885_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_812_885_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_812_885_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_812_885_Open_Text').style.display='inline';" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_812_885_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_812_885_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpotLight(i,&nbsp;eye,&nbsp;epos,&nbsp;normal,&nbsp;amb,&nbsp;diff,&nbsp;spec);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec4&nbsp;color&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;gl_FrontLightModelProduct.sceneColor&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amb&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;gl_FrontMaterial.ambient&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diff&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;gl_FrontMaterial.diffuse;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(bSeperateSpecualr)<br />
<img id="Codehighlighter1_1103_1177_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1103_1177_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1103_1177_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1103_1177_Closed_Text').style.display='inline';" align="top"  alt="" /><img id="Codehighlighter1_1103_1177_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1103_1177_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1103_1177_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1103_1177_Open_Text').style.display='inline';" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1103_1177_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1103_1177_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gl_FrontSecondaryColor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;spec&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;gl_FrontMaterial.specular;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
<img id="Codehighlighter1_1191_1302_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1191_1302_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1191_1302_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1191_1302_Closed_Text').style.display='inline';" align="top"  alt="" /><img id="Codehighlighter1_1191_1302_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1191_1302_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1191_1302_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1191_1302_Open_Text').style.display='inline';" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1191_1302_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1191_1302_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gl_FrontSecondaryColor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vec4(</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800080;">1.0</span><span style="color: #000000;">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;spec&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;gl_FrontMaterial.specular;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;gl_FrontColor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;color;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
对于方向光源的计算：<br />
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;DirectionalLight(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;vec3&nbsp;eye,&nbsp;vec3&nbsp;epos,&nbsp;vec3&nbsp;normal,&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inout&nbsp;vec4&nbsp;amb,&nbsp;inout&nbsp;vec4&nbsp;diff,&nbsp;inout&nbsp;vec4&nbsp;spec)<br />
<img id="Codehighlighter1_136_448_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_136_448_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_136_448_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_136_448_Closed_Text').style.display='inline';" align="top"  alt="" /><img id="Codehighlighter1_136_448_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_136_448_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_136_448_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_136_448_Open_Text').style.display='inline';" align="top"  alt="" /></span><span id="Codehighlighter1_136_448_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_136_448_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;dotVP&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;max(</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;dot(normal,&nbsp;normalize(vec3(light[i].position))));<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;dotHV&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;max(</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;dot(normal,&nbsp;normalize(eye</span><span style="color: #000000;">+</span><span style="color: #000000;">normalize(vec3(light[i].position)))));<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;amb&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;light[i].ambient;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;diff&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;light[i].diffuse&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;dotVP;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;spec&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;light[i].specular&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pow(dotHV,&nbsp;gl_FrontMaterial.shininess);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
对于点光源：<br />
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;PointLight(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;vec3&nbsp;eye,&nbsp;vec3&nbsp;epos,&nbsp;vec3&nbsp;normal,&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inout&nbsp;vec4&nbsp;amb,&nbsp;inout&nbsp;vec4&nbsp;diff,&nbsp;inout&nbsp;vec4&nbsp;spec)<br />
<img id="Codehighlighter1_124_631_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_124_631_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_124_631_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_124_631_Closed_Text').style.display='inline';" align="top"  alt="" /><img id="Codehighlighter1_124_631_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_124_631_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_124_631_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_124_631_Open_Text').style.display='inline';" align="top"  alt="" /></span><span id="Codehighlighter1_124_631_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_124_631_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec3&nbsp;VP&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vec3(light[i].position)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;epos;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;d&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;length(VP);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;VP&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;normalize(VP);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;att&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">1.0</span><span style="color: #000000;">/</span><span style="color: #000000;">(light[i].constantAttenuation&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;light[i].linearAttenuation</span><span style="color: #000000;">*</span><span style="color: #000000;">d&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;light[i].quadraticAttenuation</span><span style="color: #000000;">*</span><span style="color: #000000;">d</span><span style="color: #000000;">*</span><span style="color: #000000;">d);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec3&nbsp;h&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;normalize(VP</span><span style="color: #000000;">+</span><span style="color: #000000;">eye);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;dotVP&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;max(</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;dot(normal,&nbsp;VP));<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;dotHV&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;max(</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;dot(normal,&nbsp;h));<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;amb&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;light[i].ambient&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;att;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;diff&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;light[i].diffuse&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;dotVP&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;att;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;spec&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;light[i].specular&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pow(dotHV,&nbsp;gl_FrontMaterial.shininess)&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;att;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
对于聚光灯：<br />
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SpotLight(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;vec3&nbsp;eye,&nbsp;vec3&nbsp;epos,&nbsp;vec3&nbsp;normal,&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inout&nbsp;vec4&nbsp;amb,&nbsp;inout&nbsp;vec4&nbsp;diff,&nbsp;inout&nbsp;vec4&nbsp;spec)<br />
<img id="Codehighlighter1_122_939_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_122_939_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_122_939_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_122_939_Closed_Text').style.display='inline';" align="top"  alt="" /><img id="Codehighlighter1_122_939_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_122_939_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_122_939_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_122_939_Open_Text').style.display='inline';" align="top"  alt="" /></span><span id="Codehighlighter1_122_939_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_122_939_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec3&nbsp;VP&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vec3(light[i].position)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;epos;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;d&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;length(VP);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;VP&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;normalize(VP);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;att&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">1.0</span><span style="color: #000000;">/</span><span style="color: #000000;">(light[i].constantAttenuation&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;light[i].linearAttenuation</span><span style="color: #000000;">*</span><span style="color: #000000;">d&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;light[i].quadraticAttenuation</span><span style="color: #000000;">*</span><span style="color: #000000;">d</span><span style="color: #000000;">*</span><span style="color: #000000;">d);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;dotSpot&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;dot(</span><span style="color: #000000;">-</span><span style="color: #000000;">VP,&nbsp;normalize(light[i].spotDirection));<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;cosCutoff&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cos(light[i].spotCutoff</span><span style="color: #000000;">*</span><span style="color: #800080;">3.1415926</span><span style="color: #000000;">/</span><span style="color: #800080;">180.0</span><span style="color: #000000;">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;spotAtt&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(dotSpot&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;cosCutoff)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spotAtt&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spotAtt&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pow(dotSpot,&nbsp;light[i].spotExponent);&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;att&nbsp;</span><span style="color: #000000;">*=</span><span style="color: #000000;">&nbsp;spotAtt;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;vec3&nbsp;h&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;normalize(VP</span><span style="color: #000000;">+</span><span style="color: #000000;">eye);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;dotVP&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;max(</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;dot(normal,&nbsp;VP));<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;dotHV&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;max(</span><span style="color: #800080;">0</span><span style="color: #000000;">,&nbsp;dot(normal,&nbsp;h));<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;amb&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;light[i].ambient&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;att;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;diff&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;light[i].diffuse&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;dotVP&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;att;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;spec&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;light[i].specular&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pow(dotHV,&nbsp;gl_FrontMaterial.shininess)&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;att;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
这样，对于场景之中的任意对象，它所能够接受计算的光源就可以突破8个的限制了。<br />
上述光照计算是遵循OpenGL spec的，因此与固定管线的效果是一致的。<br />
<br />
<br />
<br />
<br />
<img src ="http://www.cnblogs.com/CGDeveloper/aggbug/1233816.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43762/" target="_blank">[新闻]TinEye - 用图像搜索图像</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>