我先提供一段程序,是C#的OPENGL的, 先创建一个// 创建一个View类,继承自CsGL.OpenGL.OpenGLControl internal class View : OpenGLControl // 创建一个View类,继承自CsGL.OpenGL.OpenGLControl { float[] Light_Model_Ambient={ 0.0f , 1.0f , -1.0f , 1.0f }; // 全局环境光 偏绿色 private float Angle; // 旋转角度 private float Step = 5f; // 控制旋转角速度
protected override void InitGLContext() { GL.glEnable( GL.GL_LIGHTING ); // 启用光照 GL.glEnable( GL.GL_LIGHT0 ); // 启用0号光源 GL.glLightModelfv( GL.GL_LIGHT_MODEL_AMBIENT , Light_Model_Ambient ); // 设置全局环境光 GL.glEnable( GL.GL_DEPTH_TEST ); // 启用深度检测 } protected override void OnSizeChanged( System.EventArgs e) { base.OnSizeChanged( e ); Size _Size = Size;
GL.glMatrixMode(GL.GL_PROJECTION); // 选择 GL_PROJECTION 矩阵 GL.glLoadIdentity(); // 重置投影矩阵 GL.gluPerspective( 50.0f , (double)_Size.Width / (double)_Size.Height , 0.1f , 100.0f ); // 设置透视图 GL.glMatrixMode(GL.GL_MODELVIEW); // 选择模型观察( GL_MODELVIEW )矩阵 GL.glLoadIdentity(); // 重置当前的模型观察矩阵 }
public override void glDraw() { GL.glClear( GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT ); // 清除颜色缓存
GL.glLoadIdentity(); // 重置当前的模型观察矩阵 GL.glTranslatef( 0.0f , 0.0f , -4.0f ); // 调整视图 GL.glRotatef( 15.0f , 0.0f , 1.0f , 0.0f ); // 设置视图角度 Angle += Step; GL.glRotatef( Angle , 0.0f , 1.0f , 0.0f ); // 控制旋转 /********************************************************************************************/ GLUT.glBegin(GL.GL_QUADS); // 绘制正方形 GLUT.glVertex3f(-1.0f, 1.0f, 0.0f); // 左上 GLUT.glVertex3f( 1.0f, 1.0f, 0.0f); // 右上 GLUT.glVertex3f( 1.0f,-1.0f, 0.0f); // 右下 GLUT.glVertex3f(-1.0f,-1.0f, 0.0f); // 左下 GLUT.glEnd(); // 正方形绘制结束 /********************************************************************************************/ GLUT.glTranslatef(2.0f, 0.0f, 0.0f); // 右移3单位 /********************************************************************************************/ GLUT.glBegin(GL.GL_TRIANGLES); // 绘制三角形 GLUT.glVertex3f( 0.0f, 1.0f, 0.0f); // 上顶点 GLUT.glVertex3f(-1.0f,-1.0f, 0.0f); // 左下 GLUT.glVertex3f( 1.0f,-1.0f, 0.0f); // 右下
GLUT.glVertex3f( 1.0f, 1.0f, 0.0f); // 上顶点 GLUT.glVertex3f( 0.0f,-1.0f, 0.0f); // 左下 GLUT.glVertex3f( 2.0f,-1.0f, 0.0f); // 右下 GLUT.glEnd(); // 三角形绘制结束 /********************************************************************************************/ unsafe { fixed(int *oo=byIndex) { fixed(int *q=nSrcBox) { //GL.glEnableClientState( GL.GL_VERTEX_ARRAY ); // 启用顶点数组 //GL.glVertexPointer( 3, GL.GL_INT, 0, q ); // 设置顶点数组地址 //GL.glDrawElements(GL.GL_POLYGON, 48, GL.GL_UNSIGNED_INT, oo); //GL_TRIANGLES } } //fixed(float * ddd=intertwined) //{ // GL.glInterleavedArrays(GL.GL_C3F_V3F, 0,ddd); //} } //GL.glFlush(); // 强制绘制完成 } private static int [] byIndex ={0, 4, 6,0, 2, 4,0, 6, 7,0, 7, 1,0, 3, 2,0, 1, 3,5, 2, 3,5, 4, 2,5, 6, 4,5, 7, 6, 5, 1, 7,5, 3, 1,1,8,3,7,8,1,5,8,7,3,8,5 }; private static int [] byIndex_1 ={ 0, 3, 2, 0, 1, 3 }; private static float[] intertwined = { 1.0f, 0.2f, 1.0f, 100.0f, 100.0f, 0.0f, 1.0f, 0.2f, 0.2f, 0.0f, 200.0f, 0.0f, 1.0f, 1.0f, 0.2f, 100.0f, 300.0f, 0.0f, 0.2f, 1.0f, 0.2f, 200.0f, 300.0f, 0.0f, 0.2f, 1.0f, 1.0f, 300.0f, 200.0f, 0.0f, 0.2f, 0.2f, 1.0f, 200.0f, 100.0f, 0.0f }; private static int [] nSrcBox = { 1, 1, -1,1,1, 1, 1, -1, -1,1, -1, 1, -1, -1, -1,-1, -1, 1, -1, 1, -1,-1,1, 1 ,0,0,2 }; private static int [] nSrcBox_1 = { 0, 0, 0,1,0, 0, 0, 1, 0,1, 1, 0 }; public int [] s ; } 主程序中有如下操作, private void button36_Click(object sender, System.EventArgs e) { int[] edge=new int[pictureBox1.Image.Width*pictureBox1.Image.Height]; Color c1=new Color(); int r1; Bitmap box1=new Bitmap(pictureBox1.Image); for(int i=0;i<pictureBox1.Image.Width-1;i++) { for(int j=0;j<pictureBox1.Image.Height-1;j++) { c1=box1.GetPixel(i,j); r1=c1.R; edge[i+j*pictureBox1.Image.Width]=r1; } } _View.s=edge; //while(!this.IsDisposed ) //{ //if( !this.IsFinished ) //{
_View.Parent = this.panel3; // 设置_View的父容器 _View.Dock = DockStyle.Fill; // 使_View的各个边缘都停靠在_Form1的各个边缘 并适当调整大小 _View.glDraw(); // 绘制 _View.Refresh(); // 刷新
//} //} Application.DoEvents(); // 处理在当前消息队列中的所有Windows消息 } 现在问题是,如果我在主程序用有一个128X128的数据数组,而我要用到glVertex3f,我应该如何在类中建立这个数据数组,