namespace sharpGLTest14 { public partial class Form1 : Form { float[] fLightPosition = new float[4] { 0.0f, 3.0f, 2.0f, 0.0f }; //5f, 8f, -8f, 1f };// 光源位置 float[] fLightAmbient = new float[4] { 0f, 0f, 0f, 1f };// 环境光参数 float[] fLightDiffuse = new float[4] { 1f, 1f, 1f, 1f };// 漫射光参数 float[] fLightSpecular = new float[4] { 1f, 1f, 1f, 1f }; //镜面反射 public Form1() { InitializeComponent(); } private void openGLControl_OpenGLInitialized(object sender, EventArgs e) { OpenGL gl = openGLControl.OpenGL; 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_LIGHT0, OpenGL.GL_SPECULAR, fLightSpecular); gl.ClearColor(0.0f, 0.2f, 0.2f, 0.0f); gl.ClearDepth(1f); gl.DepthFunc(OpenGL.GL_LEQUAL); gl.Enable(OpenGL.GL_DEPTH_TEST); gl.ShadeModel(OpenGL.GL_SMOOTH); gl.Enable(OpenGL.GL_LIGHTING);//开启光照 gl.Enable(OpenGL.GL_LIGHT0); gl.Enable(OpenGL.GL_NORMALIZE); } private void openGLControl_Resized(object sender, EventArgs e) { OpenGL gl = openGLControl.OpenGL; gl.MatrixMode(OpenGL.GL_PROJECTION); gl.LoadIdentity(); gl.Perspective(45f, (double)Width / (double)Height, 1, 100.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); draw(gl); } private void draw(OpenGL Gl) { ///定义材质属性值 float[] no_mat = new float[] { 0.0f, 0.0f, 0.0f, 1.0f }; // 无材质颜色 float[] mat_ambient = new float[] { 0.7f, 0.7f, 0.7f, 1.0f }; // 环境颜色 float[] mat_ambient_color = new float[] { 0.8f, 0.6f, 0.2f, 1.0f }; float[] mat_diffuse = new float[] { 0.2f, 0.5f, 0.8f, 1.0f }; // 散射颜色 float[] mat_specular = new float[] { 1.0f, 1.0f, 1.0f, 1.0f }; // 镜面反射颜色 float[] no_shininess = new float[] { 0.0f }; // 镜面反射指数为0 float[] low_shininess = new float[] { 5.0f }; // 镜面反射指数为5.0 float[] high_shininess = new float[] { 100.0f }; // 镜面反射指数为100.0 float[] mat_emission = new float[] { 0.3f, 0.2f, 0.3f, 0.0f }; // 发射光颜色 //清除缓存并重置单位矩阵 Gl.LoadIdentity(); // 第一行第一列绘制的球仅有漫反射光而无环境光和镜面光。 Gl.PushMatrix(); Gl.Translate(-2.0f, 1.5f, -7.0f); /* * public void Material(uint face, uint pname, float[] parameters) * face取值指明材质属性将应用于物体的哪个面:GL_FRONT 正面 、GL_BACK 背面 、 GL_FRONT_AND_BACK 双面 * pnam指出要设置的哪种材质属性,见下面表: * 参数名 缺省值 说明 * GL_AMBIENT (0.2, 0.2, 0.2, 1.0) 材料的环境光颜色 * GL_DIFFUSE (0.8, 0.8, 0.8, 1.0) 材料的漫反射光颜色 * GL_AMBIENT_AND_DIFFUSE ? 材料的环境光和漫反射光颜色 * GL_SPECULAR (0.0, 0.0, 0.0, 1.0) 材料的镜面反射光颜色 * GL_SHINESS 0.0 镜面指数(光亮度) * GL_EMISSION (0.0, 0.0, 0.0, 1.0) 材料的辐射光颜色 * GL_COLOR_INDEXES (0, 1, 1) 材料的环境光、漫反射光和镜面光颜色 * 函数glMaterial*()参数pname的缺省值 * * */ Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); // 第一行第二列绘制的球有漫反射光和镜面光,并有低高光,而无环境光 Gl.PushMatrix(); Gl.Translate(-0.5f, 1.5f, -7.0f); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, low_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); // 第一行第三列绘制的球有漫反射光和镜面光,并有很亮的高光,而无环境光 。*/ Gl.PushMatrix(); Gl.Translate(1f, 1.5f, -7.0f); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, high_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); // 第一行第四列绘制的球有漫反射光和辐射光,而无环境和镜面反射光。*/ Gl.PushMatrix(); Gl.Translate(2.5f, 1.5f, -7.0f); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, mat_emission); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); // 第二行第一列绘制的球有漫反射光和环境光,而镜面反射光。*/ Gl.PushMatrix(); Gl.Translate(-2.0f, 0f, -7.0f); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); // 第二行第二列绘制的球有漫反射光、环境光和镜面光,且有低高光。*/ Gl.PushMatrix(); Gl.Translate(-0.5f, 0f, -7.0f); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, low_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); // 第二行第三列绘制的球有漫反射光、环境光和镜面光,且有很亮的高光。*/ Gl.PushMatrix(); Gl.Translate(1f, 0f, -7.0f); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, high_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); // 第二行第四列绘制的球有漫反射光、环境光和辐射光,而无镜面光。*/ Gl.PushMatrix(); Gl.Translate(2.5f, 0f, -7.0f); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, mat_emission); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); // 第三行第一列绘制的球有漫反射光和有颜色的环境光,而无镜面光。*/ Gl.PushMatrix(); Gl.Translate(-2.0f, -1.5f, -7.0f); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); // 第三行第二列绘制的球有漫反射光和有颜色的环境光以及镜面光,且有低高光。*/ Gl.PushMatrix(); Gl.Translate(-0.5f, -1.5f, -7.0f); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, low_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); // 第三行第三列绘制的球有漫反射光和有颜色的环境光以及镜面光,且有很亮的高光。*/ Gl.PushMatrix(); Gl.Translate(1f, -1.5f, -7.0f); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, high_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); // 第三行第四列绘制的球有漫反射光和有颜色的环境光以及辐射光,而无镜面光。*/ Gl.PushMatrix(); Gl.Translate(2.5f, -1.5f, -7.0f); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess); Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, mat_emission); drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); Gl.PopMatrix(); Gl.Flush(); } //二次曲面球体 void drawSphere(OpenGL gl, float x, float y, float z, double radius, int segx, int segy, bool isLines) { gl.PushMatrix(); gl.Translate(x, y, z); 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.GL_FALSE); gl.Sphere(sphere, radius, segx, segy); gl.DeleteQuadric(sphere); gl.PopMatrix(); } } }
原文地址:https://www.cnblogs.com/lotuses/p/11360298.html
时间: 2024-10-30 02:58:21