【发布时间】:2014-11-28 19:18:28
【问题描述】:
在 Android 的 OpenGL ES 2.0 中,我正在绘制一个球体。球体在屏幕上显示为一个圆圈,所以我需要添加照明。当我添加光照时,它并没有像现实生活中那样平滑,而是明暗之间的细线,如下所示:
但是,我希望它看起来像这样,阴影更加平滑和混合:
这是我的顶点着色器代码:
uniform mat4 u_Matrix;
uniform vec3 u_VectorToLight;
attribute vec4 a_Position;
attribute vec3 a_Color;
attribute vec3 a_Normal;
varying vec3 v_Color;
void main() {
v_Color = a_Color;
vec3 scaledNormal = a_Normal;
scaledNormal = normalize(scaledNormal);
float diffuse = max(dot(scaledNormal, u_VectorToLight), 0.0);
v_Color *= diffuse;
float ambient = 0.1;
v_Color += ambient;
gl_Position = u_Matrix * a_Position;
}
还有我的片段着色器:
precision mediump float;
varying vec3 v_Color;
void main() {
gl_FragColor = vec4(v_Color, 1.0);
}
法线的计算方法是获取从球体中心到球体上点的向量,然后对其进行归一化(长度为 1)
这是我设置颜色的方法:
vertices[offset++] = Color.red(color);
vertices[offset++] = Color.green(color);
vertices[offset++] = Color.blue(color);
其中颜色为 0xffea00。
【问题讨论】:
-
@MorrisonChang - 但即使在那个问题中,当球体不光滑时,光线会逐渐从最亮的点变为最暗的点,而不仅仅是在中间“卡住”。跨度>
-
您能否也发布您的片段着色器和计算法线的代码的 sn-p?
-
当然 - 我更新了我的问题。
-
你为
u_VectorToLight设置的值是多少?