OpenGL ES 3. 光照-散射光

2024-05-10 19:32
文章标签 es opengl 光照 散射光

本文主要是介绍OpenGL ES 3. 光照-散射光,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,接下来将为大家介绍OpenGL ES 3. 光照-散射光。

OpenGL ES 3.0 中采用的光照模型相对现实世界进行了很大的简化,将光照分成了 3 种组成元素(也可以称为 3 个通道),包括环境光、散射光 以及 镜面光。

1、散射光介绍

       仅仅有环环境光的场景效果是很差的,没有层次感。接下来将介绍另外一种真实感好很多的光照效果—散射光(Diffuse),其指的是从物体表面向全方位 360°均匀反射的光,如下图所示。


        散射光具体代表的是现实世界中的物体表面被光照射时,反射光在各个方向基本均匀(也称为“漫反射”)的情况,上图很好地说明了这个问题。
        虽然反射后的散射光在各个方向是均匀的,但散射光反射的强度与入射光的强度以及入射的角度密切相关。因此,当光源的位置发生变化时,散射光的效果会发生明显变化。主要体现为当入射光垂直地照射到物体表面时比斜照时要亮,其具体计算公式如下。
        散射光照射结果 = 材质的反射系数 * 散射光强度 * max(cos(入射角), 0) 。

 

2、在前述“绘制球体”的基础上,进行环境光的渲染        

顶点着色器,引入了散射光diffuse:

#version 300 es
uniform mat4 uMVPMatrix; 					//总变换矩阵
uniform mat4 uMMatrix; 						//变换矩阵(包括平移、旋转、缩放)
uniform vec3 uLightLocation;			       
in vec3 aPosition;  						//顶点位置
in vec3 aNormal;    						//顶点法向量
out vec3 vPosition;							//用于传递给片元着色器的顶点位置
out vec4 vDiffuse;							//用于传递给片元着色器的散射光分量
void pointLight (							//散射光光照计算的方法in vec3 normal,							//法向量inout vec4 diffuse,						//散射光计算结果in vec3 lightLocation,					//光源位置in vec4 lightDiffuse						//散射光强度
){  vec3 normalTarget=aPosition+normal;				//计算变换后的法向量vec3 newNormal=(uMMatrix*vec4(normalTarget,1)).xyz-(uMMatrix*vec4(aPosition,1)).xyz;newNormal=normalize(newNormal);					//对法向量规格化//计算从表面点到光源位置的向量vpvec3 vp= normalize(lightLocation-(uMMatrix*vec4(aPosition,1)).xyz);vp=normalize(vp);									 float nDotViewPosition=max(0.0,dot(newNormal,vp)); //求法向量与vp向量的点积与0的最大值diffuse=lightDiffuse*nDotViewPosition;			 //计算散射光的最终强度
}
void main(){gl_Position = uMVPMatrix * vec4(aPosition,1); 	 //根据总变换矩阵计算此次绘制此顶点的位置 vec4 diffuseTemp=vec4(0.0,0.0,0.0,0.0);   pointLight(normalize(aNormal), diffuseTemp, uLightLocation, vec4(0.8,0.8,0.8,1.0));  vDiffuse=diffuseTemp;					//将散射光最终强度传给片元着色器vPosition = aPosition; 					//将顶点的位置传给片元着色器
}
#version 300 es
precision mediump float;
uniform float uR;
in vec3 vPosition;//接收从顶点着色器过来的顶点位置
in vec4 vDiffuse;//接收从顶点着色器过来的散射光最终强度
out vec4 fragColor;
void main()                         
{vec3 color;float n = 8.0;//一个坐标分量分的总份数float span = 2.0*uR/n;//每一份的长度//每一维在立方体内的行列数int i = int((vPosition.x + uR)/span);int j = int((vPosition.y + uR)/span);int k = int((vPosition.z + uR)/span);//计算当点应位于白色块还是黑色块中int whichColor = int(mod(float(i+j+k),2.0));if(whichColor == 1) {//奇数时为红色color = vec3(0.678,0.231,0.129);//红色}else {//偶数时为白色color = vec3(1.0,1.0,1.0);//白色}//最终颜色vec4 finalColor=vec4(color,0);
//根据散射光最终强度计算片元的最终颜色值fragColor=finalColor*vDiffuse;
}     

 

3、渲染结果示例

可见,引入散射光之后,光照的效果明显了很多,层次感也更明显。

 

最后,欢迎大家一起交流学习:微信:liaosy666 ; QQ:2209115372 。

 

 

这篇关于OpenGL ES 3. 光照-散射光的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977354

相关文章

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

OPENGL顶点数组, glDrawArrays,glDrawElements

顶点数组, glDrawArrays,glDrawElements  前两天接触OpenGL ES的时候发现里面没有了熟悉的glBegin(), glEnd(),glVertex3f()函数,取而代之的是glDrawArrays()。有问题问google,终于找到答案:因为OpenGL ES是针对嵌入式设备这些对性能要求比较高的平台,因此把很多影响性能的函数都去掉了,上述的几个函数都被移除了。接

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

OpenGL雾(fog)

使用fog步骤: 1. enable. glEnable(GL_FOG); // 使用雾气 2. 设置雾气颜色。glFogfv(GL_FOG_COLOR, fogColor); 3. 设置雾气的模式. glFogi(GL_FOG_MODE, GL_EXP); // 还可以选择GL_EXP2或GL_LINEAR 4. 设置雾的密度. glFogf(GL_FOG_DENSITY, 0

opengl纹理操作

我们在前一课中,学习了简单的像素操作,这意味着我们可以使用各种各样的BMP文件来丰富程序的显示效果,于是我们的OpenGL图形程序也不再像以前总是只显示几个多边形那样单调了。——但是这还不够。虽然我们可以将像素数据按照矩形进行缩小和放大,但是还不足以满足我们的要求。例如要将一幅世界地图绘制到一个球体表面,只使用glPixelZoom这样的函数来进行缩放显然是不够的。OpenGL纹理映射功能支持将

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点: #include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram;GLuint vao[numVAOs];GLuintcreateShaderProgram (){c

Elastic Stack--ES集群加密及Kibana的RBAC实战

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 学习B站博主教程笔记:  最新版适合自学的ElasticStack全套视频(Elk零基础入门到精通教程)Linux运维必备—ElasticSearch+Logstash+Kibana精讲_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1VMW3e6Ezk/?sp

期货赫兹量化-种群优化算法:进化策略,(μ,λ)-ES 和 (μ+λ)-ES

进化策略(Evolution Strategies, ES)是一种启发式算法,旨在模仿自然选择的过程来解决复杂的优化问题,尤其在没有显式解、或搜索空间巨大的情况下表现良好。基于自然界的进化原理,进化策略通过突变、选择等遗传算子迭代生成解,并最终寻求全局最优解。 进化策略通常基于两个核心机制:突变和选择。突变是对当前解进行随机扰动,而选择则用于保留适应度更高的个体。本文详细介绍了 (μ,λ)-ES