Opengl es 这个GLSL程序正确吗?我的立方体是纯黑的
我的phong fragment着色器没有对任何内容进行着色,只是将所有内容变为黑色。 这是我的片段着色器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 =
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)会有什么不同吗?