OpenGL定向灯光着色器

我想使用OpenGL和GLSL为我的场景添加定向光源。问题是,理论上正确的做法有错误的结果。OpenGL定向灯光着色器

在顶点着色器我执行以下操作:

的光的方向在世界坐标中给出并且使用viewMatrix到照相机坐标变换。顶点的法线使用标准矩阵转换为相机坐标。

void main() { 

vary_textureCoord = attribute_textureCoord;

vary_normal = mat3(normalMatrix) * attribute_normal;

vary_directionalLight_direction = viewMatrix * vec4(lightDir, 1.0);

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(attribute_position, 1.0);

}

因此,这两个向量都在相机坐标中并传递给片段着色器。片段着色器使用法线和光线方向计算光强度。

void main() { 

vec3 normalizedNormal = normalize(vary_normal);

vec4 color = texture(tex, vary_textureCoord);

float directionalLightIntensity = max(0.0, dot(normalizedNormal, normalize(-vary_directionalLight_direction.xyz)));

out_color = color * directionalLightIntensity;

}

该着色器导致光线不是静态的,而是与相机一起移动。改为使用此行代替顶点着色器:

vary_directionalLight_direction = transpose(inverse(viewMatrix)) * vec4(lightDir, 1.0); 

具有期望的结果。 那么我在做什么错误或我在哪里产生误解?

这里充分着色器代码:

Vertexshader:

# version 330 

layout(location = 0) in vec3 attribute_position;

layout(location = 2) in vec2 attribute_textureCoord;

layout(location = 3) in vec3 attribute_normal;

uniform mat4 projectionMatrix;

uniform mat4 viewMatrix;

uniform mat4 modelMatrix;

uniform mat4 normalMatrix;

uniform vec3 lightDir;

out vec2 vary_textureCoord;

out vec3 vary_normal;

out vec4 vary_directionalLight_direction;

void main() {

vary_textureCoord = attribute_textureCoord;

vary_normal = mat3(normalMatrix) * attribute_normal;

vary_directionalLight_direction = viewMatrix * vec4(lightDir, 1.0);

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(attribute_position, 1.0);

}

Fragmentshader:

# version 330 

in vec2 vary_textureCoord;

in vec3 vary_normal;

in vec4 vary_directionalLight_direction;

uniform sampler2D tex;

out vec4 out_color;

void main() {

vec3 normalizedNormal = normalize(vary_normal);

vec4 color = texture(tex, vary_textureCoord);

float directionalLightIntensity = max(0.0, dot(normalizedNormal, normalize(-vary_directionalLight_direction.xyz)));

out_color = color * directionalLightIntensity;

}

回答:

的转换矩阵是这样的:

(X-axis.x, X-axis.y, X-axis.z, 0) 

(Y-axis.x, Y-axis.y, Y-axis.z, 0)

(Z-axis.x, Z-axis.y, Z-axis.z, 0)

(trans.x, trans.y, trans.z, 1)

如果你想牛逼o转换某个位置,然后必须将完整转换矩阵应用于该位置。

mat4 viewMatrix; 

vec3 pos;

vec4 viewPos = viewMatrix * vec4(pos, 1.0);

这将视图的方向和位置应用到位置pos

但是一个方向没有起源。一个方向只有一个方向。这意味着,如果您想要转换方向矢量,那么您必须将其乘以左上方的3 * 3部分4 * 4 viewMatrix

vary_directionalLight_direction = vec4(mat3(viewMatrix) * lightDir, 1.0); 

以上是 OpenGL定向灯光着色器 的全部内容, 来源链接: utcz.com/qa/264971.html

回到顶部