OpenGL开发 颜色、材料和光照:基础知识

opengl消隐与光照 1.      设置材料颜色 OpenGL光照模型根据材料反射的红、绿蓝光的比例来模拟它的颜色光一样,材料也具有不同的环境、散射镜面颜色,它们决定了材料对红、绿蓝光的反射率。材料的环境反射属性与每种入射光的环境光成分组合,散射反射属性与入射光的散射成分组合,镜面反射属性入射光的镜面成分组合。环境散射属性定义了材料颜色,它们一般很相似。               使用的函数 阅读详情

设置颜色模式:

glShadeModel();

GL_SMOOT  //  平滑着色,图元的内部颜色是每个顶点颜色的平滑过渡。

GL_FLAT  //  单调着色,图元的内部颜色就是最后一个顶点所指定的颜色。唯一例外的是GL_POLYGON图元,它的内部颜色是第一个定点的颜色。

 

在OpenGL光照模型中,除非一个物体自己会发光,否则它将受到3种不同类型的光的照射:环境光(ambient)、散射光(diffuse)和镜面光(specular)。

 

环境光(ambient):

环境光并不来自任何特定的方向。它来自某个光源,但光线却是在房间或场景中四处反射,没有方向可言。由环境光所照射的物体在所有方向的表面都是均匀照亮的。

散射光(diffuse):

散射光具有方向性,来自于一个特定的方向,它根据入射光线的角度在表面上均匀地反射开来。

镜面光(specular):

镜面光具有很强的方向性,但它的反射角度很锐利,只沿一个特定的方向反射。

 

打开关照:

glEnable(GL_LIGHTING);

这个调用告诉OpenGL在确定场景中的每个顶点的颜色时使用材料属性和光照参数。但是,如果没有指定任何的材料属性或光照参数,物体将会保持为黑暗的无光照状态。

 

设置光照模式:

glLightModel

glLightModelfv();

 

启动光源:

GLfloat ambientLight[ ] = { 0.3f, 0.3f , 0.3f, 1.0f};

GLfloat diffuseLight[ ] = { 0.7f, 0.7f, 0.7f, 1.0f};

//设置并启用光照0

glLightfv(GL_LIGHT0 , GL_AMBIENT, ambientLight);

glLightfv(GL_LIGHT0 , GL_DIFFUSE, diffuseLight);

启动光源0:

glEnable(GL_LIGHT0);

光的位置:

GLfloat lightPos [ ] = { -50.0f, 50.0f, 100.0f, 1.0f};

glLightfv(GL_LIGHT0,GL_POSITION, lightPos);

在此,lightPos数组包含了光的位置。这个数组的最后一个值是1.0,表示指定的坐标是光源的位置。如果这个数组的最后一个值是0.0,则表示光是从无限远处沿这个数组所指定的向量照射过来的。

 

把一个位置光源变成一个聚光灯:

glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 60.0f);

 

设置材料属性:

glMaterial();

glMaterialfv();

函数的第一个参数指定了材料属性是作用于正面、背面还是双面(GL_FRONT、GL_BACK或GL_FRONT_AND_BACK)。第二个参数指定将要设置哪个属性。最后一个参数是一个数组,它包含了构成这些属性的RGBA值。

第二种方法是我们所推荐的设置材料属性的方法,称为颜色追踪。使用颜色追踪,可以告诉OpenGL仅仅通过调用glColor来设置材料属性。为了启用颜色追踪,需要以GL_COLOR_MATERIAL为参数调用glEnable。

glEnable(GL_COLOR_MATERIAL);

接着,glColorMaterial函数根据glColor所设置的值来指定材料参数。

glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);

 

指定法线向量:

glNormal3f();

启动法线规范化:

glEnable(GL_MORMALIZE);

glEnable(GL_RESCALE_NORMALS);

建议使用第二种,第一种会在效率上有所牺牲。第二种调用告诉OpenGL,法线不是单位长度,但他们可以通过相同数量的缩放实现单位长度。

 

 

打开混合:

glEnable(GL_BLEND);

glBlendFunc(GLenum S, GLenum D);

 

对点、直线和多边形进行抗锯齿处理:

glEnable(GL_POINT_SMOOTH);

glEnable(GL_LINE_SMOOTH);

glEnable(GL_POLYGON_SMOOTH); //需要其他的规则,这个并不常用

 

打开或关闭多重采样:

glutInitDisplayMode(GL_MULTISAMPLE);

glEnable(GL_MULTISAMPLE);

 

关闭多重采样:

glDisable(GL_MULTISAMPLE);

使用多重采样后,点、直线和多边形的平滑特性都将被忽略。

 

应用雾:

打开或关闭雾:

glEnable/glDisable(GL_FOG);

设置雾参数:

GLfloat fogColor [ ] = {0.0f,1.0f,0.0f,1.0f};

