gre*_*rep 4 c++ opengl shader glsl
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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
我的几何形状以防万一有人在想:
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();
Run Code Online (Sandbox Code Playgroud)
我认为有几件事可能是问题.
除非我弄错了,否则你normalize(gl_LightSource[0].position.xyz);
用来计算光矢量,但这完全取决于光的位置,而不是你操作的顶点.这意味着每个顶点的值都相同,并且只会根据当前的模型视图矩阵和灯光位置进行更改.我认为通过做类似的事情计算光矢量normalize(glLightSource[0].position.xyz - (gl_ModelViewMatrix * gl_Vertex).xyz)
会更接近你想要的.
其次,你应该在片段着色器和顶点着色器中规范化矢量,因为两个单位矢量的插值不能保证是单位矢量本身.