程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> glsl-openGL實現多光源光照效果

glsl-openGL實現多光源光照效果

編輯:編程解疑
openGL實現多光源光照效果

最近正在學openGL,用的是learnOpenGL,一個網址,學到Multiple lights多光源這一章的時候遇到了問題。我想實現的是一個平行光(無光源),4個點光源,一個聚光燈源對十個箱子的光照效果。但是當我在著色器源碼中將聚光燈的光照效果注釋掉以後,物體呈現了黑色,也就是說平行光以及點光源對物體的光照效果沒有實現。我反復看了代碼,不知道錯在哪裡。以下是我的物體的著色器源碼:

#version 330 core
//物體結構體
struct Material
{
sampler2D texture0;
sampler2D texture1;
sampler2D texture2;

float shininess;
};

//聚光燈結構體
struct FlashLight
{
vec3 ambient; // 物體ambient顏色要素的因素因子
vec3 diffuse; // 光的顏色,一般設置為白色
vec3 specular; // 物體specular顏色要素的因素因子
vec3 position; // 點的位置
vec3 directional; // 光源的方向
float cutoff; // 內余弦
float outcutoff; // 外余弦
float constant; // 光強度衰減方程式常數項
float linear; // 光強度衰減方程式一次項
float quadratic; // 光強度衰減方程式二次項
};

//點光源結構體
struct PointLight
{
vec3 ambient; // 物體ambient顏色要素的因素因子
vec3 diffuse; // 光的顏色,一般設置為白色
vec3 specular; // 物體specular顏色要素的因素因子
vec3 position; // 點的位置
float constant; //光強度衰減方程式常數項
float linear; //光強度衰減方程式一次項
float quadratic; //光強度衰減方程式二次項
};

//平行光源結構體
struct DirectLight
{
vec3 ambient; // 物體ambient顏色要素的因素因子
vec3 diffuse; // 光的顏色,一般設置為白色
vec3 specular; // 物體specular顏色要素的因素因子
vec3 directional; //光的方向
};

in vec3 Normal;
in vec3 fragPos;
in vec2 TexCoord;

out vec4 color;

uniform Material material;
//有四個點光源
uniform PointLight pointlight[4];
uniform FlashLight flashlight;
uniform DirectLight directlight;
uniform vec3 cameraPos;

//聲明各個光源的光照函數
vec3 calcFlashLight(FlashLight light,vec3 fragPos,vec3 normal,vec3 viewDir);
vec3 calcPointLight(PointLight light,vec3 fragPos,vec3 normal,vec3 viewDir);
vec3 calcDirectLight(DirectLight light,vec3 normal,vec3 viewDir);

void main()
{
vec3 normal=normalize(Normal);

vec3 viewDir=normalize(cameraPos-fragPos);

vec3 result =calcDirectLight(directlight,normal,viewDir);
for(int i=0;i<4;i++)
    result +=calcPointLight(pointlight[i],fragPos,normal,viewDir);
result +=calcFlashLight(flashlight,fragPos,normal,viewDir);
color=vec4(result,1.0f);   

}

//聚光燈
vec3 calcFlashLight(FlashLight light,vec3 fragPos,vec3 normal,vec3 viewDir)
{
float distance=length(light.position-fragPos);
float attenuation=1.0f/(light.constant+light.linear*distance+light.quadratic*(distance*distance));
//ambient
vec3 ambient=light.ambient*vec3(texture(material.texture0,TexCoord));
//diffuse
vec3 lightDir=normalize(light.position-fragPos);
float diff=max(dot(lightDir,normal),0.0);
vec3 diffuse=light.diffuse*diff*vec3(texture(material.texture0,TexCoord));

//specular
vec3 refletDir=reflect(-lightDir,normal);
float spec=pow(max(dot(viewDir,refletDir),0.0),material.shininess);
vec3 specular=light.specular*spec*vec3(texture(material.texture1,TexCoord));
//attenuation
ambient *=attenuation; //由於我們不希望在多光源下,ambient會累積增加,所以我們這邊進行一個衰減
diffuse *=attenuation;
specular *=attenuation;
//cutoff
float theta=dot(normalize(-light.directional),lightDir);
float intensity=clamp((theta-light.outcutoff)/(light.cutoff-light.outcutoff),0.0,1.0); //我們不希望強度值在0與1之外
diffuse *=intensity;
specular *=intensity;

return (ambient+diffuse+specular);

}

//點光源
vec3 calcPointLight(PointLight light,vec3 fragPos,vec3 normal,vec3 viewDir)
{
float distance=length(light.position-fragPos);
float attenuation=1.0f/(light.constant+light.linear*distance+light.quadratic*(distance*distance));
//ambient
vec3 ambient=light.ambient*vec3(texture(material.texture0,TexCoord));
//diffuse
vec3 lightDir=normalize(light.position-fragPos);
float diff=max(dot(lightDir,normal),0.0);
vec3 diffuse=light.diffuse*diff*vec3(texture(material.texture0,TexCoord));

//specular
vec3 refletDir=reflect(-lightDir,normal);
float strength=pow(max(dot(viewDir,refletDir),0.0),material.shininess);
vec3 specular=light.specular*strength*vec3(texture(material.texture1,TexCoord));
//attenuation
ambient *=attenuation; //由於我們不希望在多光源下,ambient會累積增加,所以我們這邊進行一個衰減
diffuse *=attenuation;
specular *=attenuation;

return (ambient+diffuse+specular);

}

//平行光
vec3 calcDirectLight(DirectLight light,vec3 normal,vec3 viewDir)
{
//ambient
vec3 ambient=light.ambient*vec3(texture(material.texture0,TexCoord));
//diffuse
vec3 directional=normalize(-light.directional);
float diff=max(dot(directional,normal),0.0);
vec3 diffuse=light.diffuse*diff*vec3(texture(material.texture0,TexCoord));
//specular
vec3 refletDir=reflect(-directional,normal);
float spec=pow(max(dot(viewDir,refletDir),0.0),material.shininess);
vec3 specular=light.specular*spec*vec3(texture(material.texture1,TexCoord));

return (ambient+diffuse+specular);

}

我第一次發帖,沒有C幣也,sorry. 等我有了再給你們。 VS中的代碼我沒貼,不知道貼哪段,謝謝過來參觀以及幫我解答的人。

最佳回答:


材料屬性有沒有設置?

sinat_35684746
qq_35553864
qq_35553864
sinat_35684746
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved