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

使用Raylib开发类Minecraft游戏:屏幕中心像素颜色获取失败求助

问题分析与解决

你的代码存在两个核心问题,导致始终获取到黑色像素:

  • RenderTexture未被正确使用:每次循环创建的RenderTexture是空白状态,没有将当前帧的画面渲染进去,自然只能读取到默认的黑色像素。
  • 资源泄漏:每次循环创建RenderTexture却未释放,会持续占用内存。

修正后的代码

#include "raylib.h"
#include <stdio.h>

int main() {
    const int screenWidth = 800;
    const int screenHeight = 450;
    const int screenCenterX = screenWidth / 2;
    const int screenCenterY = screenHeight / 2;

    InitWindow(screenWidth, screenHeight, "raylib Minecraft-like Cursor Color");
    // 提前创建RenderTexture,避免重复创建销毁
    RenderTexture2D renderTexture = LoadRenderTexture(screenWidth, screenHeight);
    SetTargetFPS(60);

    while (!WindowShouldClose()) {
        // 第一步:将场景渲染到RenderTexture中
        BeginTextureMode(renderTexture);
            ClearBackground(RAYWHITE);
            // 这里可添加你的3D场景渲染逻辑(比如方块、相机视角)
            // 示例:在屏幕中心绘制白色方块用于测试
            DrawRectangle(screenCenterX-20, screenCenterY-20, 40, 40, WHITE);
        EndTextureMode();

        // 第二步:从RenderTexture提取中心像素颜色
        Image screenImage = LoadImageFromTexture(renderTexture.texture);
        // Raylib的RenderTexture Y轴是翻转的,需修正坐标
        Color pixelColor = GetPixelColor(screenImage, screenCenterX, screenHeight - screenCenterY - 1);
        UnloadImage(screenImage);

        // 第三步:将纹理内容绘制到屏幕并显示颜色信息
        BeginDrawing();
            ClearBackground(RAYWHITE);
            // 处理纹理翻转,正常显示画面
            DrawTexturePro(renderTexture.texture, 
                (Rectangle){0, 0, screenWidth, -screenHeight}, 
                (Rectangle){0, 0, screenWidth, screenHeight}, 
                (Vector2){0, 0}, 0.0f, WHITE);
            
            char text[50];
            sprintf(text, "R:%i G:%i B:%i", pixelColor.r, pixelColor.g, pixelColor.b);
            DrawText(text, 10, 10, 20, BLACK);
        EndDrawing();
    }

    // 释放RenderTexture资源
    UnloadRenderTexture(renderTexture);
    CloseWindow();
    return 0;
}

关键修正说明

  1. 复用RenderTexture:在循环外创建一次纹理,避免重复内存分配,循环结束后必须释放资源。
  2. 定向渲染到纹理:用BeginTextureMode和EndTextureMode包裹场景渲染代码,让画面输出到目标纹理中。
  3. 修正Y轴坐标:Raylib的RenderTexture纹理Y轴是翻转的,所以需要用screenHeight - screenCenterY - 1来匹配屏幕中心的实际位置。
  4. 正常显示纹理内容:通过DrawTexturePro处理纹理翻转问题,确保渲染到屏幕的画面是正确方向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:19:58