プログラミング
SDL_GPU: SDL3向け、最小限・シングルヘッダー・高性能2Dグラフィックス描画ライブラリ
SDL_GPU minimal, single-header, high-performance 2D graphics painting library (github.com)
要約
SDL_GPUはSDL3向けの軽量かつ高性能な2Dグラフィックス描画ライブラリです。sokol_gpをベースに、より低レベルなAPIとシンプルなリソース管理システムを提供します。サンプルコードやAPIリファレンスが提供されており、開発者は効率的に2Dグラフィックスを描画できます。
全文翻訳
SDL_gp 🏁🏎️ SDL3向けの、最小限で高性能な2D(g)raphics(p)ainterです。
これはsokol_gpのSDL3へのポートであり、主な違いはsokol_gpが内部でリソースを管理するsokolに依存しているのに対し、SDL_gpuはより低レベルであり、sokolに非常に似たシンプルなリソース管理システムを提供することです。
サンプル
プリミティブ:
Rectangle:
Sprite:
Blendmode:
はじめに
すぐに使い始めたい場合は、サンプルフォルダを確認してください。
以下は、赤い四角形を描画する簡単な例です。
// 現在のフレームのコマンドバッファを取得します
SDL_GPUCommandBuffer *cmd_buffer = SDL_AcquireGPUCommandBuffer(device);
// 新しいフレームを開始します
SDL_GPBegin(WINDOW_WIDTH, WINDOW_HEIGHT);
{
// 画面を黒でクリアします。
SDL_GPSetColor((SDL_Color){ 0, 0, 0, 255 });
SDL_GPClear();
// 赤い塗りつぶし四角形を描画します。
SDL_GPSetColor((SDL_Color){ 255, 0, 0, 255 });
{
SDL_GPDrawRectFilled((SDL_GPRect){ 10, 10, 100, 100 });
}
// 呼び出し元はスワップチェーンまたはテクスチャにレンダリングできます。
// ここではスワップチェーンにレンダリングします。
SDL_GPUTexture *swapchain_texture = NULL;
SDL_WaitAndAcquireGPUSwapchainTexture(
cmd_buffer,
window,
&swapchain_texture,
NULL,
NULL
);
SDL_GPFlush(cmd_buffer, swapchain_texture);
}
SDL_GPEnd();
SDL_SubmitGPUCommandBuffer(cmd_buffer);
SDL_Delay(DELTA_TIME_MS);
クイックリファレンス
エラーAPI:
// SDL_gpで発生した最後のエラーを取得します。エラーが発生しなかった場合はSDL_GP_ERROR_NONEを返します。
SDL_GP_Error SDL_GPGetLastError(void);
// SDL_GP_Error値を示す人間が読める文字列を取得します。エラー値が認識されない場合は"Unknown error"を返します。
const char *SDL_GPGetErrorMessage(SDL_GP_Error error);
画像API:
// SDL_Surfaceから画像を生成します。生成に失敗した場合は無効な画像を返します。エラーに関する詳細はSDL_GPGetLastError()を使用してください。
SDL_GPImage SDL_GPCreateImage(SDL_Surface *surface);
// 画像とリソースを解放します。
void SDL_GPDestroyImage(SDL_GPImage image);
// 画像に関連付けられたGPUテクスチャを取得します。画像が無効な場合はNULLを返します。
SDL_GPUTexture *SDL_GPGetImageGPUTexture(SDL_GPImage image);
// 画像の幅をピクセル単位で取得します。画像が無効な場合は0を返します。
int SDL_GPGetImageWidth(SDL_GPImage image);
// 画像の高さをピクセル単位で取得します。画像が無効な場合は0を返します。
int SDL_GPGetImageHeight(SDL_GPImage image);
シェーダーAPI:
// 頂点およびフラグメントシェーダー記述からシェーダーを生成します。生成に失敗した場合は無効なシェーダーを返します。エラーに関する詳細はSDL_GPGetLastError()を使用してください。
SDL_GPShader SDL_GPCreateShader(SDL_GPShaderDesc *desc);
// SDL_gpシェーダーに関連付けられたSDLシェーダーを取得します。シェーダーが無効な場合はNULLを返します。
SDL_GPUShader *SDL_GPGetGPUShader(SDL_GPShader shader);
// シェーダーとリソースを解放します。
void SDL_GPDestroyShader(SDL_GPShader shader);
パイプラインAPI:
// グラフィックスパイプラインを生成します。生成に失敗した場合は無効なパイプラインを返します。エラーに関する詳細はSDL_GPGetLastError()を使用してください。
SDL_GPPipeline SDL_GPCreatePipeline(SDL_GPShader shader_vert, SDL_GPShader shader_frag, SDL_GPPrimitiveType primitive_type, SDL_GPBlendMode blend_mode);
// グラフィックスパイプラインとリソースを解放します。
void SDL_GPDestroyPipeline(SDL_GPPipeline pipeline);
// SDL_gpパイプラインに関連付けられたGPUグラフィックスパイプラインを取得します。パイプラインが無効な場合はNULLを返します。
SDL_GPUGraphicsPipeline *SDL_GPGetGPUPipeline(SDL_GPPipeline pipeline);
ペインターAPI:
// SDL_GPコンテキストをセットアップします。セットアップに失敗した場合はfalseを返します。エラーに関する詳細はSDL_GPGetLastError()を使用してください。
bool SDL_GPSetup(SDL_GPDesc *desc);
// SDL_GPコンテキストをシャットダウンします。
void SDL_GPShutdown(void);
// 現在のフレームの描画呼び出しの記録を開始します。これはSDL_gpのセットアップ後、および現在のフレームのスワップチェーンテクスチャとコマンドバッファを取得した後に呼び出す必要があります。
// falseを返した場合、エラーが発生したためフレームをスキップする必要があります。エラーに関する詳細はSDL_GPGetLastError()を使用してください。
bool SDL_GPBegin(int width, int height);
// 記録された描画呼び出しをGPUにフラッシュします。エラーが発生した場合はfalseを返します。エラーに関する詳細はSDL_GPGetLastError()を使用してください。
bool SDL_GPFlush(SDL_GPUCommandBuffer *cmd_buffer, SDL_GPUTexture *texture);
// 現在のフレームの描画呼び出しの記録を終了します。
void SDL_GPEnd(void);
// 現在のビューポートの座標空間の境界を設定します。
void SDL_GPSetProjection(float left, float right, float bottom, float top);
// プロジェクションを現在のビューポートの座標であるデフォルトの座標空間にリセットします。
void SDL_GPResetProjection(void);
// 現在の変換行列を変換スタックに保存します。後でSDL_GPPopTransformでポップするために使用します。
void SDL_GPPushTransform(void);
// 変換行列を変換スタックのトップから復元します。
void SDL_GPPopTransform(void);
// 現在の変換行列を単位行列(変換なし)にリセットします。
void SDL_GPResetTransform(void);
// 2D座標空間を移動します。
void SDL_GPTranslate(float x, float y);
// 原点を中心に2D座標空間を回転させます。
void SDL_GPRotate(float angle);
// 点を中心に2D座標空間を回転させます。
void SDL_GPRotateAt(float angle, float ax, float ay);
// 原点を中心に2D座標空間をスケールします。
void SDL_GPScale(float sx, float sy);
// 点を中心に2D座標空間をスケールします。
void SDL_GPScaleAt(float sx, float sy, float ax, float ay);
// 現在のグラフィックスパイプラインを設定します。
void SDL_GPSetPipeline(SDL_GPPipeline pipeline);
// グラフィックスパイプラインをデフォルトの組み込みパイプラインにリセットします。
void SDL_GPResetPipeline(void);
// 現在のパイプラインのユニフォームデータを設定します。
void SDL_GPSetUniform(const void *vs_data, size_t vs_size, const void *fs_data, size_t fs_size);
// ユニフォームデータをデフォルトの状態(現在の状態の色)にリセットします。
void SDL_GPResetUniform(void);
// 現在のブレンドモードを設定します。
void SDL_GPSetBlendMode(SDL_GPBlendMode blend_mode);
// 現在のブレンドモードをデフォルトのブレンドモード(ブレンディングなし)にリセットします。
void SDL_GPResetBlendMode(void);
// 現在の色を設定します。
void SDL_GPSetColor(SDL_Color color);
// 現在の色を取得します。
SDL_Color SDL_GPGetColor(void);
// 現在の色をデフォルトの色(白)にリセットします。
void SDL_GPResetColor(void);
// テクスチャチャネルで現在のバインド画像をセットします。
void SDL_GPSetImage(int channel, SDL_GPImage image);
// テクスチャチャネルで現在のバインド画像を削除します(テクスチャなし)。
void SDL_GPUnsetImage(int channel);
// テクスチャチャネルで現在のバインド画像をデフォルト(白いテクスチャ)にリセットします。
void SDL_GPResetImage(int channel);
// テクスチャチャネルで現在のバインドサンプラーを設定します。
void SDL_GPSetSampler(int channel, SDL_GPUSampler *sampler);
// テクスチャチャネルで現在のバインドサンプラーを削除します(サンプラーなし)。
void SDL_GPUnsetSampler(int channel);
// テクスチャチャネルで現在のバインドサンプラーをデフォルト(最近傍サンプラー)にリセットします。
void SDL_GPResetSampler(int channel);
// 描画対象の画面領域を設定します。
void SDL_GPViewport(int x, int y, int w, int h);
// ビューポートをデフォルト(幅、高さ)にリセットします。
void SDL_GPResetViewport(void);
// ビューポート内のクリッピング矩形を設定します。
void SDL_GPScissor(int x, int y, int w, int h);
// クリッピング矩形をデフォルト(ビューポート境界)にリセットします。
void SDL_GPResetScissor(void);
// すべての状態をデフォルトにリセットします。
void SDL_GPResetState(void);
// 現在のビューポートを現在の色でクリアします。
void SDL_GPClear(void);
// 任意のプリミティブを描画します。
void SDL_GPDraw(SDL_GPPrimitiveType primitive_type, const SDL_GPVertex *vertices, Uint32 vertices_count);
// バッチで点を描画します。
void SDL_GPDrawPoints(const SDL_GPPoint *points, Uint32 count);
// 単一の点を描画します。
void SDL_GPDrawPoint(SDL_GPPoint point);
// バッチで線を描画します。
void SDL_GPDrawLines(const SDL_GPLine *lines, Uint32 count);
// 単一の線を描画します。
void SDL_GPDrawLine(SDL_GPLine line);
// 点のストリップを描画します。
void SDL_GPDrawLinesStrip(const SDL_GPVec2 *points, Uint32 count);
// バッチで三角形を描画します。
void SDL_GPDrawFilledTriangles(const SDL_GPTriangle *tr