ここ数か月、夜と週末に SDL でプロジェクトに取り組んでいます。現在、メニューシステムを機能させようとしています。現時点では、を使用してテキストを描画する作業を行っていますSDL_TTF
。私の質問ですが、いくつかのテクスチャを別のテクスチャに描画しようとすると、奇妙な動作が見られます。
奇妙なことに、それを描画すると、SDL_TEXTUREACCESS_TARGET
(ドキュメントで行うように)で作成された宛先テクスチャで何も描画されませんが、エラーは返されません。ただし、SDL_TEXTUREACCESS_STATIC
orを使用SDL_TEXTUREACCESS_STREAM
すると、アクセス属性のためにレンダー ターゲットを設定するとエラーが返されますが、問題なく描画されます。掘り下げた後、Intelドライバーのバグについていくつか聞いたので(Intelグラフィックスを搭載したMacbookを使用しています)、これは私が台無しにしたものなのか、どうすれば修正できるのか疑問に思っていました. 代わりに、それが私のせいでない場合でも、何が起こっているのか、プラットフォームによってパフォーマンスが異なるのか、どうすれば回避できるのかを知りたいです。
不要な部分を削除した後のコードは次のとおりです。
レンダラーを作成します。
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
後でキャンバスにレンダリングすると、次のようになります。
TTF_Font *fnt = loadFont(fontName.c_str(), fontSize);
ここでは、いくつかの属性を解析し、TTF_SetFontStyle() とテキストの色の clr を使用してそれらを設定します。
SDL_Texture *canvas;
canvas = SDL_CreateTexture(rendy, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, contentRect.w, contentRect.h)
SDL_SetRenderTarget(rendy, canvas);
int pos = 0;
for (list<string>::iterator itr = lines.begin(); itr != lines.end(); itr++){
SDL_Surface *temp;
temp = TTF_RenderText_Blended(fnt, src.c_str(), clr);
SDL_Texture *line;
line = SDL_CreateTextureFromSurface(rendy, temp);
int w,h;
SDL_QueryTexture(line, NULL, NULL, &w, &h);
SDL_Rect destR;
//Assume that we're left justified
destR.x = 0;
destR.y = pos;
destR.w = w;
destR.h = h;
SDL_RenderCopy(rendy, line, NULL, &destR);
SDL_DestroyTexture(line);
SDL_FreeSurface(temp);
pos += TTF_FontLineSkip(fnt);
}
//Clean up
SDL_SetRenderTarget(rendy, NULL);
canvas は呼び出し元の関数に返されるため、このテキスト ボックスが変更されるまでキャッシュされます。この関数は、ボックス全体のテクスチャを用意し、背景テクスチャをその上に描画し、その上にこの画像を描画して、全体を保持することで機能します。
そのコードは次のようになります。
(背景を描画するためのもので、うまくレンダリングされます)
SDL_Texture *sum = SDL_CreateTexture(rendy, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, globalRect.w, globalRect.h);
SDL_SetTextureBlendMode(sum, SDL_BLENDMODE_BLEND);
SDL_SetRenderTarget(rendy, sum);
string lPad = getAttribute(EL_LEFT_PADDING);
string tPad = getAttribute(EL_TOP_PADDING);
int paddingL = strtol(lPad.c_str(), NULL, 10);
int paddingT = strtol(tPad.c_str(), NULL, 10);
SDL_Rect destR;
SDL_Rect srcR;
srcR.x = 0;
srcR.y = 0;
srcR.w = globalRect.w; //globalRect is the size size of the whole button
srcR.h = globalRect.h;
destR.x = 0;
destR.y = 0;
destR.w = globalRect.w;
destR.h = globalRect.h;
SDL_RenderCopy(rendy, bgTexture, NULL, &destR);
int maxX = contentRect.w;
fgTexture = getFGImage(rendy); //The call to the previous part
int w, h;
SDL_QueryTexture(fgTexture, NULL, NULL, &w, &h);
int width, height;
getTextSize(&width, &height, maxX);
srcR.x = 0;
srcR.y = 0;
srcR.w = width;
srcR.h = height;
destR.x = paddingL;
destR.y = paddingT;
destR.w = globalRect.w;
destR.h = globalRect.h;
SDL_RenderCopy(rendy, fgTexture, NULL, &destR);
SDL_DestroyTexture(fgTexture);
SDL_DestroyTexture(bgTexture);
return sum;
Sum は、描画を行う別の関数に返されます。
前もって感謝します!
更新 したがって、アクセス設定が正しくない場合にのみ描画された理由は、関数がエラー値を返していたため、レンダー ターゲットがテクスチャに設定されていなかったため、画面上に描画されただけだったことがわかりました。 . また、テクスチャのテクスチャ形式がレンダラーでサポートされていることを確認し、アクセス属性の文字列の説明を出力し、寸法を出力する関数 AuditTexture を作成して、すべてのテクスチャをチェックしました。すべてのテクスチャ フォーマットがサポートされていること、2 つのラインが静的であること、canvas と sum がレンダー ターゲットであること、次元が 0 ではないことがわかりました。