OpenGL ES 3. Light - espalhamento de luz

Olá a todos, o próximo irá introduzir OpenGL ES 3. Light - de espalhamento de luz.

OpenGL ES modelo 3.0 iluminação utilizada no mundo real em relação a um muito simplificada, a luz é dividida em três tipos de elementos constitutivos (também referido como 3), incluindo os canais de luz ambiente, a luz de luz especular e dispersos.

1, a luz dispersa introduzido

       Há apenas um anel de efeito de cena de luz ambiente é baixa, não há nenhuma sensação de profundidade. Em seguida irá ser descrito mais realistas efeitos de iluminação muito melhor - a luz dispersa (a difusa), que se refere à luz, como mostrado abaixo da superfície do objecto é uniformemente reflectida pela completa de 360 ​​°.


        luz difusa representa a superfície específica do objecto no mundo real é irradiada com luz, a luz reflectida de modo substancialmente uniforme em todas as direcções (também referidos como "reflexão difusa"), a figura ilustra bem o problema.
        Embora a dispersão da luz reflectida é uniforme em todas as direcções, mas está intimamente relacionado com a intensidade da intensidade de luz reflectida dispersa de luz incidente e o ângulo de incidência. Assim, quando a posição da fonte de luz muda, o efeito de luz dispersa pode variar significativamente. É principalmente brilha mais que a luz incidente, quando irradiado na vertical para a superfície do objecto, a fórmula especifica é como se segue.
        Resultado = irradiação de luz material de reflectância difusa intensidade da luz dispersa * * max (cos (ângulo de incidência), 0).

 

2, na base da "esfera desenhada" sobre a luz ambiente render        

#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, os resultados de renderização

Visível, após a introdução da luz espalhada, um monte de efeito óbvio da luz, camadas mais evidente.

 

Finalmente, congratulamo-nos com a troca de aprendizagem em conjunto: micro carta: liaosy666; QQ: 2209115372  .

 

 

Publicado 36 artigos originais · ganhou elogios 46 · vê 20000 +

Acho que você gosta

Origin blog.csdn.net/u010281924/article/details/105330801
Recomendado
Clasificación