1

ここ数か月、夜と週末に SDL でプロジェクトに取り組んでいます。現在、メニューシステムを機能させようとしています。現時点では、を使用してテキストを描画する作業を行っていますSDL_TTF。私の質問ですが、いくつかのテクスチャを別のテクスチャに描画しようとすると、奇妙な動作が見られます。

奇妙なことに、それを描画すると、SDL_TEXTUREACCESS_TARGET(ドキュメントで行うように)で作成された宛先テクスチャで何も描画されませんが、エラーは返されません。ただし、SDL_TEXTUREACCESS_STATICorを使用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 ではないことがわかりました。

4

1 に答える 1