我有一個場景,包含幾個具有各自位置和旋轉的模型。給定法線,着色器將簡單的雙向照明應用於每個像素。在着色器中旋轉法線
這是我的頂點着色器。
#version 150
in vec3 position;
in vec3 normal;
in vec2 texcoord;
out vec3 f_normal;
out vec2 f_texcoord;
uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;
void main()
{
mat4 mvp = proj * view * model;
f_normal = normal;
f_texcoord = texcoord;
gl_Position = mvp * vec4(position, 1.0);
}
這裏是片段着色器。
#version 150
in vec3 f_normal;
in vec2 f_texcoord;
uniform sampler2D tex;
vec3 sun = vec3(0.5, 1.0, 1.5);
void main()
{
vec3 light = max(0.0, dot(normalize(f_normal), normalize(sun)));
gl_FragColor = texture(tex, f_texcoord) * vec4(light, 1.0);
}
對於沒有旋轉的物體,這可以正常工作。但對於旋轉模型,照明也是旋轉的,當然,情況並非如此。
原因是法線不旋轉。我已經嘗試過f_normal = model * normal;
,但這適用於法線旋轉和變形。
那麼在我將它們發送到片段着色器進行照明之前,如何旋轉頂點着色器中的法線?什麼是常用方法?
謝謝。你會建議我發送一個單獨的正常矩陣(僅包括模型旋轉但不縮放或轉換)到着色器嗎?我在某處看到了這種做法,並想知道是否比着色器中的模型矩陣重新提取旋轉更好。 – danijar
對不起,我的時間在編輯以前的評論時用完了......我認爲縮放是必要的,因爲它可以改變曲面到光源的距離。而且,由於您需要比例尺,因此需要使用上方3 x 3矩陣的逆轉置來校正比例。我確實將統一矩陣作爲統一發送給着色器,以便它只計算一次而不是每個頂點一次。儘管你可能需要一個數學庫來做這件事,因爲你的平臺可能不提供執行這些矩陣計算的函數。 – bwroga
這是有道理的。順便說一下,我使用GLM。 – danijar