2012-02-10 13 views
5

मेरा पीएनजी बनावट पारदर्शिता के साथ क्यों नहीं आ रहा है?

नीचे दाएं छवि में एक पारदर्शी पृष्ठभूमि होनी चाहिए।

मैं इन कार्यों के माध्यम से मेरी नौच के पीएनजी लोड:

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

और मेरे टुकड़ा शेडर इस तरह दिखता है:

#version 330 

in vec2 TexCoord0; 

uniform sampler2D TexSampler; 

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

मैं डीबगर के साथ bmp का निरीक्षण किया गया है, और bmp.GetPixel(255,0) इस्तेमाल किया (काले पेड़ में, उस वृक्ष के ऊपर से ऊपर) और यह (0,0,0,0) वापस आता है। The docs say 0 पूरी तरह से पारदर्शी है, इसलिए ... मुझे चीजों के ओपनजीएल पक्ष पर कुछ गलत करना होगा। पर क्या?


प्रस्तुत समारोह

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

आह Minecraft, मैं तुम्हें बच नहीं सकते! – Zenexer

+0

यह एक ऐसा गेम जैसा दिखता है जिसे मैंने कभी देखा था। – Ryan

+0

हाँ, मुझे लगता है कि आप निश्चित रूप से इसे ठीक से लोड कर रहे हैं। यह मुद्दा नहीं है। – Zenexer

उत्तर

7

बस enable blending करने की जरूरत:

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

मुझे नहीं लगता था कि ओपन 3 यदि आप अपने स्वयं शेडर बारे में जरूरी हो गया था, लेकिन मैं इसे लगता है अभी भी है।

+2

मिश्रण अभी भी शेडर्स द्वारा नियंत्रित नहीं है। जीएल 4 कोर में भी। –

+1

मार्टिस्स मोज़ेइको की तरह पहले ही आपको बताया गया है कि मिश्रण आपको शेडर्स द्वारा नियंत्रित नहीं किया जाता है। इसका सरल कारण यह है कि मिश्रण केवल संसाधित होने के बाद ही होता है, यानी जब सभी शेडर चरण निष्पादन समाप्त हो जाते हैं। तब मिश्रण जीपीयू के कुछ कड़ी मेहनत में होता है। शायद, कुछ सालों में हमें कुछ नए टुकड़े शेडर इनपुट वैरिएबल 'gl_Destcolor' या ऐसे में मिल जाएगा, जो हमें टुकड़े टुकड़े में मिश्रण करने की अनुमति देता है। लेकिन इस दिन तक यह समस्याएं उत्पन्न हो सकती हैं (इसका एक बड़ा प्रभाव स्मृति पहुंच पैटर्न होगा) इसे रोक दें। – datenwolf

+0

@ डेटनवॉल्फ: मेरे लिए कोई समस्या नहीं; मुझे केवल वास्तव में सरल मिश्रण की आवश्यकता है। क्या वहां बहुत सारे उपयोग के मामले हैं जहां लोग वास्तव में अपना खुद का मिश्रण करना चाहते हैं? – mpen

संबंधित मुद्दे