学习OpenGL ES for Android(十六)— 模型材料

上一章我们简单学习了.obj模型文件的读取和使用,这章我们学习材料文件(.mtl)的读取和使用,.mtl文件是和.obj文件息息相关的。材料文件可能定义一种或多种材料,我们找一个简单带材料的模型:https://free3d.com/3d-model/-x96-slider-doorblack-v1--87538.html,打开其中的mtl看下文件格式,同样我们参考https://en.m.wikipedia.org/wiki/Wavefront_.obj_file来分析文件内容,

# 与obj文件同理,#开头是注释可以忽略
newmtl Ebony_mat   定义一个名为Ebony_mat的材料
	Ns 26.0000  反光度 范围:0到1000 前面学习的Shininess
	Ni 1.5000  折射值 可在0.001到10之间进行取值。若取值为1.0,光在通过物体的时候不发生弯曲。玻璃的折射率为1.5,这个我们没学习过,暂时忽略
	d 1.0000  溶解(透明) 1.0是默认值,表示完全不透明,0.0表示完全透明
	Tr 0.0000  与d值的关系 Tr = 1-d
	Tf 1.0000 1.0000 1.0000  滤光透射率
	illum 2 照明模式 2表示高亮显示
	Ka 0.1176 0.1176 0.1176  环境光照颜色(ambient color)
	Kd 0.1176 0.1176 0.1176  漫反射颜色(diffuse color)
	Ks 0.2250 0.2250 0.2250  镜面光颜色(specular color)
	Ke 0.0000 0.0000 0.0000  发射 暂时忽略

在obj文件中会使用mtllib来定义使用哪个mtl文件,用usemtl来定义使用哪个材料,我们需要保存材料的信息。我们尝试解析我们下载的obj和mtl文件,扩展上一章写的解析模型文件的工具类,添加解析mtl的工具类(方便使用我们可以重命名模型和材料名,代码地址https://github.com/jklwan/OpenGLProject/blob/master/sample/src/main/java/com/chends/opengl/utils/model/LoadMtlUtil.java)。解析材料还是比较简单的,只需要读取到材料的属性即可。我们还需要修改我们的着色器代码,使用我们前面的材质的那一章的代码,给材质结构体加上三种颜色属性,再加上alpha属性,

// 定义材质结构体
struct Material {
    vec3 ambient;
    vec3 ambientColor;

    vec3 diffuse;
    vec3 diffuseColor;

    vec3 specular;
    vec3 specularColor;

    float shininess;
    float alpha;
};
uniform Material material;
……
void main() {
    ……
    // 结果
    vec3 result = (ambient* material.ambientColor + diffuse* material.diffuseColor + specular * material.specularColor);
    gl_FragColor = vec4(result, material.alpha);
}

我们这个模型是一扇门,效果图如下,

源码地址https://github.com/jklwan/OpenGLProject/blob/master/sample/src/main/java/com/chends/opengl/renderer/model/LoadModelMaterialRenderer.java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值