绘制出的纹理不是透明的
如图黑色的部分应该是透明的。我要怎么做才能让背景透明呢

解决方案 »

  1.   

    兄弟啊 没人回复是不是很痛苦啊 
    我问的好多问题都没有人回复 所以我来给你送温暖来了
    我表示这种题没有几个人会的 就像我的问题http://bbs.csdn.net/topics/390584427#new_post
    ~~~~(>_<)~~~~  大神们都去睡觉了 要不都下班了 要不都辞职了 要不都转行了 要不都自杀了。
      

  2.   

    你图片色深是多少啊,或者opengl没有设置颜色键么?
      

  3.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Windows.Forms;
    using CsGL.OpenGL;
    using System.Threading;
    using System.IO;
    namespace testopenGL
    {
        public partial class Form1 : Form
        {
            myGLView cOGL;
            public Form1()
            {
                
                InitializeComponent();
                label1.Left = pictureBox1.Left + 128;
                cOGL = new myGLView();
                cOGL.Dock = DockStyle.Fill;            pictureBox1.Controls.Add(cOGL);            //Thread t = new Thread(new ThreadStart(cOGL.Loop));
               // t.Priority = ThreadPriority.Lowest;
               // t.Start();
            }        private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                label3.Text = e.X + ":" + e.Y;
            }        private void timer1_Tick(object sender, System.EventArgs e)
            {
                pictureBox1.Refresh();
                //cOGL.glDraw();
            }
        }
        
        public enum DrawModes
        {
            CREATE_LIST,
            DRAW_LIST
        }    public enum DispLists
        {
            table = 1,
            ground,
            testMap
        }
        class myGLView : OpenGLControl
        {
            private const float timeStep = 0.01f;        //private const int nWidth = 40;
           // private const int nHeight = 40;
            //private const float size = 1.0f / 8.0f;        private float angRotY = 30.0f;        private particles mantel2 = new particles();        private uint[] textures = new uint[3];
            //private IntPtr q1;
            private GLUquadric q1;        private bool bMirror = false;
            private bool bUseTexture = true;        private float[] positionLight = new float[4] { -6.0f, 5.0f, 0.0f, 1.0f };
            public static Image GetImageFromFile(string filename)
            {
                FileStream fs = File.OpenRead(filename);
                int fileLen = (int)fs.Length;
                byte[] buf = new byte[fileLen];
                fs.Read(buf, 0, fileLen);
                Image img = Image.FromStream(fs);
                fs.Close();
                return img;
            }
            private void loadTextures()
            {
                GL.glEnable(GL.GL_TEXTURE_2D);            GL.glGenTextures(2, textures);
                GL.glBindTexture(GL.GL_TEXTURE_2D, textures[1]);
                Bitmap img = new Bitmap("ground.jpg");
                bitmapW = img.Width;
                bitmapH = img.Height;
                Rectangle rect = new Rectangle(0, 0, img.Width, img.Height);
                BitmapData tex = img.LockBits(rect, ImageLockMode.ReadOnly,
                    System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
                GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
                GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
                GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);
                //GL.glTexEnvi(GL.GL_TEXTURE_ENV,GL.GL_TEXTURE_ENV_MODE,(int)GL.GL_DECAL);
                GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.GL_RGB8,
                    img.Width, img.Height,
                    0, GL.GL_BGRA_EXT, GL.GL_UNSIGNED_BYTE, tex.Scan0);
                img.UnlockBits(tex);
                GL.glLoadIdentity();
                GL.glBindTexture(GL.GL_TEXTURE_2D, textures[2]);
                img = new Bitmap(GetImageFromFile("0.png"));
                bitmapW = img.Width;
                bitmapH = img.Height;
                rect = new Rectangle(0, 0, img.Width, img.Height);
                tex = img.LockBits(rect, ImageLockMode.ReadOnly,
                    System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
                GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
                GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
                GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);
                          //GL.glAlphaFunc(GL.GL_GREATER, 0.5f);//0.5可以换成任何在0~1之间的数 
                GL.glTexEnvi(GL.GL_TEXTURE_ENV,GL.GL_TEXTURE_ENV_MODE,(int)GL.GL_DECAL);            GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.GL_RGBA16,
                    img.Width, img.Height,
                    0, GL.GL_BGRA_EXT, GL.GL_UNSIGNED_BYTE, tex.Scan0);
                img.UnlockBits(tex);
                img.Dispose();
                img = null;
            }        protected override void InitGLContext()
            {            GL.glShadeModel(GL.GL_SMOOTH);
                GL.glHint(GL.GL_POLYGON_SMOOTH_HINT, GL.GL_DONT_CARE);
                GL.glClearColor(0, 0, 0, 1);
                GL.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL);            GL.glEnable(GL.GL_COLOR_MATERIAL);
                GL.glColorMaterial(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT_AND_DIFFUSE);            GL.glEnable(GL.GL_DEPTH_TEST);            loadTextures();
                q1 = GLU.gluNewQuadric();
                GLU.gluQuadricOrientation(q1, GLU.GLU_OUTSIDE);
                GLU.gluQuadricNormals(q1, GLU.GLU_SMOOTH);
                GLU.gluQuadricTexture(q1, (byte)GL.GL_TRUE);
                drawTestMap(DrawModes.CREATE_LIST);
                drawGraoud(DrawModes.CREATE_LIST);
                OnSizeChanged(null);
            }
            private int bitmapW,bitmapH;
            protected override void OnSizeChanged(System.EventArgs e)
            {
                GL.glViewport(0, 0, bitmapW * 2, bitmapH * 2);
                GL.glMatrixMode(GL.GL_PROJECTION);
                GL.glLoadIdentity();
                GL.gluPerspective(0f, (float)this.Bounds.Width / (float)this.Bounds.Height, 0,1);
                GL.glMatrixMode(GL.GL_MODELVIEW);
            }
            public override void glDraw()
            {
                GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);            GL.glMatrixMode(GL.GL_MODELVIEW);
                GL.glLoadIdentity();
                float x = (float)this.Bounds.Width / bitmapW;
                
                GL.glRotatef(0,0,0,1);            GL.glDisable(GL.GL_TEXTURE_2D);
                GL.glTranslatef(-1f, 0, -1f);//从可视区左上角开始填充1/4区域
                GL.glViewport(500, 180, bitmapW * 2, bitmapH * 2);
                drawTestMap(DrawModes.DRAW_LIST);
                  GL.glLoadIdentity();
                
                GL.glViewport(0, 0, Bounds.Width, Bounds.Height);
                GL.glTranslatef(0, 0, -1f);//从可视区左上角开始填充1/4区域
                drawGraoud(DrawModes.DRAW_LIST);           
                if (bUseTexture)
                {
                    GL.glEnable(GL.GL_TEXTURE_2D);
                    GL.glBindTexture(GL.GL_TEXTURE_2D, textures[0]);
                }
                //Refresh();
               // mantel.Render();
            }        private void drawGraoud(DrawModes mode)
            {
                switch (mode)
                {
                    case DrawModes.CREATE_LIST:
                        GL.glNewList((uint)DispLists.ground, GL.GL_COMPILE);                    if (bUseTexture)
                        {
                            GL.glEnable(GL.GL_TEXTURE_2D);
                            GL.glBindTexture(GL.GL_TEXTURE_2D, textures[1]);
                        }
                        GL.glEnable(GL.GL_BLEND);
                        GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);                    GL.glColor4f(0,0,0, 1.0f);
                        GL.glNormal3f(0, 1, 0);
                        GL.glBegin(GL.GL_POLYGON);
                        GL.glTexCoord2f(0.0f, 0.0f); GL.glVertex2f(1.0F, 1.0F);
                        GL.glTexCoord2f(0.0F, 1.0F); GL.glVertex2f(1.0F, 0.0F);
                        GL.glTexCoord2f(1.0F, 1.0F); GL.glVertex2f(0.0F, 0.0F);
                        GL.glTexCoord2f(1.0F, 0.0F); GL.glVertex2f(0.0F, 1.0F);
                        GL.glEnd();                    GL.glDisable(GL.GL_BLEND);
                        GL.glDisable(GL.GL_TEXTURE_2D);
                        GL.glEndList();
                        break;
                    case DrawModes.DRAW_LIST:
                        GL.glEnable(GL.GL_TEXTURE_2D);
                        GL.glEnable(GL.GL_BLEND);
                        GL.glCallList((uint)DispLists.ground);
                        break;
                }
            }
            private void drawTestMap(DrawModes mode)
            {
                switch (mode)
                {
                    case DrawModes.CREATE_LIST:
                        GL.glEnable(GL.GL_BLEND);
                        GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
                        GL.glNewList((uint)DispLists.testMap, GL.GL_COMPILE);
                        if (bUseTexture)
                        {
                            GL.glEnable(GL.GL_TEXTURE_2D);
                            GL.glBindTexture(GL.GL_TEXTURE_2D, textures[2]);
                        }                    GL.glEnable(GL.GL_BLEND);
                       GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);                   GL.glColor4f(0,0,0, 1.0f);
                       GL.glNormal3f(0, 1, 0);
                       GL.glBegin(GL.GL_POLYGON);
                      GL.glTexCoord2f(0.0f, 0.0f); GL.glVertex2f(1.0F, 1.0F);
                       GL.glTexCoord2f(0.0F, 1.0F); GL.glVertex2f(1.0F, 0.0F);
                       GL.glTexCoord2f(1.0F, 1.0F); GL.glVertex2f(0.0F, 0.0F);
                       GL.glTexCoord2f(1.0F, 0.0F); GL.glVertex2f(0.0F, 1.0F);
                        GL.glEnd();
                        GL.glDisable(GL.GL_BLEND);
                        GL.glDisable(GL.GL_TEXTURE_2D);
                        GL.glEndList();
                        break;
                    case DrawModes.DRAW_LIST:
                       
                        GL.glCallList((uint)DispLists.testMap);
                        break;
                }
            }        ~myGLView()
            {
                GLU.gluDeleteQuadric(q1);
            }    }}
    我把代码贴出来了。因为是初次接触所以有很多不太明白
      

  4.   

    修改下颜色格式,GL_RGB8==>GL_RGBA GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.GL_RGBA,
                    img.Width, img.Height,
                    0, GL.GL_BGRA_EXT, GL.GL_UNSIGNED_BYTE, tex.Scan0);
      

  5.   

    你代码几处 glTexImage2D,都修改看看,因为我也每用过opengl,红色部分值相同GL_RGBA16==>GL.RGBAGL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.GL_RGBA16,
                    img.Width, img.Height,
                    0, GL.GL_BGRA_EXT, GL.GL_UNSIGNED_BYTE, tex.Scan0);
    GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.RGBA,
                    img.Width, img.Height,
                    0, GL.RGBA, GL.GL_UNSIGNED_BYTE, tex.Scan0);
      

  6.   

    GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.RGBA,
                    img.Width, img.Height,
                    0, GL.RGBA, GL.GL_UNSIGNED_BYTE, tex.Scan0);
    改成一样也不行。改成一样后那个图片的颜色被改变了,背景还是黑色的
      

  7.   

    这里有个文档,不知道有你需要的东西不:
    http://download.csdn.net/download/xxffnn2002/284606