【问题标题】:Lighting on OpenGL ES sphere not smoothOpenGL ES 球体上的照明不平滑
【发布时间】: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设置的值是多少?

标签: android opengl-es


【解决方案1】:

问题在于您使用的颜色值范围。 OpenGL 使用 [0.0, 1.0] 范围内的颜色分量值进行操作。但是您在 Java 代码中指定 [0, 255] 范围内的颜色。

您有两种选择来解决此问题:

  • 将您从 Color 类中获得的颜色值除以 255.0f。
  • 使用GL_UNSIGNED_BYTE 类型指定颜色。为此,请将值存储在元素类型为 byte 的数组/缓冲区中,将这些值存储在 VBO 中,然后设置顶点属性:

    glVertexAttribPointer(attrLoc, 3, GL_UNSIGNED_BYTE, GL_TRUE, stride, 0);
    

    注意第四个参数的值。虽然GL_FLOAT 属性无关紧要,但在这种情况下使用GL_TRUE 至关重要,因为需要对字节值进行规范化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多