从SDL2纹理获取像素信息

时间:2013-10-01 03:32:03

标签: sdl-2

我目前正在使用SDL2编写一个简单的程序,您可以将一些形状(正方形,圆形,三角形等)拖动到画布中并旋转它们并移动它们。每个形状都由SDL纹理直观表示,该纹理是从PNG文件创建的(使用SDL_image库中的IMG_LoadTexture函数)。

问题是我想知道纹理中的某个像素是否是透明的,所以当有人点击图像时我可以确定是否必须做一些动作(因为点击是在非透明区域) 或不。 因为这是一些学校作业,我面临一些限制,也就是说,只使用SDL2库,如果所讨论的像素是透明的,因为图像是经过二次选择的,所以我无法找到一些地图。此外,我考虑过使用SDL表面来完成这项任务,从原始图像中创建它们,但是由于这些形状正在旋转通过不起作用的纹理。

2 个答案:

答案 0 :(得分:4)

您可以使用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通道是否为零(透明)。您可以从渲染目标或整个纹理中只读取您想要的一个像素,您选择哪个选项取决于您必须执行的命中测试的数量,纹理旋转/移动的频率等等。

答案 1 :(得分:2)

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

SDL_SetTextureBlendMode(t, SDL_BLENDMODE_BLEND);

这允许纹理识别alpha通道。

尝试这样的事情:

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;
}

如果您有任何疑问,请随时提出。虽然我不是这个主题的专家。

有关详细阅读和教程,请查看http://lazyfoo.net/tutorials/SDL/index.php。教程40具体涉及像素操作。

如果方法名称中有任何错误,我会道歉(我把它写在了我的头顶)。

希望这会有所帮助。