|
请问在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);这句话如果不注释掉则红线也无法显示,说明两者用的是同样的缓冲区 |
|