GLSL

2011-12-16 43 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 

請注意,所有的向量應該在相同的空間(相機,世界,物體)