タグ付けされた質問 「palette」

6
OpenGLでレトロスタイルのパレットスワッピングエフェクトを作成する
実行時に特定のピクセルの色を変更する必要がある、メガマンのようなゲームに取り組んでいます。参考:メガマンでは、選択した武器を変更すると、メインキャラクターのパレットが選択した武器を反映するように変更されます。スプライトのすべての色が変化するわけではなく、特定の色のみが変化します。 プログラマーはパレットと、ピクセルとパレットインデックス間の論理マッピングにアクセスできるため、この種の効果はNESで一般的であり、非常に簡単に実行できました。ただし、最新のハードウェアでは、パレットの概念が同じではないため、これはもう少し困難です。 テクスチャはすべて32ビットであり、パレットを使用しません。 私が望む効果を達成するために知っている2つの方法がありますが、この効果を簡単に達成するより良い方法があるかどうか興味があります。私が知っている2つのオプションは次のとおりです。 シェーダーを使用してGLSLを記述し、「パレット交換」動作を実行します。 シェーダーが利用できない場合(たとえば、グラフィックカードがサポートしていないため)、「オリジナル」テクスチャのクローンを作成し、色の変更が事前に適用された異なるバージョンを生成することができます。 理想的には、シェーダーを使用したいと思います。シェーダーは簡単に見えるため、テクスチャの複製方法とは対照的に追加作業がほとんど必要ないためです。テクスチャを複製して色を変更するだけでVRAMが無駄になるのではないかと心配しています。心配する必要はありませんか? 編集:私は最終的に受け入れられた答えのテクニックを使用することになり、これは参考のために私のシェーダーです。 uniform sampler2D texture; uniform sampler2D colorTable; uniform float paletteIndex; void main() { vec2 pos = gl_TexCoord[0].xy; vec4 color = texture2D(texture, pos); vec2 index = vec2(color.r + paletteIndex, 0); vec4 indexedColor = texture2D(colorTable, index); gl_FragColor = indexedColor; } 両方のテクスチャは32ビットであり、1つのテクスチャはすべて同じサイズ(私の場合は6色)であるいくつかのパレットを含むルックアップテーブルとして使用されます。ソーステーブルの赤チャンネルをカラーテーブルのインデックスとして使用します。これは、メガマンのようなパレット交換を実現するための魅力のように機能しました!

1
SDL.NET/Tao.SDLで8ビットサーフェスのパレットを取得するにはどうすればよいですか?
可能であればSDL.NETで8ビットサーフェスのパレットを取得するか、または(おそらく)Tao.SDLを使用してください。これは、32ビットサーフェスで行うように色を置き換えるためにサーフェスを一緒にブリットするのではなく、パレットと直接パレットスワップを実行したいためです。 SDL_SurfaceとSDL_PixelFormatを取得しましたが、同じ方法でパレットを取得しようとすると、System.ExecutionEngineExceptionが発生します。 private Tao.Sdl.Sdl.SDL_Palette GetPalette(Surface surf) { // Get surface. Tao.Sdl.Sdl.SDL_Surface sdlSurface = (Tao.Sdl.Sdl.SDL_Surface)System.Runtime.InteropServices.Marshal.PtrToStructure(surf.Handle, typeof(Tao.Sdl.Sdl.SDL_Surface)); // Get pixel format. Tao.Sdl.Sdl.SDL_PixelFormat pixelFormat = (Tao.Sdl.Sdl.SDL_PixelFormat)System.Runtime.InteropServices.Marshal.PtrToStructure(sdlSurface.format, typeof(Tao.Sdl.Sdl.SDL_PixelFormat)); // Execution exception here. Tao.Sdl.Sdl.SDL_Palette palette = (Tao.Sdl.Sdl.SDL_Palette)System.Runtime.InteropServices.Marshal.PtrToStructure(pixelFormat.palette, typeof(Tao.Sdl.Sdl.SDL_Palette)); return palette; } 安全でないコードを使用してパレットを取得すると、「アドレスを取得できない、サイズを取得できない、またはマネージ型へのポインターを宣言できない( 'Tao.Sdl.Sdl.SDL_Palette')」というコンパイル時エラーが発生しました。 パレットを取得するための安全でないコードは次のとおりです。 unsafe { Tao.Sdl.Sdl.SDL_Palette* pal = (Tao.Sdl.Sdl.SDL_Palette*)pixelFormat.palette; } 私が読んだことから、この場合のマネージ型は、構造体がフィールドとしてその中に何らかの参照を持っている場合です。SDL_Palette構造体にはSDL_Colorの配列が含まれているため、問題の原因となっているのはそれが参照型であると想定しています。ただし、基になるパレットを取得するためにそれを回避する方法はまだわかりません。 したがって、安全なコードでも安全でないコードでも、8ビットサーフェイスからパレットを取得する方法を知っている人がいれば、助力をいただければ幸いです。
11 c#  image  palette 

3
XNAのパレットに基づいてテクスチャに色を付けるための良い方法は何ですか?
私はXNAを使用して、特にNESをガイドとして使用して、8ビットゲームのようなゲームに取り組んでいます。 NESには非常に特定のパレットがあり、各スプライトはそのパレットから最大4色を使用できます。これをどのようにエミュレートできますか?私がこれを達成する現在の方法は、GPUに渡す色の配列へのインデックスとして機能する定義された値を持つテクスチャーを持っていることです。これより良い方法があるに違いないと思いますが、おそらくこれが最善の方法でしょうか? パレットを動的に変更できるようにしたいので、すべてのスプライトを適切な色で描画することを確認したくありません。また、CPUを使用してテクスチャを直接変更したくない場合もあります。
8 xna  textures  palette 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.