学习OpenGL ES for Android(十一)— 材质

现实世界的物体各种各样,不同物体会对光产生不同的反应。陶瓷,铁片之类的物体会比墙壁,木柜的反射更强。想要模拟现实世界的光照效果就要了解物体对光线的反应效果。在我们的着色器代码中,我们定义一个结构体:Material,来表示材质。在上一节中,我们指定了一个物体和光的颜色,以及结合环境光和镜面强度分量,来定义物体的视觉输出。当描述一个物体的时候,我们可以用这三个分量来定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting),再加上反光度(Shininess)来表示物体对光线的反应。

// 定义材料结构体
struct Material {
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    float shininess;
};
uniform Material material;

我们就可以自定义这些值来显示不同的效果了,当然计算时也不是用光线颜色了,而是使用我们传入的值,例如,

// 环境光照
vec3 ambient = lightColor * material.ambient;

传入我们定义的值的方法,

int materialAmbientPosHandle = GLES20.glGetUniformLocation(shaderProgram, "material.ambient");
GLES20.glUniform3f(materialAmbientPosHandle, 1.0f, 0.5f, 0.31f);

我们看到查找索引时的参数是:对象名.属性名。

下一步我们定义光源。光源的颜色不同照射到物体上,物体反射的光线也是不同的;物体反射的光线强弱也和光源的强弱有关。这里我们同样定义一个光源的结构体:Light。光源我们同样定义三个:光源的环境光强度,光源的漫反射强度和镜面光,再加上光源位置。代码如下,

// 定义光源结构体
struct Light {
    vec3 position;

    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};

这样计算时不再使用光源的颜色而使用光源的属性,

    // 环境光照
    vec3 ambient = material.ambient * light.ambient;

最后结合起来的效果就是光源颜色在不断变化,物体的颜色也在不断变化。

此章参考文档https://learnopengl-cn.github.io/02%20Lighting/03%20Materials/,内容不难懂,主要学习动态传入参数,不再贴代码。源码地址https://github.com/jklwan/OpenGLProject/blob/master/sample/src/main/java/com/chends/opengl/renderer/light/MaterialsRenderer.java

发布了53 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/jklwan/article/details/103689275