SDL2で透明なテクスチャを読み込むと、白い背景が生じる -- c フィールド と sdl フィールド と sdl-2 フィールド 関連 問題

Loading transparent texture in SDL2 results in a white background












0
vote

問題

日本語

SDL_TextUreaccess_Streamingヒントを設定してテクスチャを作成しようとしています。私は、sdl_createTexture()関数を上記のヒントで使用することによってこれを行うように考え出しました。以下はテクスチャをロードするための私の機能です(簡潔さのために省略されたエラーチェック)。

<事前> <コード> SDL_Texture* loadTexStreaming(const char* imgName, SDL_Renderer* renderer) { SDL_Surface* image = IMG_Load(imgName); SDL_Texture* tex = SDL_CreateTexture(renderer, image->format->format, SDL_TEXTUREACCESS_STREAMING, image->w, image->h); void* pixels = NULL; int pitch = 0; SDL_LockTexture(tex, NULL, &pixels, &pitch); memcpy(pixels, image->pixels, image->pitch * image->h); SDL_UnlockTexture(tex); SDL_FreeSurface(image); return tex; }

これはテクスチャを正常にロードしますが、透明なものがあれば白い背景でそれを残します。代わりにSDL_CreateTextureFromSurfromFurFace()を使用すると、意図したとおりに機能しますが、後で必要になるストリーミングテクスチャを取得しません。

参照のために、32のビット深度を持つ64 x 64テクスチャを使用しています。透明な背景を持つテクスチャがそうなるようにこのコードを変更できますか? SDL_SetColorKey()を使用して、バックグラウンドでピクセルをキーアウトしました。以下は私の問題を再現するコードです。

<事前> <コード> #include <stdio.h> #include <stdlib.h> #include <SDL2/SDL.h> #include <SDL2/SDL_image.h> SDL_Texture* loadTexStreaming(const char* imgName, SDL_Renderer* renderer) { SDL_Surface* image = IMG_Load(imgName); SDL_Texture* tex = SDL_CreateTexture(renderer, image->format->format, SDL_TEXTUREACCESS_STREAMING, image->w, image->h); void* pixels = NULL; int pitch = 0; SDL_LockTexture(tex, NULL, &pixels, &pitch); memcpy(pixels, image->pixels, image->pitch * image->h); SDL_UnlockTexture(tex); SDL_FreeSurface(image); return tex; } int main(int argc, char** argv) { (void)argc; (void)argv; SDL_Init(SDL_INIT_EVERYTHING); SDL_Window* window = SDL_CreateWindow("TexTest", 100, 100, 200, 200, 0); SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_Texture* texture = loadTexStreaming("img.png", renderer); SDL_Rect rect = {0, 0, 64, 64}; int running = 1; SDL_Event e; while(running) { while(SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { running = 0; } } SDL_RenderCopy(renderer, texture, NULL, &rect); SDL_RenderPresent(renderer); } SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return EXIT_SUCCESS; }
英語

I am trying to create textures with the SDL_TEXTUREACCESS_STREAMING hint set on them. I figured out to do this by using the SDL_CreateTexture() function with said hint. Below is my function for loading a texture (error checking omitted for brevity).

SDL_Texture* loadTexStreaming(const char* imgName, SDL_Renderer* renderer) {     SDL_Surface* image = IMG_Load(imgName);     SDL_Texture* tex = SDL_CreateTexture(renderer, image->format->format, SDL_TEXTUREACCESS_STREAMING, image->w, image->h);     void* pixels = NULL;     int pitch = 0;     SDL_LockTexture(tex, NULL, &pixels, &pitch);     memcpy(pixels, image->pixels, image->pitch * image->h);     SDL_UnlockTexture(tex);     SDL_FreeSurface(image);     return tex; } 

This does successfully load a texture but leaves it with a white background if it had a transparent one. If I use SDL_CreateTextureFromSurface() instead it works as intended but I do not get a streaming texture which I will need later on.

For reference I am using 64x64 textures that have a bit depth of 32. How could I modify this code so that textures with transparent backgrounds are left as so? I have tried using SDL_SetColorKey() to key out the pixels in the background. Below is a piece of code that reproduces my issue.

