簡體   English   中英

GLSL每像素點光陰影

[英]GLSL per pixel point light shading

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

我認為有幾件事可能是問題。

除非我弄錯了,你使用normalize(gl_LightSource[0].position.xyz); 計算光矢量,但這僅僅基於光的位置,而不是基於您正在操作的頂點。 這意味着每個頂點的值都相同,並且只會根據當前的模型視圖矩陣和燈光位置進行更改。 我認為通過像normalize(glLightSource[0].position.xyz - (gl_ModelViewMatrix * gl_Vertex).xyz)這樣的事情計算光矢量會更接近你想要的。

其次,你應該在片段着色器和頂點着色器中規范化矢量,因為兩個單位矢量的插值不能保證是單位矢量本身。

我認為問題在於光矢量......

我建議使用:

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

vertex_pos可以使用以下公式計算:

vertex_pos = gl_ModelViewMatrix * gl_Vertex

請注意,所有向量應位於相同的空間(攝像機,世界,對象)

我是否被迫進行細分以獲得更平滑,更加徑向的陰影? 或者有一個方法嗎?

不,你可以自由地做任何你想做的事。 您需要更改的唯一代碼是片段着色器。 嘗試使用它,看看你是否得到了更好的結果。

例如,您可以這樣做:

diffuse_value = pow(diffuse_value, 3.0);

為解釋在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM