关于纹理表面贴合,研究了几天的一个疑问↓↓↓↓↓↓↓↓
c4droid吧
全部回复
仅看楼主
level 13
savage200 楼主
我准备在一个背景纹理上合并一文字,我有两个思路:
1。思路如下
SUR = IMG_Load(Bkg_Img);
生成表面
Bkg_Texture = SDL_CreateTextureFromSurface(REN, SUR);
生成纹理
SDL_GetClipRect(SUR,&Bkg_Rect);
获取高宽
SDL_Surface *txtsur=TTF_RenderUTF8_Blended(Font,"测试用文字字符串!", SDL_Color {220, 220, 220, 0});
生成文字表面
SDL_BlitSurface(txtsur,NULL,SUR,NULL);
贴合表面
SDL_FreeSurface(txtsur);
清除
Bkg_Texture = SDL_CreateTextureFromSurface(REN, SUR);
生成纹理合并
下边显示
SDL_FreeSurface(SUR);
SDL_RenderClear(REN);
SDL_RenderCopy(REN, Bkg_Texture, &Bkg_Rect , &Screen_Rect);
SDL_RenderPresent(REN);
这个思路,显示一切正常
_______________________________________________________________
2。思路如下
SUR = IMG_Load(Bkg_Img);
生成表面
Bkg_Texture = SDL_CreateTextureFromSurface(REN, SUR);
创建纹理
SDL_QueryTexture(Bkg_Texture, NULL, NULL, &Bkg_Rect.w, &Bkg_Rect.h);
获取高宽
SDL_Surface *txtsur = TTF_RenderUTF8_Blended(Font, "测试用文字字符串!" , SDL_Color {220, 220, 220, 0});
生成文字表面
SDL_Rect rect;
矩形
SDL_GetClipRect(txtsur,&rect);
获取表面矩形
rect.w=Bkg_Rect.w;
约束矩形宽为背景宽
SDL_BlitSurface(txtsur,&rect,SUR,&rect);
贴合表面
SDL_FreeSurface(txtsur);
清除
SDL_UpdateTexture(Bkg_Texture,&rect,SUR->pixels ,SUR->pitch);
更新纹理
下边显示
SDL_FreeSurface(SUR);
SDL_RenderClear(REN);
SDL_RenderCopy(REN, Bkg_Texture, &Bkg_Rect, &Screen_Rect);
SDL_RenderPresent(REN);
这个思路,显示不正常,贴合部分出现循环贴合效果!
理论上这两种方法应该结果是一样的,但是结果去出乎意料,调试很久了,没达预期!请高手指点下!
2016年10月29日 09点10分 1
level 13
savage200 楼主
思路一的局限性大,再次贴合表面时,必须全部重贴!
思路二灵活!两次贴合表面时,直接贴就好了!
2016年10月29日 09点10分 3
两次打错是 再次
2016年10月29日 09点10分
level 13
savage200 楼主
我觉得问题应该出在,文字生成的表面的图象生成的表面在pixels上不一致,导致在复制时默认块移时是点对点,所以在复制过程中出现了意外中断,所以出现循环贴合效果!可能要改变复制模式用rle什么的,再调试调试。。。
2016年10月30日 01点10分 6
level 13
savage200 楼主
TTF_RenderUTF8_Blended(Font,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", SDL_Color {220, 220, 220, 0});
从红箭头处开始,出现循环贴合,其实是不
正确的

2016年10月30日 09点10分 7
level 13
savage200 楼主
来个高人解惑啊!!![汗][汗][汗][汗][汗][汗]
2016年10月30日 14点10分 8
.
2016年10月30日 15点10分
.
2016年10月31日 03点10分
level 12
第二种方法是可以的
2016年10月31日 04点10分 10
level 12
可能是你Surface表面的格式有问题,
看看surface->format是不是24位的。
我以前搞像素操作时就卡在这了
2016年10月31日 04点10分 11
查阅了很多资料,发现没人用这种方法,它们都是在表面进行操作,因为是在cpu和内存操作,很灵活。而纹理是在显存里,受限很多,所以可能就是显卡差异不兼容。
2016年10月31日 13点10分
1