Opengl es 这个GLSL程序正确吗?我的立方体是纯黑的

Opengl es 这个GLSL程序正确吗?我的立方体是纯黑的,opengl-es,glsl,opengl-es-2.0,fragment-shader,Opengl Es,Glsl,Opengl Es 2.0,Fragment Shader,我的phong fragment着色器没有对任何内容进行着色,只是将所有内容变为黑色。 这是我的片段着色器 precision mediump float; varying vec3 vposition; varying vec3 vnormal; varying vec4 vcolor; varying vec3 veyePos; void main() { vec3 lightPos = vec3(0,0,0); vec4 s =

我的phong fragment着色器没有对任何内容进行着色,只是将所有内容变为黑色。 这是我的片段着色器

precision  mediump float;
varying    vec3    vposition;
varying    vec3    vnormal;
varying    vec4    vcolor;
varying    vec3    veyePos;

void main() {
  vec3 lightPos = vec3(0,0,0);
  vec4 s = normalize(vec4(lightPos,1) - vec4(veyePos,1));
  vec4 r = reflect(-s,vec4(vnormal, 1));
  vec4 v = normalize(-vec4(veyePos, 1));
  float spec = max( dot(v,r),0.0 );
  float diff = max(dot(vec4(vnormal,1),s),0.0);
  vec3 diffColor = diff * vec3(1,0,0);
  vec3 specColor = pow(spec,3.0) * vec3(1,1,1);
  vec3 ambientColor = vec3(0.1,0.1,0.1);
  gl_FragColor = vec4(diffColor + 0.5 * specColor + ambientColor, 1);
}
这是我的顶点着色器

uniform    mat4     uMVPMatrix;
uniform    mat4     uMVMatrix;
uniform    vec3     eyePos;
attribute  vec4     aPosition;
attribute  vec4     aColor;
attribute  vec4     aNormal;
varying    vec4     vcolor;
varying    vec3     vposition;
varying    vec3     vnormal;
varying    vec3     veyePos;

void main() {
  mat4 normalMat = transpose(inverse(uMVMatrix));
  vec4 vertPos4 = uMVMatrix * vec4(vec3(aPosition), 1.0);
  vposition = vec3(vertPos4) / vertPos4.w;
  vcolor = aColor;
  veyePos = eyePos;
  vnormal = vec3(uMVMatrix * vec4(vec3(aNormal),0.0));
  gl_Position = uMVPMatrix * aPosition;
}
MVMatrix是模型视图矩阵
MVP矩阵是模型视图投影矩阵

首先,您的照明方程不正确: 用于计算漫反射颜色的向量s应该是一个单位向量,该单位向量起源于朝向灯光的顶点(V位置)。是的 s=标准化(lightPos-V位置)

此外,lightPos应该在相机空间中给出,而不是在世界空间中给出(因此您应该将其乘以MV矩阵)

向量r是s在法线周围的反射,所以我不明白为什么取-s,法线也应该在非本源坐标中,所以它是: r=反射(s,V正常)

最后v是观察光线(乘以-1),所以它应该是向量,从v位置开始,向eyepos方向移动。 v=正常化(veyepos-v位置)

此外,在顶点着色器中,veyepos(假设它是摄影机的位置)不应变化(应为平面变量),因为您不希望对其进行插值

在顶点着色器中计算normalMat,但在摄影机空间中计算法线时忘记使用它。 normalMat也应该是mat3,因为它是 源自(0,0)的MV矩阵的3by3块

**为了提高效率,您应该在cpu上计算normalMat,并将其作为一致性传递给顶点着色器

uniform    mat4     uMVPMatrix;
uniform    mat4     uMVMatrix;
uniform    vec3     eyePos;
attribute  vec4     aPosition;
attribute  vec4     aColor;
attribute  vec4     aNormal;
varying    vec4     vcolor;
varying    vec3     vposition;
varying    vec3     vnormal;
varying    vec3     veyePos;

void main() {
  mat4 normalMat = transpose(inverse(uMVMatrix));
  vec4 vertPos4 = uMVMatrix * vec4(vec3(aPosition), 1.0);
  vposition = vec3(vertPos4) / vertPos4.w;
  vcolor = aColor;
  veyePos = eyePos;
  vnormal = vec3(uMVMatrix * vec4(vec3(aNormal),0.0));
  gl_Position = uMVPMatrix * aPosition;
}

希望这有帮助

不确定为什么它是黑色的,但所有的点产品都应该是3D的,而不是同质的4D。着色器编译和链接日志说了什么?将整数(
1
)传递到浮点类型(
vec4
)在ES2中是可疑的。如果成功编译了两个着色器,将这些vec4(,1)更改为vec4(,0)会有什么不同吗?