VC++, OpenGL, SDL
我想知道是否有一种方法可以在单个几何体的四边形上实现更加平滑的着色。目前,我的点光源下着色看起来很平滑,但是沿着面的 [/]
对角线细分的强度上升。在顶点之间,光线基本上是不可见的。
当光线从左到右移动时会发生这种情况
当我将光源移动到表面上时,它会一直保持这种状态。在每个顶点处最亮,并在那里逐渐消失。
我是否需要增加细分才能实现更平滑、更径向的阴影?还是有其他方法可以解决这个问题?
以下是我使用的着色器:
vert
varying vec3 vertex_light_position;
varying vec3 vertex_normal;
void main()
{
vertex_normal = normalize(gl_NormalMatrix * gl_Normal);
vertex_light_position = normalize(gl_LightSource[0].position.xyz);
gl_FrontColor = gl_Color;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
frag
varying vec3 vertex_light_position;
varying vec3 vertex_normal;
void main()
{
float diffuse_value = max(dot(vertex_normal, vertex_light_position), 0.0);
gl_FragColor = gl_Color * diffuse_value;
}
如果有人想知道我的几何形状:
glBegin(GL_QUADS);
glNormal3f(0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(pos_x, pos_y - size_y, depth);
glTexCoord2f(1.0f, 1.0f); glVertex3f(pos_x + size_x, pos_y - size_y, depth);
glTexCoord2f(1.0f, 0.0f); glVertex3f(pos_x + size_x, pos_y, depth);
glTexCoord2f(0.0f, 0.0f); glVertex3f(pos_x, pos_y, depth);
glEnd();
gl_FragColor = vec4(vertex_normal, 1.0);
。调试着色器的最佳方法是将值编写为颜色,并查看您得到的结果是否合理。 - Nicol Bolas