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

raylib-rust中GLSL着色器使用问题:着色器未生效求助

问题分析与解决

你的着色器未生效的核心原因是没有在着色器模式的作用域内执行绘制操作。在raylib的Rust绑定中,begin_shader_mode会返回一个ShaderModeDrawHandle,所有需要应用着色器的绘制调用都必须通过这个新句柄执行,而非原来的RaylibDrawHandle。

修正后的代码

调整main.rs中的绘制逻辑:

use raylib::consts::ConfigFlags::FLAG_VSYNC_HINT;
use raylib::ffi::{GetScreenWidth, SetConfigFlags};
use raylib::prelude::*;

fn main() {
    const WINDOW_W: i32 = 800;
    const WINDOW_H: i32 = 600;

    unsafe {
        let (mut rl, rt) = raylib::init()
            .size(WINDOW_W, WINDOW_H)
            .title("raylib [core] example!")
            .build();

        let shader: Shader = rl.load_shader(&rt, None, Some("simple_shader.fs")).unwrap();

        while !rl.window_should_close() {
            let mut d: RaylibDrawHandle = rl.begin_drawing(&rt);

            d.clear_background(Color::BLACK);

            // 使用着色器模式句柄执行绘制
            let mut shader_mode = d.begin_shader_mode(&shader);
            shader_mode.draw_rectangle(0, 0, 100, 100, Color::WHITE);
            // shader_mode离开作用域时会自动结束着色器模式,无需手动调用end_shader_mode
        }
    }
}

原代码失效原因

你之前的let _ = d.begin_shader_mode(&shader);仅开启了着色器模式,但未使用返回的句柄执行绘制。begin_shader_mode会临时切换渲染状态,但只有通过它返回的句柄调用绘制函数,才会在该状态下执行。原d仍使用默认渲染状态,因此矩形保持白色。

额外验证点

  1. 确认着色器文件路径正确:确保simple_shader.fs位于项目工作目录下,或使用完整路径加载。
  2. 着色器加载状态:你已通过unwrap()确保加载成功,这部分无需额外处理。

内容的提问来源于stack exchange,提问作者Dennis K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:31:14