梯度生成产生奇怪的伪像
Gradient generation produces strange artifacts
当我使用以下代码生成渐变时,它会在图像中心附近产生类似渐变的奇怪裂缝。
生成代码:
void getRgb(GLfloat* pixels1,GLubyte* out)//convert fractional values into color
{
for (int i = 0;i < 90*90;i++)
{
out[(i*3)+0] = pixels1[i]*255;
out[(i*3)+1] = pixels1[i]*255;
out[(i*3)+2] = pixels1[i]*255;
}
}
//gradient generation
multiplier = new GLfloat[90*90];// calc multiplier map
for(int i = 0;i < 90;i++)//2d to 1d
{
for (int j = 0;j < 90;j++)
multiplier[i*90 + j] = cos((j)*(3.14/180));
}
SDL_Surface * image = SDL_CreateRGBSurface(SDL_SWSURFACE, 89, 89, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0);
GLubyte* save = new GLubyte[90*90*3];
getRgb(multiplier,save);
image->pixels = save;
std::string path = "map.bmp";
SDL_SaveBMP(image, path.c_str());
delete save;
image->pixels = NULL;
SDL_FreeSurface(image);
结果artifact.
那是因为您从余弦中得到负值。这些不适合无符号整数像素值,应该在 [0, 255].
范围内
问题是您创建了一个 89x89 的图像并用 90x90 的数组填充它。在每一行的末尾都有一个不匹配,并且由于每个像素都是奇数个字节,它会将下一行偏移一个字节。您的大部分像素几乎都是灰色的,因此您看不到差异,但它会在明暗过渡时显示出来。
好的,可以通过替换来解决:
SDL_Surface * image = SDL_CreateRGBSurface(SDL_SWSURFACE, 89, 89, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0);
GLubyte* save = new GLubyte[90*90*3];
getRgb(multiplier,save);
image->pixels = save;
与:
GLubyte* save = new GLubyte[90*90*3];
getRgb(multiplier,save);
SDL_Surface* image = SDL_CreateRGBSurfaceFrom(save,
90,
90,
24,
90*3,
0x000000FF, 0x0000FF00, 0x00FF0000, 0);
当我使用以下代码生成渐变时,它会在图像中心附近产生类似渐变的奇怪裂缝。
生成代码:
void getRgb(GLfloat* pixels1,GLubyte* out)//convert fractional values into color
{
for (int i = 0;i < 90*90;i++)
{
out[(i*3)+0] = pixels1[i]*255;
out[(i*3)+1] = pixels1[i]*255;
out[(i*3)+2] = pixels1[i]*255;
}
}
//gradient generation
multiplier = new GLfloat[90*90];// calc multiplier map
for(int i = 0;i < 90;i++)//2d to 1d
{
for (int j = 0;j < 90;j++)
multiplier[i*90 + j] = cos((j)*(3.14/180));
}
SDL_Surface * image = SDL_CreateRGBSurface(SDL_SWSURFACE, 89, 89, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0);
GLubyte* save = new GLubyte[90*90*3];
getRgb(multiplier,save);
image->pixels = save;
std::string path = "map.bmp";
SDL_SaveBMP(image, path.c_str());
delete save;
image->pixels = NULL;
SDL_FreeSurface(image);
结果artifact.
那是因为您从余弦中得到负值。这些不适合无符号整数像素值,应该在 [0, 255].
范围内问题是您创建了一个 89x89 的图像并用 90x90 的数组填充它。在每一行的末尾都有一个不匹配,并且由于每个像素都是奇数个字节,它会将下一行偏移一个字节。您的大部分像素几乎都是灰色的,因此您看不到差异,但它会在明暗过渡时显示出来。
好的,可以通过替换来解决:
SDL_Surface * image = SDL_CreateRGBSurface(SDL_SWSURFACE, 89, 89, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0);
GLubyte* save = new GLubyte[90*90*3];
getRgb(multiplier,save);
image->pixels = save;
与:
GLubyte* save = new GLubyte[90*90*3];
getRgb(multiplier,save);
SDL_Surface* image = SDL_CreateRGBSurfaceFrom(save,
90,
90,
24,
90*3,
0x000000FF, 0x0000FF00, 0x00FF0000, 0);