如何调整我的GLSL代码以添加其他光源?

问题描述

在下面的代码中,我试图为phong实现一个片段着色器程序:

// Inputs from application.
// Generally,"in" like the position and normal vectors for things that change frequently,// and "uniform" for things that change less often (think scene versus vertices).  

in vec3 position_cam,normal_cam;
uniform mat4 view_mat;

// This light setup would usually be passed in from the application.

vec3 light_position_world  = vec3 (10.0,25.0,10.0);
vec3 Ls = vec3 (1.0,1.0,1.0);    // neutral,full specular color of light
vec3 Ld = vec3 (0.8,0.8,0.8);    // neutral,lessened diffuse light color of light
vec3 La = vec3 (0.12,0.12,0.12); // ambient color of light - just a bit more than dk gray    bg

// Surface reflectance properties for phong model below.

vec3 Ks = vec3 (1.0,1.0);    // fully reflect specular light
vec3 Kd = vec3 (0.32,0.18,0.5);  // purple diffuse surface reflectance
vec3 Ka = vec3 (1.0,1.0);    // fully reflect ambient light

float specular_exponent = 400.0;   // specular 'power' -- controls "roll-off"

// Shader programs can also designate outputs.
out vec4 fragment_color;           // color of surface to draw in this case

void main () 
{

    fragment_color = vec4 (Kd,1.0);

}

我有两个问题:

  1. 如何在代码添加2个其他定向光源?我是否只是在灯光设置中添加更多vec3 Ld变量,还是必须做其他事情?
  2. 如何将phong指数设置得足够高以产生清晰明亮的高光?

解决方法

在glsl中,您可以使用数组和结构。定义光源阵列。参见Array constructorsStruct constructors

const int no_of_lights = 2;

struct TLightSource
{
   vec3 lightPos;
   vec3 Ls; 
   vec3 Ld;
   vec3 La;
   float shininess;
};

TLightSource lightSources[no_of_lights] = TLightSource[no_of_lights](
    TLightSource(vec3(10.0,25.0,10.0),vec3(1.0,1.0,1.0),vec3(0.8,0.8,0.8),vec3(0.12,0.12,0.12),TLightSource(vec3(-10.0,0.0,0.0),10.0)
);

用户使用for循环遍历光源并汇总环境光,漫反射光和镜面光(例如Phong reflection model)的光色:

void main()
{
    vec3 normalInterp;
    vec3 vertPos;

    vec3 normal = normalize(normalInterp);
    
    vec3 color = vec3(0.0);
    for (int i=0; i < no_of_lights; i++)
    {
        color += Ka * lightSources[i].La;

        vec3 lightDir = normalize(lightSources[i].lightPos - vertPos);
        float lambertian = max(dot(lightDir,normal),0.0); 
        color += lambertian * lightSources[i].Ld;

        if (lambertian > 0.0) 
        {   
            vec3 viewDir = normalize(-vertPos);
            vec3 reflectDir = reflect(-lightDir,normal);
            float RdotV = max(dot(reflectDir,viewDir),0.0); 
            float specular = pow(RdotV,lightSources[i].shininess/4.0);
            color += specular * lightSources[i].Ls;
        }
    }

    frag_color = vec4(color,1.0);
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...