91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

基于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

永善县| 远安县| 阳谷县| 广汉市| 四子王旗| 宿迁市| 姜堰市| 平邑县| 新沂市| 手游| 东兰县| 铅山县| 朝阳区| 营山县| 容城县| 黔西县| 清苑县| 洪湖市| 治多县| 金坛市| 肥西县| 甘泉县| 宁河县| 大洼县| 泗阳县| 行唐县| 宣武区| 晋城| 莎车县| 阿瓦提县| 射洪县| 平原县| 安泽县| 紫阳县| 赫章县| 桐庐县| 玉溪市| 南昌市| 富宁县| 绍兴县| 遂溪县|