14、事例十四:材质:十二个材质球

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-08-29 19:01:45

14、事例十四:材质:十二个材质球的相关文章

第十四、十五周新总结

第十四.十五周新总结 第十四.十五周总结 ——————————————王林 学科 WEB 数据结构 计算机网络基础 课外读物 进度 第十一章.第十二章 第七章 项目2.项目8 <黑客攻防从新手到高手> <Flash MX> 主要内容 第十四周.第十五周继续学习了CSS3的知识.CSS动画.变形.过度.模拟进度条效果. 两周内.,重点学习了图及其代码等. 第十四.十五两周内,学习了无线局域网的基础知识.无线网络的硬件设备ji组网模式及认证ID:十三周学习了常用广域网技术及接入Inte

CSS3秘笈复习:十三章&amp;十四章&amp;十五章&amp;十六章&amp;十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性:

第二十四天到二十六天学习笔记

八号这天,主要先是学习了数组对象 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn">

我的python学习--第十四天(二)

一.ansible api 在了解python的ansible api之前,先简单了解一下ansible. ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能. ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.主要包括: 连接插件connection p

第 三 十 四 天:二 阶 段 复 习(五)

小Q:一根羽毛,一根羽毛,或许太平常了,但组合起来,却是孔雀艳丽的彩屏 一粒砂土,一粒砂土,或许太渺小,但堆积起来,却是大山的脊梁. ======================================================================= 第一天的复习在这时刻结束了,根据这样的进程继续的话,复习预计会在四天后结束,然 后我更有时间去扩展一些知识.加固,然后做一些练习,我感觉我能看到一丝黎明所带来 的光线了: 再记一遍今天的内容,作为第三遍的回顾,睡觉的时候再

Android学习笔记二十四.Service入门(二)绑定本地Service并与之通信

绑定本地Service并与之通信    通过上一篇博文的前3步,我们就算完成了一个Service及使用该Service的应用程序(Service为该应用程序的组成部分).但当程序通过startService()和stopService()启动.关闭Service时,Service与访问者之间基本上不存在太多的关联,因此Service和访问者之间也无法进行通信.数据交换.如果我们希望开发的Service能与访问者之间实现方法调用或数据交换,我们可以让访问者使用bindService()和unbin

python 基础学习第十四天(二)

一.模块和包 我们今天来讲解一下模块和包,模块我们已经知道是什么东西了,我们现在来看看这个包是个什么? 我说的包可不是女同胞一看见就走不动的包,而是程序中一种组织文件的形式. 只要文件夹下含有__init__.py文件就是一个包,包是干什么的呢? 回想一下,之前我们没有学习模块的时候将一个整体的功能写入到文件中,为了能够充分的将某个功能进行重用 我们使用了模块,但是慢慢的模块就会越来越多.我们想提高程序的结构性可维护性,就使用包将模块进行统一管理 包能够管理多个模块,我们想要使用包里的模块怎么办

第十四,十五周微职位

1.搭建一套自动以运维工具Cobbler系统: 一.PXE 简述及介绍 预启动执行环境(Preboot eXecution Environment,PXE,也被称为预执行环境)是让计算机通过网卡独立地使用数据设备(如硬盘)或者安装操作系统.PXE当初是作为Intel的有线管理体系的一部分,Intel和 Systemsoft于1999年9月20日公布其规格(版本2.1).通过使用像网际协议(IP).用户数据报协议(UDP).动态主机设定协定(DHCP).小型文件传输协议(TFTP)等几种网络协议和

第十四,十五周作业

一,pta: 1,交换最小值和最大值: (1),实验代码: #include<stdio.h> int main() { int i, n,idx,t; scanf("%d",&n); int a[n]; for ( i = 0; i < n; i++ ) { scanf ( "%d", &a[i] ); } idx=0; for ( i = 0; i < n; i++ ) { if ( a[i] < a[idx] )

十四、十五天笔记总结

1. LineNumberReader:  *public int getLineNumber():获取行号  *public void setLineNumber(int lineNumber):设置起始行号   String readLine():读取一行    案例:读取文件,每次读取一行打印并且加上行号    packagecom.edu_01;   import java.io.FileNotFoundException; import java.io.FileReader; impo