OpenGLControl控件属性中:
DrawFPS:true、false 控制页面左下角显示draw Time
RenderContextType:修改为FBO
Dock:OpenGL窗口显示相对位置
纹理使用:
1、类中定义:
SharpGL.SceneGraph.Assets.Texture textureBox = new SharpGL.SceneGraph.Assets.Texture();
2、初始化OpenGL时创建:
textureBox.Create(gl, "image.bmp");
3、drawOpenGL时使用
textureBox.Bind(gl);
gl.Enable(OpenGL.GL_TEXTURE_2D); //启用纹理
gl.Disable(OpenGL.GL_TEXTURE_2D); //关闭纹理
namespace sharpGLTest12 { public partial class Form1 : Form { private float rotation = 0.0f, rotation2 = 0f, rotation3 = 0f; SharpGL.SceneGraph.Assets.Texture textureBox = new SharpGL.SceneGraph.Assets.Texture(); //(1)纹理定义 float[] fLightPosition = new float[4] { 16f, 9f, -18f, 0f };// 光源位置 float[] fLightAmbient = new float[4] { 1f, 1f, 1f, 0f };// 环境光参数 float[] fLightDiffuse = new float[4] { 1f, 1f, 1f, 0f };// 漫射光参数 float[] fLightPosition2 = new float[4] { -7f, 5f, 2f, 0f };// 光源位置 float[] fLightAmbient2 = new float[4] { 0f, 0f, 1f, 0f };// 环境光参数 float[] fLightDiffuse2 = new float[4] { 0f, 0f, 1f, 0f };// 漫射光参数 bool f1 = false; public Form1() { InitializeComponent(); } private void openGLControl_OpenGLInitialized(object sender, EventArgs e) { OpenGL gl = openGLControl.OpenGL; textureBox.Create(gl, "image.bmp"); //(2)纹理创建 gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_AMBIENT, fLightAmbient);//环境光源 gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_DIFFUSE, fLightDiffuse);//漫射光源 gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, fLightPosition);//光源位置 gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_AMBIENT, fLightAmbient2);//环境光源 gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_DIFFUSE, fLightDiffuse2);//漫射光源 gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_POSITION, fLightPosition2);//光源位置 gl.Enable(OpenGL.GL_LIGHTING);//开启光照 gl.Enable(OpenGL.GL_LIGHT0); gl.Enable(OpenGL.GL_LIGHT1); //必须有,它用来自动归一化法线方向,因为光照效果由顶点和法线方向决定. gl.Enable(OpenGL.GL_NORMALIZE); gl.ClearColor(0, 0, 0, 0); } private void openGLControl_Resized(object sender, EventArgs e) { OpenGL gl = openGLControl.OpenGL; gl.MatrixMode(OpenGL.GL_PROJECTION); gl.LoadIdentity(); gl.Perspective(60.0f, (double)Width / (double)Height, 0.01, 100.0); gl.LookAt(-2, 3, -7, -2, 0, 0, 0, 1, 0); gl.MatrixMode(OpenGL.GL_MODELVIEW); } private void openGLControl_OpenGLDraw(object sender, PaintEventArgs e) { OpenGL gl = openGLControl.OpenGL; gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); gl.LoadIdentity(); gl.Rotate(rotation3, 0, 1, 0); drawGrid(gl); //网格 —— 先画网格时,关闭灯光和纹理,否则网格和后续作图会受到影响,需要再开启 drawLightPT(gl); //小正方体(慢) drawLightPT2(gl); //小正方体(快) drawTextrueBox(gl, 1, 0, 2); //大正方体 drawSphere(gl, 2, 20, 20, false); //圆 —— 关闭纹理,否会受到Box材质设置状态的影响 moveLightA(gl); rotation3 += 0.1f; } void drawSphere(OpenGL gl, double radius, int segx, int segy, bool isLines) { gl.PushMatrix(); gl.Disable(OpenGL.GL_TEXTURE_2D); gl.Translate(-7f, -1f, 2f); var sphere = gl.NewQuadric(); if (isLines) gl.QuadricDrawStyle(sphere, OpenGL.GL_LINES); else gl.QuadricDrawStyle(sphere, OpenGL.GL_QUADS); gl.QuadricNormals(sphere, OpenGL.GLU_SMOOTH); gl.QuadricOrientation(sphere, (int)OpenGL.GLU_OUTSIDE); gl.QuadricTexture(sphere, (int)OpenGL.GLU_FALSE); gl.Sphere(sphere, radius, segx, segy); gl.DeleteQuadric(sphere); gl.PopMatrix(); } private void moveLightA(OpenGL gl) { if (!f1) --fLightPosition[0]; else ++fLightPosition[0]; if (fLightPosition[0] > 15f) { f1 = !f1; } else if (fLightPosition[0] < -25f) { f1 = !f1; } gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, fLightPosition);//光源位置 } private void drawTextrueBox(OpenGL gl, float xPos, float yPos, float zPos) { rotation += 3.0f; gl.PushMatrix(); { textureBox.Bind(gl); //(3)纹理在绘图时使用 gl.Enable(OpenGL.GL_TEXTURE_2D); gl.Rotate(rotation, 0, 1, 0); gl.Translate(-1, 2, -5); gl.Scale(3, 3, 3); drawBox(gl, xPos, yPos, zPos); } gl.PopMatrix(); } private void drawLightPT2(OpenGL gl) { rotation2 += 4f; gl.PushMatrix(); { gl.LoadIdentity(); gl.Disable(OpenGL.GL_TEXTURE_2D); gl.Color(0f, 1f, 1f); gl.Scale(0.2, 0.2, 0.2); gl.Rotate(rotation2, 0, 1, 0); gl.Translate(-28, 8, 5); drawBox(gl, 0, 0, 0); } gl.PopMatrix(); } private void drawLightPT(OpenGL gl) { gl.PushMatrix(); { gl.Disable(OpenGL.GL_TEXTURE_2D); gl.Color(0f, 1f, 1f); gl.Scale(0.2, 0.2, 0.2); gl.Translate(fLightPosition[0] - 5, fLightPosition[1] + 5, fLightPosition[2]); drawBox(gl, 0, 0, 0); } gl.PopMatrix(); } private void drawBox(OpenGL gl, float xPos, float yPos, float zPos) { gl.PushMatrix(); gl.Translate(xPos, yPos, zPos); gl.Begin(OpenGL.GL_QUADS); //前 gl.TexCoord(0, 0); gl.Vertex(0, 0, 0); gl.TexCoord(1, 0); gl.Vertex(-1, 0, 0); gl.TexCoord(1, 1); gl.Vertex(-1, -1, 0); gl.TexCoord(0, 1); gl.Vertex(0, -1, 0); //底 gl.TexCoord(0, 0); gl.Vertex(0, 0, 0); gl.TexCoord(1, 0); gl.Vertex(0, 0, -1); gl.TexCoord(1, 1); gl.Vertex(-1, 0, -1); gl.TexCoord(0, 1); gl.Vertex(-1, 0, 0); //左 gl.TexCoord(0, 0); gl.Vertex(-1, 0, 0); gl.TexCoord(1, 0); gl.Vertex(-1, 0, -1); gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1); gl.TexCoord(0, 1); gl.Vertex(-1, -1, 0); //右 gl.TexCoord(0, 0); gl.Vertex(0, 0, 0); gl.TexCoord(1, 0); gl.Vertex(0, 0, -1); gl.TexCoord(1, 1); gl.Vertex(0, -1, -1); gl.TexCoord(0, 1); gl.Vertex(0, -1, 0); //后 gl.TexCoord(0, 0); gl.Vertex(0, 0, -1); gl.TexCoord(1, 0); gl.Vertex(-1, 0, -1); gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1); gl.TexCoord(0, 1); gl.Vertex(0, -1, -1); //顶 gl.TexCoord(0, 0); gl.Vertex(0, -1, 0); gl.TexCoord(1, 0); gl.Vertex(0, -1, -1); gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1); gl.TexCoord(0, 1); gl.Vertex(-1, -1, 0); gl.End(); gl.PopMatrix(); } void drawGrid(OpenGL gl) { /* * 必须要关闭纹理和光照,否则画栅格时受到场景中灯光,或者材质设定的影响,栅格原来的颜色就没有了, * 这个其实就是因为OpenGL是个状态机,其它部分代码改变了某些状态,画栅格就会继承改变 * */ //关闭纹理和光照 gl.Disable(OpenGL.GL_TEXTURE_2D); gl.Disable(OpenGL.GL_LIGHTING); //绘制过程 gl.PushAttrib(OpenGL.GL_CURRENT_BIT); //保存当前属性 gl.PushMatrix(); //压入堆栈 gl.Translate(0f, -2f, 0f); gl.Color(0f, 0f, 1f); //在X,Z平面上绘制网格 for (float i = -50; i <= 50; i += 1) { //绘制线 gl.Begin(OpenGL.GL_LINES); { if (i == 0) gl.Color(0f, 1f, 0f); else gl.Color(0f, 0f, 1f); //X轴方向 gl.Vertex(-50f, 0f, i); gl.Vertex(50f, 0f, i); //Z轴方向 gl.Vertex(i, 0f, -50f); gl.Vertex(i, 0f, 50f); } gl.End(); } gl.PopMatrix(); gl.PopAttrib(); gl.Enable(OpenGL.GL_LIGHTING); } } }