67 lines
1.9 KiB
Python
67 lines
1.9 KiB
Python
"""
|
|
Converts the cubemap to a spherical one
|
|
"""
|
|
|
|
from __future__ import division, print_function
|
|
|
|
from panda3d.core import * # noqa
|
|
load_prc_file_data("", "textures-power-2 none")
|
|
|
|
import direct.directbase.DirectStart # noqa
|
|
|
|
cubemap = loader.load_cube_map("../../../../data/default_cubemap/source/#.jpg")
|
|
w, h = 4096, 2048
|
|
|
|
cshader = Shader.make_compute(Shader.SL_GLSL, """
|
|
#version 430
|
|
layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in;
|
|
|
|
uniform samplerCube SourceTex;
|
|
uniform writeonly image2D DestTex;
|
|
#define M_PI 3.1415926535897932384626433
|
|
#define TWO_PI 6.2831853071795864769252867
|
|
|
|
// Converts a normalized spherical coordinate (r = 1) to cartesian coordinates
|
|
vec3 spherical_to_vector(float theta, float phi) {
|
|
float sin_theta = sin(theta);
|
|
return normalize(vec3(
|
|
sin_theta * cos(phi),
|
|
sin_theta * sin(phi),
|
|
cos(theta)
|
|
));
|
|
}
|
|
|
|
// Fixes the cubemap direction
|
|
vec3 fix_cubemap_coord(vec3 coord) {
|
|
return normalize(coord.xzy * vec3(1,-1,1));
|
|
}
|
|
|
|
void main() {
|
|
ivec2 dimensions = imageSize(DestTex).xy;
|
|
ivec2 coord = ivec2(gl_GlobalInvocationID.xy);
|
|
float theta = (coord.x + 0.5) / float(dimensions.x) * TWO_PI;
|
|
float phi = (dimensions.y - coord.y - 0.5) / float(dimensions.y) * M_PI;
|
|
vec3 v = spherical_to_vector(phi, theta);
|
|
v = fix_cubemap_coord(v);
|
|
vec4 color = texture(SourceTex, v);
|
|
imageStore(DestTex, coord, vec4(color));
|
|
}
|
|
""")
|
|
|
|
dest_tex = Texture("")
|
|
dest_tex.setup_2d_texture(w, h, Texture.T_float, Texture.F_rgba16)
|
|
|
|
print("Converting to spherical coordinates ..")
|
|
np = NodePath("np")
|
|
np.set_shader(cshader)
|
|
np.set_shader_input("SourceTex", cubemap)
|
|
np.set_shader_input("DestTex", dest_tex)
|
|
attr = np.get_attrib(ShaderAttrib)
|
|
base.graphicsEngine.dispatch_compute((w // 16, h // 16, 1), attr, base.win.gsg)
|
|
|
|
print("Extracting data ..")
|
|
base.graphicsEngine.extract_texture_data(dest_tex, base.win.gsg)
|
|
|
|
print("Writing texture ..")
|
|
dest_tex.write("envmap.png")
|