作为测试,我创建了一个简单的四边形。以下是它的属性:
Vertex vertices[] =
{
// Positions Normals
{vec3(-1,-1, 0), vec3(-1,-1, 1)}, // v0
{vec3( 1,-1, 0), vec3( 1,-1, 1)}, // v1
{vec3(-1, 1, 0), vec3(-1, 1, 1)}, // v2
{vec3( 1, 1, 0), vec3( 1, 1, 1)}, // v3
};
我把它放在我的世界空间(0.0,0.0,-9.5)。然后我将我的点光位置设为(0.0,0.0,-8.0)。我的相机位于原点(0.0,0.0,0.0)。当我运行我的程序时,这按预期工作:
然而,当我用9个缩小的四边形替换这个四边形时,将它们全部放在Z上的-9.5(换句话说,它们在Z上都是相互平行的),我的漫射光有点奇怪
看起来角落显示的光线过多,打破了我们在常规四边形上看到的漂亮的漫反射圆圈。
这是我的着色器程序:
precision mediump int;
precision mediump float;
varying vec3 v_position;
varying vec3 v_normal;
#if defined(VERTEX)
uniform mat4 u_mvpMatrix;
uniform mat4 u_mvMatrix;
uniform mat3 u_normalMatrix;
attribute vec4 a_position;
attribute vec3 a_normal;
void main()
{
vec4 position = u_mvMatrix * a_position;
v_position = position.xyz / position.w;
v_normal = normalize(u_normalMatrix * a_normal);
gl_Position = u_mvpMatrix * a_position;
}
#endif // VERTEX
#if defined(FRAGMENT)
uniform vec3 u_pointLightPosition;
void main()"
{
vec3 viewDir = normalize(-v_position);
vec3 normal = normalize(v_normal);
vec3 lightPosition = u_pointLightPosition - v_position;
vec3 pointLightDir = normalize(lightPosition);
float distance = length(lightPosition);
float pointLightAttenuation = 1.0 / (1.0 + (0.25 * distance * distance));
float diffuseTerm = max(dot(pointLightDir, normal), 0.15);
gl_FragColor = vec4(diffuseTerm * pointLightAttenuation);
}
#endif // FRAGMENT
我的制服按照以下方式上传(我使用GLM):
const mat4 &view_matrix = getViewMatrix();
mat4 mv_matrix = view * getModelMatrix();
mat4 mvp_matrix = getProjectionMatrix() * mv_matrix;
mat3 normal_matrix = inverseTranspose(mat3(mv_matrix));
vec3 pointLightPos = vec3(view_matrix * vec4(getPointLightPos(), 1.0f));
glUniformMatrix4fv( mvpMatrixUniformID, 1, GL_FALSE, (GLfloat*)&mvp_matrix);
glUniformMatrix4fv( vpMatrixUniformID, 1, GL_FALSE, (GLfloat*)&mv_matrix);
glUniformMatrix3fv(normalMatrixUniformID, 1, GL_FALSE, (GLfloat*)&normal_matrix);
glUniform3f(pointLightPosUniformID, pointLightPos.x, pointLightPos.y, pointLightPos.z);
我做错了吗?
谢谢!
答案 0 :(得分:1)
如果没有对代码进行过多考虑,我认为一切正常。我通过快速搅拌器设置看到了非常相似的结果:
问题是法线的插值不会产生球形凸起。
最终成为这样的补丁(我简单地细分了一个光滑的阴影立方体)......
如果想要更多球形凸起,可以在片段着色器中隐式生成法线(例如,如here (bottom image)所述),使用法线贴图,或使用更多细分几何体,例如实际球体。