亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于Qt的OpenGL可編程管線學習(8)- 探照燈

發布時間:2020-06-18 21:34:48 來源:網絡 閱讀:508 作者:Douzhq 欄目:編程語言

關于探照燈的效果如下圖所示:

基于Qt的OpenGL可編程管線學習(8)- 探照燈

基于Qt的OpenGL可編程管線學習(8)- 探照燈


探照燈需要傳入光源的位置,光源的方向以及夾角的大小(夾角為光源覆蓋的夾角的一半)

計算思路:

用光源到點的距離與光源的方向的單位向量做點乘,得到夾角的cos,用計算的夾角cos與

傳入的角度的cos做比較,確定光線照射的范圍。邊緣不部分計算的cos做基底,然后給定一個冪,

就可以做到漸變的效果;探照燈的計算時也要算上衰減


Shader中的相關代碼如下:

vec3 light = M_LightPos.xyz;
float distanceLight = 0.0;      // 距離光源的距離
float attenuation = 1.0;         // 衰減系數

// 衰減因子
float constantFactor = 0.9;           // 常亮衰減常數
float linerFactor = 0.0;                 //  線性衰減系數
float expFactor = 0.0;                  //  平方衰減系數
// 點光源
if (M_LightPos.w != 0.0)
{
    light = M_LightPos.xyz - M_WordPos;
    distanceLight = length(light);
    attenuation = 1.0 / (constantFactor + linerFactor * distanceLight + expFactor * distanceLight * distanceLight);
}
vec3 LightNormal = normalize(light);       // 指向光源的單位向量
vec3 NormalNormal = normalize(M_normal);      //  法線的單位向量

light = M_LightPos.xyz - M_WordPos;
vec3 spotLightPointDirection = normalize(-light);
vec3 spotLightDirection = normalize(M_SpotLightDirection.xyz);
float spotDegreeCos = dot(spotLightPointDirection, spotLightDirection);
float spotCutoffCos = cos(M_SpotLightCutoff * 3.14 / 180.0);
float diffuseIntensity = 0.0;
if (M_SpotLightDirection.w > 0 && M_SpotLightCutoff > 0)
{
    if (spotDegreeCos > spotCutoffCos)
    {
        diffuseIntensity = pow(max(0.0, spotDegreeCos), M_SpotLightDirection.w) * 2;
    }
}
else
{
    diffuseIntensity = max(0.0, dot(NormalNormal, LightNormal));
}
vec4 diffuseColor = M_DiffuseLightColor * M_DiffuseMaterial * 
                    diffuseIntensity * attenuation;


CPU中的設置

// 光源位置
float nLightPos[4] = {0.0f, 0.0f, -2.0f, 1.0f};
OpenGLCore->glUniform4fv(m_LightPos, 1, nLightPos);
// 探照燈方向及角度
float nSpotLightDirection[4] = {0.0f, 0.0f, -1.0f, 128.0f};
OpenGLCore->glUniform4fv(m_SpotLightDirection, 1, nSpotLightDirection);
float nSpotLightDegree = 30.0f;
OpenGLCore->glUniform1f(m_SpotLightCutoff, nSpotLightDegree);


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

区。| 西青区| 双辽市| 托里县| 灌南县| 申扎县| 建德市| 会泽县| 曲靖市| 文山县| 定边县| 贡嘎县| 广水市| 鹰潭市| 泗洪县| 库车县| 昌宁县| 宁波市| 布拖县| 杭州市| 祁阳县| 房山区| 上犹县| 皋兰县| 广德县| 临高县| 怀来县| 讷河市| 松溪县| 社旗县| 尼玛县| 墨竹工卡县| 厦门市| 阜阳市| 浮山县| 邯郸县| 达拉特旗| 扬中市| 莲花县| 柳河县| 开远市|