環境貼圖自動紋理座標產生

來源:互聯網
上載者:User

Normal Map
Normal Map適合用於渲染有固定光源和漫反射的情境。其眼座標中的單位法向量Nx、Ny和Nz作為其紋理座標s、r、t。

 

Reflection Map
功能上和Sphere Map類似,非常適合於環境映射。其實現方法是將其單位反射向量作為其紋理座標s、r、t。
其中反射向量可以通過入射向量和法向量求得:R = U - 2 * transpose(N) * (U dot N)。GLSL中可以調用reflect函數。

 

vec3 ReflectionMap(in vec3 ecPosition3, in vec3 normal)<br />{<br />float NdotU, m;<br />vec3 u;<br />u = normalize(ecPosition3);<br />return (reflect(u, normal));<br />}

 

Sphere Map
球面環境貼圖只產生s和t。

(1) 將反射向量的x分量和y分量投影到Rz = 0平面的單位圓上。
將反射向量的x分量Rx和y分量Ry按照特定的反射向量長度m縮放,其中m = 2 * sqrt(Rx * Rx + Ry * Ry + (Rz + 1) (Rz + 1))。Rx和Ry除以m,則這兩個分量即會投影到Rz = 0平面上的一個單位圓上。

(2) 得到[0, 1]範圍內的二位紋理座標。
當縮放後位於單位圓內的Rx和Ry乘以0.5並位移0.5,即可得到[0, 1]範圍內的s座標和t座標。

vec2 SphereMap(in vec3 ecPosition3, in vec3 normal)<br />{<br />float m;<br />vec3 r, u;<br />u = normalize(ecPosition3);// u 是一個從原點指向頂點的單位向量(眼座標)<br />r = reflect(u, normal);// r是反射向量(眼座標)<br />m = 2.0 * sqrt(r.x * r.x + r.y * r.y + (r.z + 1.0) * (r.z + 1.0));<br />return vec2(r.x / m + 0.5, r.y / m + 0.5);<br />}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.