OpenGL ES 3. Light - Light Scattering

Bonjour à tous, le prochain présentera OpenGL ES 3. Light - lumière de diffusion.

modèle d'éclairage OpenGL ES 3.0 utilisé dans le monde réel par rapport à une très simplifiée, la lumière est divisée en trois types d'éléments constitutifs (également désigné par 3 canaux), y compris la lumière ambiante, la lumière diffusée et la lumière spéculaire.

1, introduit la lumière diffusée

       Il y a seulement un anneau d'effet de la scène de la lumière ambiante est faible, il n'y a aucun sens de la profondeur. Suivant va être décrit un autre des effets d'éclairage réalistes beaucoup mieux - la lumière diffusée (la Diffuse), qui se réfère à la lumière, comme indiqué ci-dessous à partir de la surface de l'objet est uniformément réfléchie par le 360 ​​°.


        La lumière diffusée représente la surface spécifique de l'objet dans le monde réel est irradié avec de la lumière, la lumière réfléchie de manière sensiblement uniforme dans toutes les directions (également dénommé « réflexion diffuse »), la figure illustre bien le problème.
        Bien que la diffusion de la lumière réfléchie est uniforme dans toutes les directions, mais est étroitement liée à l'intensité de la lumière réfléchie diffusée intensité de la lumière incidente et de l' angle d'incidence. Ainsi, lorsque la position de la source lumineuse change, l'effet de la lumière diffusée peut varier considérablement. Est principalement brille plus brillante que la lumière incidente lorsqu'elle est irradiée perpendiculairement à la surface de l' objet, la formule spécifique est le suivant.
        Résultat = irradier un matériau de réflexion diffuse la lumière diffusée intensité lumineuse * * max (cos (angle d'incidence), 0).

 

2, sur la base de la « sphère tracée » sur le rendu de la lumière ambiante        

#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);					//对法向量规格化
  //计算从表面点到光源位置的向量vp
  vec3 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, les résultats de rendu

Visible, après l'introduction de la lumière diffusée, beaucoup d'effet évident de la lumière, la stratification plus évidente.

 

Enfin, nous nous félicitons de l'échange d'apprendre ensemble: micro lettre: liaosy666; QQ: 2209115372  .

 

 

Publié 36 articles originaux · louange gagné 46 · vues 20000 +

Je suppose que tu aimes

Origine blog.csdn.net/u010281924/article/details/105330801
conseillé
Classement