C# SharpGL-Material材质

2023-05-16

在上一节C# SharpGL-Light光源讲了我们身边的几个实际场景与OpenGL一些参数对应关系,其中讲到了反射光的颜色:

4、反射的光颜色:我们之所以能够看到不发光的物体,是因为这些不发光的物体能够反射照射在该物体上的光,反射出来的光的颜色=照射在物体上的光的颜色+物体本身的颜色。太阳光是白色,照射在一个红色的物体上,我们人眼看到的物体就是红色的。若光源颜色改为绿色,照射在红色物体上,我们人眼看到的物体颜色是黄色的。注意:物体本身的颜色对应到OpenGL中就是材质参数。

在此,详细说明一下OpenGL中的材质应用。
  实际生活中,不同的材质物体,呈现的颜色不一样,OpenGL中材质的定义其实就是该物体的颜色。实际呈现出来的物体颜色,应该是光源颜色和物体颜色的叠加。

材质函数:Material(uint face, uint pname, float[] parameters)
其中:
face:指定材质属性将应用于物体的那个面。
   GL_FRONT 正面
   GL_BACK 背面
   GL_FRONT_AND_BACK 双面
pname:指定设置材质那个属性,与光源设定LightParameter相似:
在这里插入图片描述
parameters:对应属性设定的值。
  重点说明一下镜面指数属性:
  GL_SHININESS:该属性只有一个值,称为“镜面指数”,取值范围是0到128。该值越小,表示材质越粗糙,点光源发射的光线照射到上面,也可以产生较大的亮点。该值越大,表示材质越类似于镜面,光源照射到上面后,产生较小的亮点。
  
  上程序,看下实际效果,仿照网上的范例和Light光源的例子,做一个地球绕太阳旋转的模型出来。
  1、设定太阳光

        float[] sun_light_position = { 0f, 0f, 0f, 1f };//光源位置,位置性点光源
        float[] sun_light_ambient = { 0f, 0f, 0f, 1f };//环境光
        float[] sun_light_diffuse = { 1f, 1f, 1f, 1f };//漫反射光
        float[] sun_light_speular = { 1f, 1f, 1f, 1f };//镜面光
        private void setLight(SharpGL.OpenGL gl)
        {
            gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, sun_light_position);
            gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_AMBIENT, sun_light_ambient);
            gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_DIFFUSE, sun_light_diffuse);
            gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_SPECULAR, sun_light_speular);

            gl.Enable(OpenGL.GL_LIGHT0);//开启光源0
            gl.Enable(OpenGL.GL_LIGHTING);//开启光源功能
        }

2、绘制球体函数,这里不再细讲,不了解的同学可以去看C# SharpGL-Light光源里的范例讲解。

        private void DrawSphere(SharpGL.OpenGL gl,double radius, float xPos, float yPos, float zPos,int segx,int segy)
        {
            gl.PushMatrix();
            gl.Translate(xPos, yPos, zPos);
            var sphere = gl.NewQuadric();
            gl.QuadricDrawStyle(sphere, OpenGL.GL_POINT);
            gl.QuadricNormals(sphere, OpenGL.GLU_SMOOTH);   //GLU_NONE,GLU_FLAT,GLU_SMOOTH
            gl.QuadricOrientation(sphere, (int)OpenGL.GLU_OUTSIDE);  //GLU_OUTSIDE,GLU_INSIDE
            gl.QuadricTexture(sphere, (int)OpenGL.GLU_FALSE);  //GL_TRUE,GLU_FALSE
            gl.Sphere(sphere, radius, segx, segy);
            gl.DeleteQuadric(sphere);
            gl.PopMatrix();
        }

3、绘制函数:包括绘制太阳,设置地球材质,绘制地球等

		float[] earth_mat_ambient   = {0.0f, 0.0f, 1.0f, 1.0f};  //定义材质的环境光颜色,骗蓝色
		float[] earth_mat_diffuse   = {0.0f, 0.0f, 0.5f, 1.0f};  //定义材质的漫反射光颜色,偏蓝色
		float[] earth_mat_specular = {1.0f, 0.0f, 0.0f, 1.0f};   //定义材质的镜面反射光颜色,红色
		float[] earth_mat_emission = {0f, 0.0f, 0.0f, 1.0f};   //定义材质的辐射光颜色,为0
		float earth_mat_shininess   = 30.0f;//定义材质镜面指数
        private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args)
        {
            SharpGL.OpenGL gl = this.openGLControl1.OpenGL;
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);

            gl.LoadIdentity();
            gl.Disable(OpenGL.GL_LIGHTING);//绘制前一定要先关闭Light
            gl.Color(1f, 0f, 0f);
            DrawSphere(gl, 3, sun_light_position[0], sun_light_position[1], sun_light_position[2], 20, 20);//绘制红色太阳
            gl.Enable(OpenGL.GL_LIGHTING);

            gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, earth_mat_ambient);
            gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, earth_mat_diffuse);
            gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, earth_mat_specular);
            gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, earth_mat_emission);
            gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, earth_mat_shininess);
            gl.Rotate(angle, 0, 0, 1);//地球围绕Z轴旋转
            DrawSphere(gl, 3, 8.0f, 0f, 0f, 20, 20);

            angle++;
            gl.Flush();            
        }

效果如下:
在这里插入图片描述
在这里插入图片描述
PS:各位大虾谁有比较好的gif生成软件,我现在用的这个gif生成器效果太差了…

测试程序在这里:SharpGL测试范例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# SharpGL-Material材质 的相关文章

