You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Raylib新手求助:绘制透明3D物体时显示ClearBackground颜色而非透明

Raylib中3D透明物体显示背景色而非透明的解决方法

问题描述

我是C++和Raylib的新手,尝试绘制透明立方体或其他3D物体时,物体显示的是ClearBackground设置的颜色,而非预期的透明效果。比如用BLANK颜色绘制球体,运行后它会清除后方的所有物体,显示背景色,我需要实现类似玻璃的半透明效果。

示例代码:

#include <raylib.h>

int main() {

    const int screenWidth = 800;
    const int screenHeight = 450;

    InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera first person");

    Camera3D cam = { -2 ,2 ,0 };
    cam.fovy = 90;
    cam.up = (Vector3){ 0 ,1 ,0 };
    cam.target = (Vector3){ 0, 0, 0 };

    while (!WindowShouldClose())
    {
        // --- Update ---
        UpdateCamera(&cam, CAMERA_ORBITAL);

        // --- Draw ---
        BeginDrawing();

            ClearBackground(GRAY);

            BeginMode3D(cam);

                DrawSphere((Vector3){ -1, 0 ,0 }, .5, BLANK);
                DrawCubeWiresV((Vector3){ -1, 0 ,0 }, (Vector3){ 1, 1, 1 }, RED);
                DrawCubeWiresV((Vector3){ 1, 0 ,0 }, (Vector3){ 1, 1, 1 }, RED);

            EndMode3D();

        EndDrawing();
    }
    
    CloseWindow();

    return 0;
}

解决方案

核心问题

BLANK颜色的作用是清除画布上的对应像素,并非实现透明效果,所以会显示背景色。要实现半透明,需要使用带alpha通道的颜色,并正确配置Raylib的混合模式与绘制顺序。

具体步骤

  1. 使用带alpha通道的颜色
    不要用BLANK,改用Fade()函数生成半透明颜色,或者直接定义包含alpha值的Color结构体:

    • Fade(WHITE, 0.3f):生成透明度为30%的白色(第二个参数范围0-1,0完全透明,1完全不透明)
    • (Color){255, 255, 255, 80}:直接定义alpha值为80(范围0-255)的白色
  2. 开启Alpha混合模式
    在绘制透明物体前显式调用BeginBlendMode(BLEND_ALPHA),确保Raylib正确计算透明度叠加;绘制完成后用EndBlendMode()恢复默认模式。

  3. 注意3D绘制顺序

    • 先绘制所有不透明物体(比如线框立方体)
    • 再绘制透明物体,且多个透明物体需要按照从远到近的顺序绘制,保证透明度叠加正确

修改后的示例代码

#include <raylib.h>

int main() {

    const int screenWidth = 800;
    const int screenHeight = 450;

    // 可选:开启4X MSAA抗锯齿,让透明边缘更平滑
    SetConfigFlags(FLAG_MSAA_4X_HINT);
    InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d transparent objects");

    Camera3D cam = {
        .position = {-2, 2, 0},
        .fovy = 90,
        .up = {0, 1, 0},
        .target = {0, 0, 0},
        .projection = CAMERA_PERSPECTIVE
    };

    while (!WindowShouldClose())
    {
        UpdateCamera(&cam, CAMERA_ORBITAL);

        BeginDrawing();
            ClearBackground(GRAY);

            BeginMode3D(cam);
                // 先绘制远处的不透明线框立方体
                DrawCubeWiresV((Vector3){1, 0, 0}, (Vector3){1, 1, 1}, RED);
                
                // 开启Alpha混合模式绘制透明物体
                BeginBlendMode(BLEND_ALPHA);
                    // 绘制半透明球体(透明度30%的白色)
                    DrawSphere((Vector3){-1, 0, 0}, 0.5f, Fade(WHITE, 0.3f));
                EndBlendMode();

                // 绘制近处的不透明线框立方体
                DrawCubeWiresV((Vector3){-1, 0, 0}, (Vector3){1, 1, 1}, RED);
            EndMode3D();
        EndDrawing();
    }
    
    CloseWindow();
    return 0;
}

额外说明

  • 如果需要模拟玻璃效果,可以调整颜色的透明度和RGB值(比如浅蓝色Fade(SKYBLUE, 0.2f))
  • 对于复杂场景中的多个透明物体,务必严格遵循从远到近的绘制顺序,否则会出现透明度叠加错误的情况

内容的提问来源于stack exchange,提问作者sina kasesaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:04:50