#include <stdio.h> #include <stdlib.h> #include <SDL2/SDL.h> #include <SDL2/SDL_image.h>  SDL_Texture* loadTexStreaming(const char* imgName, SDL_Renderer* renderer) {     SDL_Surface* image = IMG_Load(imgName);     SDL_Texture* tex = SDL_CreateTexture(renderer, image->format->format, SDL_TEXTUREACCESS_STREAMING, image->w, image->h);     void* pixels = NULL;     int pitch = 0;     SDL_LockTexture(tex, NULL, &pixels, &pitch);     memcpy(pixels, image->pixels, image->pitch * image->h);     SDL_UnlockTexture(tex);     SDL_FreeSurface(image);     return tex; }  int main(int argc, char** argv) {     (void)argc;     (void)argv;      SDL_Init(SDL_INIT_EVERYTHING);      SDL_Window* window = SDL_CreateWindow("TexTest", 100, 100, 200, 200, 0);      SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);      SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);      SDL_Texture* texture = loadTexStreaming("img.png", renderer);     SDL_Rect rect = {0, 0, 64, 64};      int running = 1;     SDL_Event e;      while(running)     {         while(SDL_PollEvent(&e))         {             if (e.type == SDL_QUIT)             {                 running = 0;             }         }         SDL_RenderCopy(renderer, texture, NULL, &rect);         SDL_RenderPresent(renderer);     }      SDL_DestroyTexture(texture);     SDL_DestroyRenderer(renderer);     SDL_DestroyWindow(window);      SDL_Quit();      return EXIT_SUCCESS; } 
</div
        
 
 

回答リスト


関連する質問

0  奇妙なSDLキーボードの問題  ( Weird sdl keyboard issues ) 
だから私は2つの異なるOSを実行している2台のマシンでこれを試してみました、そしてそれらの間で同じことが起こりました。 <事前> <コード> #include <iostream> #include <SDL2/SDL.h> int main(int arg...

-1  SDLの滑らかなスクロール  ( Smooth scrolling in sdl ) 
私のユースケースはSDLを使用して大きなテーブルを構築する必要があります。そして私はブラウザのような滑らかなスクロールを探しています。誰かがアイデアを持っていますか? SDLでスムーズなスクロールを実装する方法?私はsdl_mousewheelイベントで試しま...

0  SDL2でテクスチャを回転させる方法  ( How to rotate a texture in sdl2 ) 
SDL2 、 c 、逃した関数またはパラメータでテクスチャを回転させる簡単な方法は? ...

-3  Python3.8にPygameをインストールする方法[複製]  ( How do i install pygame in python3 8 ) 
この質問はすでにここで回答を持っています ​​ pygameのインストール:sdl-configコマンドが見つかりません (6回答) ...

3  SDL2で回転したテクスチャは誤ってアンチエイリアスです  ( Texture rotated by sdl2 is anti aliased incorrectly ) 
アンチエイリアシングの有効とともに複数のテクスチャをブレンドしようとしている、テクスチャが回転していない場合はうまく機能しますが、テクスチャを回転させると、テクスチャの端に「境界」が生成されます。以下は例です。 オリジナルのテクスチャ、途中で50×50倍の青い...

17  SDL2:高速ピクセル操作  ( Sdl2 fast pixel manipulation ) 
モニタのピクセルを描きたいとします。例えば。赤と緑のピクセルが衝突した場合、それらは両方とも消えます。 フレームごとに、私は約100~1000ピクセルを操作する必要があります。ここにマルチスレッドアプローチがあります。これは私に30fps(私が欲しいもの)を与...

0  SDL 1.2のデフォルトパレットをSDL_CreaterGbsurberSface()と一致させる?  ( Match sdl 1 2s default palette with sdl creatergbsurface ) 
私は SDL 1.2プログラム(リポジトリ)8ビットインデックス付きカラーサーフェスをSDL2に使用します。残念ながら<コード> SDL_CreateRGBSurface() SDL_SetVideoMode() はSDL 1.2で設定されているRGB88...

0  OpenGL 3.2 2Dレンダリングの問題  ( Opengl 3 2 2d rendering issues ) 
Rendering Artifact http://byte-werx.com/rendering-Artifact.png? a> 2つのスプライトバッチを作成し、私の画面の同じフレーム半分で2回描画しようとしているとき(またはその周囲には失われます...

3  SDL_DisplayFormatはこのスコープで宣言されていません:SDL2を使用してください  ( Sdl displayformat not declared in this scope using sdl2 ) 
コンパイラはsdl.hが見つからないが、メインで初期化されていても、SDL_DisplayFormatが異なるヘッダにあるクラスメンバ関数の範囲内で宣言されていないことはむしろ宣言されていないため <事前> <コード> SDL_Surface *SpriteL...

3  SDL2異なるスレッドの2つのウィンドウ  ( Sdl2 two windows in different threads ) 
私は2つのウィンドウでプロセスを作成しようとしています。各ウィンドウには、描画用の異なるスレッドがあります。問題は、ランダムな時間が間違っている後にプログラムを実行すると、セグメンテーション障害を与えます。これが私のコードです: main.cpp <事前>...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有