c++ 从SDL2纹理获取像素信息

iqih9akk  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(404)

我目前正在用SDL2编写一个简单的程序,你可以把一些形状(正方形,圆形,三角形等)拖到画布上,旋转和移动它们。每个形状都由一个从PNG文件创建的SDL纹理可视化地表示(使用SDL_image库中的IMG_LoadTexture函数)。
问题是,我想知道纹理中的某个像素是否透明,这样当有人点击图像时,我就可以确定我是否必须做一些操作(因为点击是在不透明的区域)还是不。因为这是一些学校作业我面临一些限制,就是,我只使用SDL2库,而且我不能有一些Map来查找有问题的像素是否透明,因为图像是动态选择的。此外,我考虑使用SDL表面为这个任务创建他们从原始图像,但由于事实上,形状是通过纹理旋转,这将不工作。

kyvafyod

kyvafyod1#

您可以使用Render Targets来完成此操作。

SDL_SetRenderTarget(renderer, target);
... render your textures rotated, flipped, translated using SDL_RenderCopyEx
SDL_RenderReadPixels(renderer, rect, format, pixels, pitch);

在最后一步中,你使用SDL_RenderReadPixels从渲染目标读取像素,然后你必须弄清楚所需像素的alpha通道是否为零(透明)。你可以只从渲染目标读取一个像素,或者整个纹理,你选择哪个选项取决于你必须执行的点击测试的数量,纹理旋转/移动的频率等等。

dxxyhpgq

dxxyhpgq2#

您需要使用SDL_TEXTUREACCESS_STREAMING标志创建纹理并锁定纹理,然后才能操作像素数据。要判断纹理中的某个像素是否透明,请确保调用

SDL_SetTextureBlendMode(t, SDL_BLENDMODE_BLEND);

这允许纹理识别阿尔法通道。
试试这样的方法:

SDL_Texture *t;

int main()
{
    // initialize SDL, window, renderer, texture
    int pitch, w, h;
    void *pixels;

    SDL_SetTextureBlendMode(t, SDL_BLENDMODE_BLEND);

    SDL_QueryTexture(t, NULL, &aw, &h);
    SDL_LockTexture(t, NULL, &pixels, &pitch);
    Uint32 *upixels = (Uint32*) pixels;

    // you will need to know the color of the pixel even if it's transparent
    Uint32 transparent = SDL_MapRGBA(SDL_GetWindowSurface(window)->format, r, g, b, 0x00);

    // manipulate pixels
    for (int i = 0; i < w * h; i++)
    {
        if (upixels[i] == transparent)
            // do stuff
    }

    // replace the old pixels with the new ones
    memcpy(pixels, upixels, (pitch / 4) * h);

    SDL_UnlockTexture(t);

    return 0;
}

如果你有任何问题,请随时问。虽然我不是这个主题的Maven。
要获得更多的阅读和教程,请查看http://lazyfoo.net/tutorials/SDL/index.php。教程40专门处理像素操作。
如果在方法名称中有任何错误,我向您道歉(我已经把这些写在脑子里了)。
希望这个有用。

相关问题