随机推荐

  • 目标检测网络中的 bottom-up 和 top-down理解

    看目标检测网络方面的论文时 xff0c 出现了一组对比词汇 xff1a bottom up和top down xff0c 查了一些资料 xff0c 结合个人理解 xff0c 得到的看法是 xff1a top down 顾名思义是自上而下进行
  • 2021.08.26学习内容 Win10+GeForce GTX1650安装NVIDIA显卡驱动及CUDA11.4+cuDNN8.2

    之前主要使用Ubuntu系统 xff0c 但是个人笔记本更多使用windows 为了方便跑一些pytorch的小代码 xff0c 所以想在windows配置一下相关环境 xff0c 达到调用GPU运算的目的 记录也是为了自己以后有安装需求少
  • vscode调试webpack-dev-server项目

    先上结果 vscode下载debugger for chrome 插件 创建launch json 添加的时候选择Chrome Launch会自动生成chrome调试模板 xff0c 主要是要加上 34 preLaunchTask 34 3
  • OpenNetworkLinux:i2c-gpio.c源码学习笔记

    OpenNetworkLinux xff1a i2c gpio c源码学习笔记 i2c gpio的init和exit i2c驱动需要首先在平台驱动上进行注册 xff0c 方可提供自身的总线供适配器进行注册 xff0c 注册流程类似于一个内核
  • 每天一个Lodash源码解析

    每天一个Lodash源码解析 chunk 方法介绍自我实现源码分析代码对比知识点补充浮点数转化为浮点数数组创建方法区别js中切割数组方法 slice 方法介绍自我实现源码分析代码对比知识点补充 96 96 gt gt gt 96 96 移位
  • conda的常用操作

    1 查看conda版本 2 更改安装第三方库的源 将国外的源改为清华镜像源 cmd窗口依次输入 xff1a conda config add channels https mirrors tuna tsinghua edu cn anaco
  • 云技术

    什么是 云 与云技术 xff1f 云技术是在分布式计算技术 网格计算基数基础上发展起来的一种计算技术 云技术基于资源虚拟化的方式 xff0c 为用户提供方便快捷的服务 xff0c 可以实现计算与存储的分布式与并行处理 云技术为其他信息技术
  • 什么是上转型对象及其基本特征

    5 12 什么是上转型对象及其基本特征 xff1f 上转型对象 子类对象赋值给父类变量 例如 xff1a package com wangxing test1 父类 public class Person public void testP
  • 【树莓派入门系列】4 树莓派安装测试torch与torchvision

    树莓派运行YOLOV5项目 安装测试torch amp torchvision 项目目录 点击跳转 0 首页 1 前期准备工作 2 配置树莓派系统 3 安装测试opencv 4 安装测试torch amp torchvision 5 测试y
  • javascript中in和includes的区别

    in的用法 遍历对象 span class token keyword let span names span class token operator 61 span span class token punctuation span n
  • centos安装java环境

    方式一 xff1a 安装java环境 1 先查看本地是否自带java环境 xff1a yum list installed grep java 2 卸载自带的java xff08 输入su xff0c 输入root超级管理员的密码 xff0
  • 计算机网络(五) 网络层(中)

    网络层 xff08 中 xff09 3 划分子网和构造超网3 1划分子网3 2使用子网时分组的转发3 3无分类编址CIDR xff08 构造超网 xff09 4 网际控制报文协议 xff08 ICMP xff09 4 1 ICMP报文的种类
  • 【软件工程学习】软件工程概论

    一 软件工程基础 软件是什么 xff1f xff08 1 xff09 软件独立于硬件 早期软件是作为计算机硬件的零件来开发的 xff0c 40年代中后期和50年代早期时 xff0c 为了利用计算机硬件进行研究 xff0c 使用针对专门的硬件
  • Hadoop (四) ——MapReduce 的原理+实现

    MapReduce简介 MapReduce是一种编程模型 xff0c 用于大规模数据集的并行运算 概念 34 Map xff08 映射 xff09 和 34 Reduce xff08 归约 xff09 xff0c 是它们的主要思想 xff0
  • 51单片机oled12864显示时间日期温度

    思路 xff1a 电源接入 第一行显示时间 第二行显示日期 xff0c 屏幕下面左边显示星期 xff0c 右边显示温度 xff0c 当k1按键第一次按下进入设置页面 xff0c 在设置页面 xff0c k1按键为确定 k2按键为循环选择 k
  • python post请求报错:{“error“:“invalid_request“,“error_description“:“Missing grant type“}

    request post请求报错信息 xff1a error invalid request error description Missing grant type 修改为 xff1a 把headers中的 Content Type 改为
  • Ubuntu下teamviewer的安装及使用

    1 到官网下载对应的安装包 xff0c 官网下载网址 xff1a https www teamviewer cn cn download linux coupon 61 CMP SEM CN 20 amp utm source 61 bai
  • 海南大学考研人,你真的马上就要上岸了

    临考前 xff0c 很多注意事项大家要提前了解 最近很多同学问到试卷拆封的问题 xff0c 今天 我们海大学长学姐们 就给大家详细地说一下考研试卷拆封的整个过程 考研并不是传统的发卷子 xff0c 而是 发信封 自己开封 xff0c 答题
  • (windows+xrdp+ubuntu16.04)远程服务器出错:“password failed error - problem connecting“

    这个问题貌似是2019年1月10日xrdp进行了系统自动更新后导致的 xff0c 有两个解决办法 xff1a 方法1 xff1a 对xrdp进行降级重新安装sudo apt get install xrdp 61 0 6 1 2 方法2 x
  • C# SharpGL-Material材质

    在上一节C SharpGL Light光源讲了我们身边的几个实际场景与OpenGL一些参数对应关系 xff0c 其中讲到了反射光的颜色 xff1a 4 反射的光颜色 xff1a 我们之所以能够看到不发光的物体 xff0c 是因为这些不发光的