glFogfv(GL_FOG_COLOR, fogColor);  //设置雾颜色

glFogf(GL_FOG_START, 5.0f);  //雾从多远开始

glFogf(GL_FOG_END, 30.0f);  //雾到多元结束

glFogf(GL_FOG_DENSITY, 0.5f);  //雾稠密度

glFogi(GL_FOG_MODE, GL_LINEAR);  //使用哪种雾模式

注意,GL_FOG_START和GL_FOG_END只对GL_LINEAR雾有效。稠密度值对于线性雾并无效果。

 

显式地请求片段雾:

glHint(GL_FOG_HINT,GL_NICEST);

为了实现更快、精确度稍低的雾,可以调用:

glHint(GL_FOG_HINT,GL_FASTEST);

 

雾坐标:

我们可以自己完成计算雾距离,可以用glFogCoordf(GLfloat fFogDistance)函数来设置,除非使用下面这个函数更改了雾坐标的来源,否则雾坐标是被忽略的:

glFogi(GL_FOG_COORD_SRC,GL_FOG_COORD);   //  使用glFogCoordf

为了打开OpenGL产生的雾值,要把最后一个参数改为GL_FRAGMENT_DEPTH:

glFogi(GL_FOG_COORD_SRC,GL_FRAGMENT_DEPTH);

 

累积缓冲区:

void glAccum(GLenum op, GLfloat value);

第一个参数指定了希望使用哪种累积操作,第二个参数是个浮点值,用于对操作进行缩放。

下面是OpenGL支持的累积操作:

GL_ACCUM 根据参数值对颜色缓冲区的值进行缩放,并把它们添加到累积缓冲区的当前内容中;

GL_LOAD 根据参数值对颜色缓冲区的值进行缩放,并用它们替换累积缓冲区的当前内容;

GL_RETURN 根据累积缓冲区的值对颜色值进行缩放,然后把结果复制到颜色缓冲区;

GL_MULT 根据累积缓冲区的值对颜色值进行缩放,然后把结果存储到累积缓冲区;

GL_ADD 根据累积缓冲区的值对颜色值进行缩放,然后把结果添加到累积缓冲区的当前内容上;

最后,当我们设置OpenGL渲染环境时,必须记住要请求一个累积缓冲区。GLUT还通过glutInitDisplayMode函数传递GLUT_ACCUM标志来提供对累积缓冲区的支持:

glutInitDisplayMode(GLUT_ACCUM);

 

 

其他颜色操作:

颜色掩码:

void glColorMask(GLboolean red,GLboolean green GLboolean blue,GLboolean alpha);

如果对其中的一个通道所传递的标志是GL_TRUE,表示可以对这个通道进行写入。如果传递的是GL_FALSE,表示无法写入到这个通道。

 

alpha测试:

alpha测试值和比较函数是通过glAlphaFunc函数指定的:

void glAlphaFunc(GLenum func,GLclampf ref);

可以用glEnable/glDisable(GL-ALPHA_TEST)来打开或关闭alpha测试。

 

抖动:

可以通过glEnable/glDisable(GL_DITHER);来打开或关闭抖动。

