2012-02-10 18 views
5

¿Por qué mi textura PNG no sale con transparencia?

La imagen inferior derecha debería tener un fondo transparente.

me carga PNG mi de Notch a través de estas funciones:

public void Image2D(Bitmap bmp, int mipmapReductionLevel = 0) 
{ 
    var rect = new Rectangle(0, 0, bmp.Width, bmp.Height); 
    var data = bmp.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

    GL.TexImage2D(TextureTarget.Texture2D, mipmapReductionLevel, PixelInternalFormat.Rgba, data.Width, data.Height, 0, 
     OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); 

    bmp.UnlockBits(data); 
} 

public void Image2D(string filename, int mipmapReductionLevel = 0) 
{ 
    Image2D(new Bitmap(filename), mipmapReductionLevel); 
} 

Y mi fragmento de sombreado se ve así:

#version 330 

in vec2 TexCoord0; 

uniform sampler2D TexSampler; 

void main() 
{ 
    gl_FragColor = texture2D(TexSampler, TexCoord0.xy); 
} 

He inspeccionado el bmp con el depurador, y se utiliza bmp.GetPixel(255,0) (justo encima de ese árbol joven, en el área negra) y vuelve (0,0,0,0). The docs say 0 es completamente transparente, entonces ... Debo estar haciendo algo mal en el lado OpenGL de las cosas. ¿Pero que?


función

protected override void OnRenderFrame(FrameEventArgs e) 
{ 
    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 

    _blockInstanceBuffer.Bind(); 
    _blockIndexBuffer.Bind(); 
    GL.DrawElementsInstancedBaseVertex(BeginMode.TriangleStrip, Data.FaceIndices.Length, DrawElementsType.UnsignedInt, IntPtr.Zero, _blockCount, 0); 

    SwapBuffers(); 
} 
+1

Ahhh Minecraft, no se puede escapar! – Zenexer

+0

Esto parece un juego que vi una vez en alguna parte. – Ryan

+0

Sí, creo que definitivamente lo estás cargando correctamente. Ese no es el problema. – Zenexer

Respuesta

7

Sólo se necesita para enable blending Render:

GL.Enable(EnableCap.Blend); 
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); 

yo no creía que fuera necesaria en OpenGL 3 si escribe su propio shader, pero supongo que todavía lo es.

+2

La mezcla aún no está controlada por sombreadores. Incluso en el núcleo GL4. –

+1

Como Mārtiņš Možeiko ya te dijo que la mezcla no está controlada por sombreadores. La razón simple de esto es que la fusión ocurre solo después de que el fragmento ha sido procesado, es decir, cuando todas las etapas de sombreado terminaron la ejecución. La fusión ocurre luego en una parte integrada de la GPU. Tal vez, dentro de unos años veamos una nueva variable de entrada de shader de fragmentos 'gl_DestColor' o similar, que nos permite combinar el shader de fragmentos. Pero hasta el día de hoy los problemas que esto causaría (esto tendría un gran impacto en los patrones de acceso a la memoria) lo inhibirían. – datenwolf

+0

@datenwolf: No es un problema para mí; Solo necesito una mezcla realmente simple. ¿Hay muchos casos de uso donde la gente realmente quiera hacer su propia mezcla? – mpen

Cuestiones relacionadas