iridescence icon indicating copy to clipboard operation
iridescence copied to clipboard

how to adjust the transparency of a texture mesh?

Open PengZai opened this issue 2 months ago • 2 comments

cv::Mat image = cv::imread("../figs/vis_ref_rgb_data.png"); auto texture = glk::create_texture(image);

auto front_shader_setting = guik::ShaderSetting(guik::ColorMode::TEXTURE_COLOR, transformation); front_shader_setting.set_alpha(0.5f);

std::shared_ptrglk::Mesh sides_wire, front_tex; make_camera_drawables(sides_wire, front_tex, 1.0f, 0.6f, 0.8f, texture);

viewer->update_drawable("front", front_tex, front_shader_setting);

void make_camera_drawables(std::shared_ptrglk::Mesh& sides_wire, std::shared_ptrglk::Mesh& front_tex, float w, float h, float z, const std::shared_ptrglk::Texture& texture) { // ----- shared geometry (5 vertices: 4 corners + apex) ----- // std::vectorEigen::Vector3f vertices = { // { w/2.f, h/2.f, z}, // 0 // {-w/2.f, h/2.f, z}, // 1 // {-w/2.f, -h/2.f, z}, // 2 // { w/2.f, -h/2.f, z}, // 3 // { 0.f, 0.f, 0.f} // 4 (apex) // };

std::vector<Eigen::Vector3f> vertices = {
    {w / 2, -h / 2, z},
    { -w / 2, -h / 2, z},
    { -w / 2, h / 2, z},
    { w / 2, h / 2, z},
    {0,0,0}
};



std::vector<unsigned int> side_indices = {
    0,4,1,  1,4,2,  2,4,3,  3,4,0
};

// ----- sides: wireframe, no texcoords -----
sides_wire = std::make_shared<glk::Mesh>(
    vertices.data(),             sizeof(float)*3,   // positions
    nullptr,                     0,                 // normals (none)
    nullptr,                     0,                 // colors (none)
    nullptr,                     0,                 // texcoords (none)
    static_cast<int>(vertices.size()),
    side_indices.data(),
    static_cast<int>(side_indices.size()),
    /*wireframe=*/true
);

// ----- front: its own 4-vertex list + texcoords + texture -----
std::vector<Eigen::Vector3f> v_front = {
    vertices[0], 
    vertices[1], 
    vertices[2], 
    vertices[3]
};
std::vector<unsigned int> front_indices = { 
    0,2,1,
    0,3,2 
};

std::vector<Eigen::Vector4f> front_vertice_colors = {
  {1.0f, 1.0f, 1.0f, 1.0f},
  {1.0f, 1.0f, 1.0f, 1.0f},
  {1.0f, 1.0f, 1.0f, 1.0f},
  {1.0f, 1.0f, 1.0f, 1.0f}
};


// UVs for the front face (flip V if your image is upside-down)
std::vector<Eigen::Vector2f> uv_front = {
    {1.f, 0.f},  // for v_front[0]
    {0.f, 0.f},  // for v_front[1]
    {0.f, 1.f},  // for v_front[2]
    {1.f, 1.f}   // for v_front[3]
    // {0.0f, 0.0f},
    // {1.0f, 0.0f},
    // {1.0f, 1.0f},
    // {0.0f, 1.0f}
};

std::vector<Eigen::Vector3f> normals = {
    {0.f,0.f,1.f}
};


front_tex = std::make_shared<glk::Mesh>(
    v_front.data(),              sizeof(float)*3,
    normals.data(),    sizeof(float)*3,              // normals (optional)
    front_vertice_colors.data(),                     sizeof(float)*4,                 // colors (none)
    uv_front.data(),             sizeof(float)*2,   // texcoords
    static_cast<int>(v_front.size()),
    front_indices.data(),
    static_cast<int>(front_indices.size()),
    /*wireframe=*/false
);
front_tex->set_texture(texture);

}

I go through the source code , it looks like we can't control the color of texture. if I call set_alpha, that change the material_color...

how can I do to change the transparency of texture?

PengZai avatar Oct 28 '25 15:10 PengZai

In TEXTURE_COLOR mode, alpha values are obtained from the texture data, and material alpha is ignored. You can make textured objects transparent by adjusting the alpha values of texture pixels.

koide3 avatar Oct 29 '25 23:10 koide3

cv::Mat image = cv::imread("../figs/vis_ref_rgb_data.png"); auto texture = glk::create_texture(image);

so I have to set alpha value either on image or texture, I go through your code, I didn't find any set_alpha function on texture class. so I have to set alpha on cv::Mat image manually?

PengZai avatar Oct 29 '25 23:10 PengZai