OpenGL与3D开发-旋转光照透明 旋转、光照、透明 文章目录旋转、光照、透明1、旋转1.1、旋转的单位是角度值1.2 旋转的是整个坐标系1.3 如果进行一系列旋转操作,顺序很重要1.4 平移旋转2、缩放2.1 平移缩放3、 光照3.1、真实世界中的光照3.2、 光照类型:3.3 光源4、材料5、光照计算6、透明6.1、混合6.2、源因子目标因子6.3 、glBlendFunc函数 1、旋转 1.1、旋转的单位是角度值 1.2 旋转的是整个坐标系 glRotatef()方法的语法格式如下:glRotatef (float angle, 阅读详情

相关推荐

OpenGL学习脚印: 光照基础(basic lighting)

写在前面 上一节坐标变换过程,总结了OpenGL中顶点的处理过程。有了前面的基础,从本节开始,我们可以开始学习OpenGL中包括光照、模型加载等主题。光照是一个复杂的主题,本节学习简单的Phong reflection model.本节示例程序均可以在我的github下载。 本节内容整理自: 1. learnopengl.com Basic Lighting 2.Modern

王定桥的专栏 1万+

OpenGL基础图形编程 - OpenGL颜色

几乎所有OpenGL应用目的都是在屏幕窗口内绘制彩色图形,所以颜色OpenGL编程中占有很重要的地位。这里的颜色与绘画中的颜色概念不一样,它属于RGB颜色空间,只在监视器屏幕上显示。另外,屏幕窗口坐标是以象素为单位,因此组成图形的每个象素都有自己 的颜色,而这种颜色值是通过对一系列OpenGL函数命令的处理最终计算出来的。本章将讲述计算机颜色的概念以及OpenGL颜色模式、颜色定义两种模式应

popkiler的专栏 3040

AI驱动全栈开发实战:基于Spec与Codex的规格驱动开发指南

1. 先搞清楚“AI重构前端全栈”到底在解决什么实际问题 最近很多人在聊“AI重构前端全栈”,听起来像是又一个营销概念。但如果你真的拆开看,它核心解决的是一个非常具体且痛苦的问题: 一个开发者,如何从零开始,系统性地、不跑偏地完成一个完整项目,并且保证代码质量架构一致性。 传统开发流程里,产品经理出PRD,前后端开会对齐,前端画页面,后端写接口,测试再介入。这个过程沟通成本高,文档容易过时,新人上手慢。而“AI重构”的思路,是试图用一套 规范化的指令(Spec) 来驱动AI(比如Codex这类模型)生成代

weixin_30596023的博客 423

OpenGL 超级宝典笔记 ——

OpenGL 超级宝典笔记 ——

whl0071的专栏 1009

OpenGL使用glColorMaterial设置材质

一句话glColorMaterial的作用是用来在绘图的过程中实时的设置材质。通常情况下设置一个物体的材质需要以下这么5个属性需要设置。   glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL

NCTU_to_prove_safety的博客 2644

glEnable(GL_COLOR_MATERIAL) 的作用

glEnable(GL_LIGHT0); // 使用默认的0号灯 glEnable(GL_LIGHTING); // 使用灯光 glEnable(GL_COLOR_MATERIAL); // 使用颜色材质 最后一行的GL_COLOR_MATERIAL使我们可以用颜色来贴物体。如果没有这行代码,纹理将始终保持原来的颜色,glColor3f(r,g,b)就没有用了。总之这行代码是

7726

glColorMaterial glMaterial 的区别

直接代码说明吧。 1、在使用(固定管线的)光照后,这2个函数才生效 glEnable( GL_LIGHTING ); /// 设置光源属性 ///... 2、使用glMaterial指定3D模型的材质,以环境光颜色为例 glm::vec4 ambientColor(1.0f,0.0f,0.0f,1.0f); glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambientColor.x ); 3、与2等价的效果:使用glColorMateri.

iMatt的专栏 2075

OpenGL开发 颜色材料光照基础知识

设置颜色模式: glShadeModel(); GL_SMOOT  //  平滑着色,图元的内部颜色是每个顶点颜色的平滑过渡。 GL_FLAT  //  单调着色,图元的内部颜色就是最后一个顶点所指定的颜色。唯一例外的是GL_POLYGON图元,它的内部颜色是第一个定点的颜色。   在OpenGL光照模型中,除非一个物体自己会发光,否则它将受到3种不同类型的光的照射:

u011616792的专栏 838

颜色光照材料属性(openGL

0.颜色 a.颜色坐标系 b.颜色设置与着色 void colortriangle() { glClear(GL_COLOR_BUFFER_BIT); glShadeModel(GL_SMOOTH); glBegin(GL_TRIANGLES); /************************************颜色设置及着色****************

脚踏实地,仰望星空 8066

OpenGL中给场景添加光照

OpenGL中给场景添加光照      为了在OpenGL中使用光照计算,我们需要调用glEnable方法,并用GL_LIGHTING作为参数。这个调用告诉OpenGL在确定场景中每个顶点的颜色时使用光照参数材料属性。当然,如果我们没有指定任何光照参数材料属性,那么物体仍将会保持为黑暗的无光照状态。      // 启用光照      glEnable(GL_LIG

清道夫的专栏(3D程序员,炼心,终生编程) 1万+

OpenGL中的光照材料

OpenGL中的光照材料      在OpenGL光照模型中,除非一个物体自己会发光,否则它将受到3种不同类型的光的照射,这3种不同类型的光分别是:环境光(ambient)、散射光(diffuse)镜面光(specular)。作为现实世界中光照的抽象,这3种类型的光允许我们模拟控制光照在物体表面上所产生的效果。      环境光(ambient)      环境光并

清道夫的专栏(3D程序员,炼心,终生编程) 3248

OpenGL || opengl中的光照材质

openGL在处理光照时,把光照系统分为三部分:光源、材料光照模型。 光源、材料光照模式都有各自的属性,尽管属性种类繁多,但这些属性都只有少量的几个函数来设置。 光源的属性:glLight* 材质的属性:glMaterial* 光照模式:glLightModel* 【光源的属性】&&【 材质的属性】 GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR这三种属性是光源材质所共有的。 如果某光源发出的光照射发哦某材质的表面,则最终的漫反射强度由两个GL_DIFFU.

magic_ll的博客 2050

openGL光照材料(一)

真实感图形绘制是计算机图形学的一个重要组成部分,它综合利用数学、物理学、计算机科学其它科学知识在计算机图形设备上生成象彩色照片那样的具有真实感的图形。一般说来,用计算机在图形设备上生成真实感图形必须完成以下四个步骤:一是用建模,即用一定的数学方法建立所需三维场景的几何描述,场景的几何描述直接影响图形的复杂性图形绘制的计算耗费;二是将三维几何模型经过一定变换转为二维平面透视投影图;三是确定场景中

chenxiao88957478的博客 9250

OpenGL学习笔记(三):颜色光照

作者:yurunsun@gmail.com 新浪微博@孙雨润 新浪博客 CSDN博客 日期: 2013-6-13 <!-- body {font-size:14px; line-height:1.6; color:#333333; font:13px/1.4 Helvetica,arial,freesans,clean,sans-serif} body > *:

雨润的技术博客 3939

OpenGL光照

最近用到opengl光照,之前接触过一点,那还是opengl1.X版本的吧,传统的固定管线。但也只是略知皮毛,只知道一些开启/关闭灯,环境光,散射光镜面光等。由于当时是刚接触opengl,没有实际应用,只能算是了解有这个东西吧。现在既然要用这个东西,再加上,现在已经是可编程管线了的天下了,处理方式也有些不同了。于是决定好好整理下这块东西,同时深入学习下。     1. 光源类型     根据

风中静草 1431

OpenGL光照模型--四种光照效果

OpenGL光照模型 发表于 2011 年 07 月 26 日 由guidebee 了能看出3D效果,给场景中添加光源。如果没有光照,绘出的球看上去一个二维平面上圆没什么差别,如下图,左边为有光照效果的球体,右边为同一个球体但没有设置光源,看上去就没有立体效果,因此OpenGL 光照效果对显示3D效果非常明显。 在OpenGL 光照模型中光源光照效果可以细分为红,绿,蓝三个部

j123kaishichufa的专栏 8990

Android OpenGL添加光照材料属性

在上一篇文章【 Android OpenGL显示任意3D模型文件 】中,我们学习了如何读取并显示STL格式的3D文件,但是,最后,看到的并没有添加光照效果,导致虽然模型在旋转,但是我们看到的画面却像一个平面。今天我们开始学习如何给模型添加灯照效果,以及如何为模型添加材料属性,使得最终看到的旋转模型真正为3D效果。首先,看看最终效果,如下图所示

huachao1001的专栏 8696

Android OpenGL ES 开发教程(25):OpenGL光照模型

前面绘制球体时Android OpenGL ES 开发教程(22):绘制一个球体 ,为了能看出3D效果,给场景中添加光源。如果没有光照,绘出的球看上去一个二维平面上圆没什么差别,如下图,左边为有光照效果的球体,右边为同一个球体但没有设置光源,看上去就没有立体效果,因此OpenGL 光照效果对显示3D效果非常明显。 在OpenGL 光照模型中光源光照效果可以细分为红,绿,蓝三个部分,光源由

引路蜂移动软件 7794

Android OpenGL ES 开发教程(27):材质光照示例

设置物体表面材料(Material)的反光属性(颜色材质)的方法如下: public void glMaterialf(int face,int pname,float param) public void glMaterialfv(int face,int pname,float[] params,int offset) public void glMaterialfv(int face

引路蜂移动软件 8911

11、频率响应与伯德图详解

本文详细介绍了电子电路分析中的频率响应与伯德图,涵盖分贝的定义与计算、带宽与3dB点、放大器反馈机制、倍频程与十倍频程概念,并系统讲解了基于实数复数零极点的伯德图构建方法。通过具体示例分析了传递函数的渐近近似、幅度与相位响应,并结合MATLAB工具展示了伯德图的绘制过程。文章旨在帮助读者深入理解电路在不同频率下的行为特性,为电路设计与优化提供理论支持。

white的博客 153

雷达测距测速成像+线性调频连续波雷达+仿真分析

基于MATLAB软件平台,利用LFMCW雷达实现对目标的测距、测速、成像功能。软件包括:1、考虑雷达静止、目标静止,利用LFMCW雷达实现对目标的一维测距功能,同时评估峰值位置处初相估计精度2、考虑雷达静止、目标运动,利用LFMCW雷达实现对目标的测距测速功能,同时分析距离徙动对测距、测速的影响,提出简单的距离徙动校正方法3、考虑雷达运动、目标静止,利用LFMCW雷达通过后向投影算法处理实现对目标的成像功能。本程序可以直观感受LFMCW雷达实现目标测距、测速、成像过程,适合初学者学习。处理结果详情参考:https://mp.csdn.net/mp_blog/creation/editor/145821995

上一篇: OpenGL开发 几何变换:管线
下一篇: NeHe OpenGL教程第一课 创建一个OpenGL窗口(Wiin32)
堕落的天使
博客等级 码龄18年 140粉丝 99原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值