Questions tagged «palette»

6
在OpenGL中创建复古样式的调色板交换效果
我正在开发类似Megaman的游戏,需要在运行时更改某些像素的颜色。供参考:在Megaman中,当您更改所选武器时,主角色的调色板会更改以反映所选武器。并非所有精灵的颜色都会改变,只有某些会改变。 由于程序员可以访问调色板以及像素和调色板索引之间的逻辑映射,因此这种效果在NES上很常见并且很容易实现。但是,在现代硬件上,这更具挑战性,因为调色板的概念并不相同。 我所有的纹理都是32位的,并且不使用调色板。 我知道有两种方法可以达到我想要的效果,但是我很好奇是否有更好的方法可以轻松实现此效果。我知道的两个选项是: 使用着色器并编写一些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位的,一种纹理用作查找表,其中包含多个大小相同的调色板(在我的情况下为6种颜色)。我将源像素的红色通道用作颜色表的索引。这就像实现类似于Megaman的调色板交换一样具有魅力!

1
如何在SDL.NET/Tao.SDL中获得8位表面的调色板?
我希望在可能的情况下或(更可能是)使用Tao.SDL在SDL.NET中获得8位表面的调色板。这是因为我想直接与调色板进行调色板交换,而不是像将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 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.