2025年球面贴图(Sphere Map)

球面贴图(Sphere Map)球面贴图用于环境反射 reflection 纹理坐标的生成与 cube map 的 reflection mode 类似 推导如下 顶点处理器 Sphere Mapping Shader Vertex Shader Richard S Wright Jr OpenGL

大家好,我是讯享网,很高兴认识大家。

         球面贴图用于环境反射(reflection), 纹理坐标的生成与cube map的reflection mode类似:

        
讯享网

 推导如下:

顶点处理器:

// Sphere Mapping Shader // Vertex Shader // Richard S. Wright Jr. // OpenGL SuperBible #version 130 // Incoming per vertex... position and normal in vec4 vVertex; in vec3 vNormal; uniform mat4 mvpMatrix; uniform mat4 mvMatrix; uniform mat3 normalMatrix; // Color to fragment program smooth out vec2 vVaryingTexCoord; // Generates a sphere map texture coordinate based on the eyespace surface normal // and the eye space vertex. vec2 sphereMap(in vec3 normal, in vec3 ecPosition3) { float m; vec3 r, u; u = normalize(ecPosition3); r = reflect(u, normal); m = 2.0 * sqrt(r.x * r.x + r.y * r.y + (r.z + 1.0) * (r.z + 1.0)); return vec2 (r.x / m + 0.5, r.y / m + 0.5); } void main(void) { // Normal in Eye Space vec3 vEyeNormal = normalMatrix * vNormal; // Vertex position in Eye Space vec4 vVert4 = mvMatrix * vVertex; vec3 vEyeVertex = vVert4.xyz / vVert4.w; // Pass on the texture coordinates vVaryingTexCoord = sphereMap(vEyeNormal, vEyeVertex); // Don't forget to transform the geometry! gl_Position = mvpMatrix * vVertex; }

讯享网
讯享网// ADS Point lighting Shader // Fragment Shader // Richard S. Wright Jr. // OpenGL SuperBible #version 130 out vec4 vFragColor; uniform sampler2D sphereMap; smooth in vec2 vVaryingTexCoord; void main(void) { vFragColor = texture(sphereMap, vVaryingTexCoord); }


用于球面贴图的纹理图像:

              在一幅平面纹理图像中对各个方向的颜色进行编码就相当于把一个擦得锃亮的完美球体放在环境的中央,然后在极远处用长焦镜头对它进行拍照。需要编码的区域就是覆盖整个纹理图像的一个圆形区域,它与纹理图像的顶、底、左、右边缘相切。这个圆形区域之外的纹理值不会对结果产生影响,因为它们不会在环境纹理中使用。

              如下图:

小讯
上一篇 2025-01-11 11:08
下一篇 2025-02-19 07:56

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/59943.html