游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2141|回复: 0

请问在CSGL中如何才能实现多重采样?

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-3-1 09:34:00 | 显示全部楼层 |阅读模式
请问在CSGL中如何才能实现多重采样?

在VC++中可以调用glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_MULTISAMPLE)来设置多重采样缓冲区
但在C#中无法这样设置,因为OpenGL是独立于开发环境的,glut库是与VC++开发环境的借口,
在C#中该接口被改写,目前找不到有关多重采样缓冲区的设置

CSGL的OpenGLContext类中有一个变量PixelFormat是DisplayType类型,但DisplayType类中没有与多重采样有关的变量,
还有一个DisplayFlags类,其中有DOUBLEBUFFER和SUPPORT_GDI等,也没有与多重采样有关的设置

有可能是在C#的GDI+的Graphics中设置,然后生成一个GDIGLContext,把Graphics作为参数传入,
以下代码把一个bitmap中显示一条红线和一个蓝色的球,再把Bitmap显示到Form中
红线是用GDI+的Graphics画的,锯齿被消除,蓝色的球是用OpenGL绘制的,锯齿无法消除

    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();

            this.Size = new Size(400, 426);
        }

        private Bitmap InitBitMap() {
            Bitmap bmp = new Bitmap(400, 400);
            Graphics g = Graphics.FromImage(bmp);

            g.CompositingMode = CompositingMode.SourceOver;
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;

            Pen redPen = new Pen(Color.Red);
            g.DrawLine(redPen, 10, 100, 100, 140);

            GDIGLContext gdictxt = new GDIGLContext(g);

            gdictxt.Create(new DisplayType(DisplayFlags.DRAW_TO_BITMAP | DisplayFlags.SUPPORT_GDI, true), null); //创建GDIGLContext容器
            gdictxt.Grab(); //使该context为当前激活的context.

            GLTest gl = new GLTest();
            gl.Init();
            gl.Draw();
            GL.glFinish();

            gdictxt.Dispose();
            g.Dispose();

            return bmp;
        }

        private void Form1_Paint(object sender, PaintEventArgs e) {
            Graphics g = e.Graphics;
            g.DrawImage(InitBitMap(), new Rectangle(0, 0, 400, 400));
        }
    }

    public class GLTest : GL {
        public void Init() {
            GL.glMatrixMode(GL.GL_PROJECTION);

            GL.gluOrtho2D(-10.0f, 10.0f, -10.0f, 10.0f);

            GL.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

            GL.glColor3f(0.0f, 0.0f, 1.0f);

            GL.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINE);

            //GL.glClear(GL.GL_COLOR_BUFFER_BIT);

            GL.glShadeModel(GL.GL_SMOOTH);
        }

        public void Draw() {
            const int NUMBER = 12;
            const int RADIUS = 8;
            double PI = 3.1415;
            PointF[] pt = new PointF[NUMBER];

            for (int i = 0; i < NUMBER; i++) {
                pt.X = (float)(RADIUS * Math.Cos(PI / NUMBER + 2 * PI * i / NUMBER));
                pt.Y = (float)(RADIUS * Math.Sin(PI / NUMBER + 2 * PI * i / NUMBER));
            }

            for (int i = 0; i < NUMBER; i++) {
                for (int j = i + 1; j < NUMBER; j++) {
                    glBegin(GL_LINES);
                    glVertex2f(pt.X, pt.Y);
                    glVertex2f(pt[j].X, pt[j].Y);
                    glEnd();
                }
            }

            glFlush();
        }
    }


注意:GL.glClear(GL.GL_COLOR_BUFFER_BIT);这句话如果不注释掉则红线也无法显示,说明两者用的是同样的缓冲区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-12 18:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表