我在C和SDL2中有一个带有像素阵列的程序:
Uint32 *pixels = NULL;
pixels = (Uint32 *) malloc (sizeof(Uint32)*(Uint32)windowWidth*(Uint32)windowHeight);
memset(pixels, 255, (Uint32)windowWidth*(Uint32)windowHeight*sizeof(Uint32));
使用memset,使我的第二个参数"255"将所有像素设置为白色。下面每隔一个数字,将像素设置为灰色阴影。如何将这些像素设置为实际颜色?
我使用这个像素阵列通过纹理和其他东西来设置屏幕颜色。纹理的像素格式为ARGB8888
,因此四色通道的十六进制值应该有效,不是吗?
SDL_UpdateTexture(texture, NULL, pixels, (int)((Uint32)windowWidth * sizeof(Uint32)));
我尝试过使用十六进制,例如0xFFCC00FF
,但这只是将其设置为白色。
memset
的问题在于它将相同的值复制到每个字节。您希望在具有4字节值的循环中使用memcpy
。
Uint32 numPixels = (Uint32)windowWidth * (Uint32)windowHeight;
Uint32 color = (Uint32)0xFFCC00FF;
for (Uint32 i = 0; i < numPixels; ++i)
{
memcpy(pixels + i * sizeof(Uint32), &color, sizeof(color));
}
使用for
循环:
Uint32 *pixels = NULL;
size_t nPixels = windowWidth * windowHeight;
pixels = malloc (sizeof (Uint32) * nPixels);
for (size_t c = 0; c < nPixels; c++) {
pixels[c] = color;
}
这不使用memset,但多亏了@Banex,我才想出了一些有效的方法。
Uint32 colour = (Uint32)0xFFCC00FF;
int i,j;
for(i=0;i<windowWidth;i++)
{
for(j=0;j<windowHeight;j++)
{
pixels[i+j*windowWidth]=colour;
}
}