如何使用OpenGL在Android智能手机上渲染玻璃/冰材料

时间:2014-04-14 16:00:38

标签: android opengl-es textures

在没有光线追踪的Android设备上渲染玻璃/冰材料的最佳方法是什么?

我已经看过aplha +混合,但即使有适当的光照,结果只是看起来"塑料"。

我们可以做得更好吗?

2 个答案:

答案 0 :(得分:0)

您需要适当的反射和折射来绘制外观漂亮的透明材料。

你基本上需要环境纹理作为反射/折射的来源。我建议渲染没有透明材质的场景来制作环境源纹理。通常建议使用立方体映射。

访问此处,了解如何实现反射和折射。

答案 1 :(得分:0)

要在Android(OpenGL ES 3.0)中创建简单的玻璃效果,可以使用:折射+光泽+透明度。

顶点着色器:

smallint

片段着色器:

#version 300 es
precision lowp float;
uniform mat4 u_mvpMatrix;
uniform mat4 u_mvMatrix;

in vec4 a_position; 
in vec3 a_normal;

out vec3 v_normal;
out lowp float SpecularIntensity;

out vec3 v_eyeDirectModel;

float getSpecularIntensity(vec4 position, vec3 a_normal, vec3 eyeDirectModel) {
    float shininess = 30.0;
    vec3 lightPosition = vec3(-20.0, 0.0, 0.0);
    // We ignore that N dot L could be negative (light coming from behind the surface)
    mediump vec3 LightDirModel = normalize(lightPosition - position.xyz);
    mediump vec3 halfVector = normalize(LightDirModel + eyeDirectModel);
    lowp float NdotH = max(dot(a_normal, halfVector), 0.0);
    return pow(NdotH, shininess);
}

void main() {
    v_normal = a_normal;
    vec4 eyePositionModel = u_mvMatrix * a_position;
    // Eye direction in model space
    vec3 eyeDirectModel = normalize(- eyePositionModel.xyz);
    // specular lighting
    SpecularIntensity = getSpecularIntensity(a_position, a_normal, eyeDirectModel);
    v_eyeDirectModel = eyeDirectModel;
    gl_Position = u_mvpMatrix * a_position;
}

结果:

enter image description here

enter image description here

该代码部分取自PVRShamanGUI。