当前位置:编程学习 > C#/ASP.NET >>

opengl怎么样才能渲染透明纹理呢

绘制出的纹理不是透明的
如图黑色的部分应该是透明的。我要怎么做才能让背景透明呢 --------------------编程问答-------------------- 兄弟啊 没人回复是不是很痛苦啊 
我问的好多问题都没有人回复 所以我来给你送温暖来了。。。
我表示这种题没有几个人会的 就像我的问题http://bbs.csdn.net/topics/390584427#new_post
~~~~(>_<)~~~~  大神们都去睡觉了 要不都下班了 要不都辞职了 要不都转行了 要不都自杀了。。。。 --------------------编程问答-------------------- 呵呵。人间自有真情在,相信大神们一定送来温暖的 --------------------编程问答-------------------- 你图片色深是多少啊,或者opengl没有设置颜色键么? --------------------编程问答--------------------
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);
        }

    }

}
我把代码贴出来了。因为是初次接触所以有很多不太明白
引用 3 楼 hwenycocodq520 的回复:
你图片色深是多少啊,或者opengl没有设置颜色键么?
引用
--------------------编程问答-------------------- 修改下颜色格式,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 楼 hwenycocodq520 的回复:
修改下颜色格式,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);

修改过了还是不行 --------------------编程问答-------------------- 你代码几处 glTexImage2D,都修改看看,因为我也每用过opengl,红色部分值相同

GL_RGBA16==>GL.RGBA

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


GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.RGBA,
                img.Width, img.Height,
                0, GL.RGBA, 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);
改成一样也不行。改成一样后那个图片的颜色被改变了,背景还是黑色的 --------------------编程问答-------------------- 这里有个文档,不知道有你需要的东西不:
http://download.csdn.net/download/xxffnn2002/284606 --------------------编程问答--------------------
引用 9 楼 hwenycocodq520 的回复:
这里有个文档,不知道有你需要的东西不:
http://download.csdn.net/download/xxffnn2002/284606

貌似只有目录,内容打不开。。 --------------------编程问答--------------------
引用 10 楼 huax_ue 的回复:
Quote: 引用 9 楼 hwenycocodq520 的回复:

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

貌似只有目录,内容打不开。。

我没下过,不知道里面的内容,你那个问题等有经验的人来回答吧,我没用过不会 --------------------编程问答--------------------
引用 11 楼 hwenycocodq520 的回复:
Quote: 引用 10 楼 huax_ue 的回复:

Quote: 引用 9 楼 hwenycocodq520 的回复:

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

貌似只有目录,内容打不开。。

我没下过,不知道里面的内容,你那个问题等有经验的人来回答吧,我没用过不会

嗯,多谢了。你也给了我不少帮助。希望有大神帮我解决下了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,