GLSL

2011-12-16 44 views
4

VC++,OpenGL中,SDLGLSL

我想知道如果有一种方法来实现跨越几何结构的单一四平滑阴影。现在,使用我的点光源,阴影看起来很平滑,但是,强度沿着脸部的对角线细分上升。光线在顶点之间基本上是不可见的。

enter image description here

enter image description here

enter image description here

这是从光从左向右移动

正如我在表面上移动的光会发生什么,它这样做一致。在每个顶点获得最亮并从那里消失。

我是否被迫上了细分,以实现更平滑,更径向的阴影?或者有没有一种方法呢?

下面是我使用的着色器:

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; 
} 

断枝

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(); 
+0

该图像非常小。你能放大一张大图吗? – 2011-12-16 08:30:08

回答

5

有几件事I看作是可能的问题。

除非我误会,否则您使用normalize(gl_LightSource[0].position.xyz);来计算光矢量,但它仅基于光的位置,而不是基于您操作的顶点。这意味着每个顶点的值将会相同,并且只会根据当前的模型视图矩阵和灯光位置进行更改。我认为通过做像normalize(glLightSource[0].position.xyz - (gl_ModelViewMatrix * gl_Vertex).xyz)这样的计算光矢量将会更接近你想要的。其次,你应该在片段着色器以及顶点着色器中归一化你的向量,因为两个单位向量的插值不能保证是一个单位向量本身。

1

我被迫向上细分,以实现更光滑,更径向 阴影?或者有没有一种方法呢?

不,你可以随心所欲地做任何事情。您需要更改的唯一代码是片段着色器。尝试玩它,看看你是否得到了更好的结果。

例如,你可以这样做:

diffuse_value = pow(diffuse_value, 3.0); 

的解释here

2

我认为这个问题是光矢量...

我建议使用:

vec3 light_vector = normalize(gl_LightSource[0].position.xyz - vertex_pos) 

vertex_pos可以用下式计算:

vertex_pos = gl_ModelViewMatrix * gl_Vertex 

请注意,所有的向量应该在相同的空间(相机,世界,物体)