2012-02-10 37 views
5

Tại sao kết cấu PNG của tôi không xuất hiện với độ trong suốt?

Hình ảnh dưới cùng bên phải phải có nền trong suốt.

tôi tải PNG Notch của tôi qua các chức năng:

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); 
} 

Và shader mảnh của tôi trông như thế này:

#version 330 

in vec2 TexCoord0; 

uniform sampler2D TexSampler; 

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

Tôi đã kiểm tra các bmp với trình gỡ lỗi, và sử dụng bmp.GetPixel(255,0) (ngay phía trên cây non đó, trong khu vực màu đen) và nó trở lại (0,0,0,0). The docs say 0 là hoàn toàn minh bạch, vì vậy ... Tôi phải làm điều gì đó sai trái về phía OpenGL của sự vật. Nhưng cái gì?


Render chức năng

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, tôi không thể thoát khỏi bạn! – Zenexer

+0

Điều này trông giống như một trò chơi tôi đã thấy một nơi nào đó. – Ryan

+0

Vâng, tôi nghĩ bạn chắc chắn tải nó đúng cách. Đó không phải là vấn đề. – Zenexer

Trả lời

7

Chỉ cần enable blending:

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

Tôi không nghĩ đó là cần thiết trong OpenGL 3 nếu bạn viết shader của riêng bạn, nhưng tôi đoán nó vẫn là.

+2

Việc pha trộn vẫn không được kiểm soát bởi trình đổ bóng. Ngay cả trong lõi GL4. –

+1

Giống như Mārtiņš Možeiko đã nói với bạn trộn không được kiểm soát bởi shaders. Lý do đơn giản cho điều này là, việc trộn chỉ xảy ra sau khi đoạn đã được xử lý, tức là khi tất cả các giai đoạn đổ bóng đã hoàn thành việc thực thi. Sự pha trộn sau đó xảy ra trong một số phần cứng của GPU. Có lẽ, trong một vài năm tới, chúng ta sẽ thấy một số biến đầu vào đổ bóng mới 'gl_DestColor' hoặc như vậy, cho phép chúng ta hòa trộn trong trình đổ bóng phân đoạn. Nhưng đến ngày nay những vấn đề này sẽ gây ra (điều này sẽ có một mô hình truy cập bộ nhớ tác động lớn) ức chế điều này. – datenwolf

+0

@datenwolf: Không phải là vấn đề đối với tôi; Tôi chỉ cần pha trộn thật sự đơn giản. Có rất nhiều trường hợp sử dụng mà mọi người thực sự muốn làm việc pha trộn của riêng họ không? – mpen

Các vấn đề liên quan