2018年4月9日 星期一

初探CubeMap

初探CubeMap

前言

  以前CubeMap總是在書上看到範例但卻因為覺得不實用所以總是被我略過,但若想要實現PBR(physically based rendering)的話,其中dynamic environment mapping就需要用到CubeMap,
所以最近開始學習CubeMap的使用,在此做個紀錄。

內容

  在創建紋理資源時,不論是Direct3D或OpenGL都是建6張紋理後來創建,注意的是Direct3D創建時是用陣列的方式給予,而順序是+X、-X、+Y、-Y、+Z與-Z,請照順序放入即可,不用考慮是左手或右手座標系!
  接著是在Shader使用時,HLSL的資料型別是"TextureCube",依舊是透過Sample()來進行取得Texel,GLSL的資料型別是"samplerCube",取得Texel則是透過textureCube()來取得。在GLSL當有使用textureCube()時,請加入以下程式碼在開頭

#extension GL_NV_shadow_samplers_cube : enable

如果不加上面的程式,在GLSL編譯時會有以下錯誤訊息

error c7531:global function textureCube requires "#extension GL_NV_shadow_samplers_cube:enable" before use

還有以前取Texel都採用UV座標(float2),在CubeMapg時要採用UVW座標(float3)來取Texel,其實它就是個"方向",可以想像在Cube的中心用一個"方向"來取Texel。

後記

  這次實作CubeMap遽然意外的順利,只有碰到GLSL的編譯問題!CubeMap使用起來並不難,日後在實作dynamic environment mapping後應該會再寫一篇。

參考資料

D3D11: Creating a cube map from 6 images
Opengl's cubemaps
Fix glsl's c7531 error

沒有留言:

張貼留言