RSS ログイン
Date==== Time==== Update==== Time==== Title==== [[W]WRITE [RET]READ [?]HELP]
2025-08-11 15:15:21 2025-08-11 15:18:11 【備忘録】Dreamcastで透過PNGを表示する方法
TEXT FILE (   1KiB ) を受信しますか? [Y]/[N] > Y

備忘録 Dreamcast DreamSDK KallistiOS PNG

前提条件

・kos-portでlibpngをいれている

やり方

PVR_LIST_OP_POLYではなくPVR_LIST_TR_POLYを。
png_to_textureではPNG_FULL_ALPHAを使う。
描画時はPVR_TXRFMT_ARGB4444を。

コード

//画像をロード
pvr_ptr_t image = pvr_mem_malloc(512 * 256 * 2);
png_to_texture("/rd/image.png", image, PNG_FULL_ALPHA);
//描画
pvr_poly_cxt_t cxt;
pvr_poly_hdr_t hdr;
pvr_vertex_t vert;

pvr_poly_cxt_txr(&cxt, PVR_LIST_TR_POLY, PVR_TXRFMT_ARGB4444, original_w, original_h, image, PVR_FILTER_BILINEAR);
pvr_poly_compile(&hdr, &cxt);
pvr_prim(&hdr, sizeof(hdr));

vert.argb = PVR_PACK_COLOR(1.0f, 1.0f, 1.0f, 1.0f);
vert.oargb = 0;
vert.flags = PVR_CMD_VERTEX;

vert.x = x;
vert.y = y;
vert.z = 1.0f;
vert.u = 0.0f;
vert.v = 0.0f;
pvr_prim(&vert, sizeof(vert));

vert.x = w + x;
vert.y = y;
vert.z = 1.0f;
vert.u = 1.0f;
vert.v = 0.0f;
pvr_prim(&vert, sizeof(vert));

vert.x = 1.0f + x;
vert.y = h + y;
vert.z = 1.0f;
vert.u = 0.0f;
vert.v = 1.0f;
pvr_prim(&vert, sizeof(vert));

vert.x = w + x;
vert.y = h + y;
vert.z = 1.0f;
vert.u = 1.0f;
vert.v = 1.0f;
vert.flags = PVR_CMD_VERTEX_EOL;
pvr_prim(&vert, sizeof(vert));