opengl - GLSL 中的平面反射
问题描述
我想在 GLSL 中实现一个简单的反射着色器。
我目前拥有的代码来自以下教程
顶点着色器:
#version 330 core
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec3 aNormal;
out vec3 FragPos;
out vec3 Normal;
uniform mat4 MVP;
void main() {
FragPos = vec3(mat4(1.0f) * vec4(aPos, 1.0));
Normal = mat3(transpose(inverse( mat4(1.0f)))) * aNormal;
gl_Position = MVP * vec4(aPos, 1.0);
};
片段着色器:
#shader fragment
#version 330 core
out vec4 FragColor;
in vec3 Normal;
in vec3 FragPos;
uniform vec3 viewPos;
void main() {
vec3 lightColor = vec3(1.0f, 1.0f, 1.0f);
vec3 lightPos = vec3(1.2f, 1.0f, 2.0f);
vec3 objectColor = vec3(1.0f, 0.5f, 0.31f);
// ambient
float ambientStrength = 0.1;
vec3 ambient = ambientStrength * lightColor;
// diffuse
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
// specular
float specularStrength = 0.5;
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
vec3 specular = specularStrength * spec * lightColor;
vec3 result = (ambient + diffuse + specular) * objectColor;
FragColor = vec4(result, 1.0);
};
我不确定这是否是正确的方法,但我最初的想法是使用以下代码在片段着色器中获得反射:
vec3 I = normalize(FragPos - viewPos);
vec3 R = reflect(I, normalize(Normal));
这将从相机视角给出归一化的反射矢量,但我不知道如何将其与 FragColor 结合以获得合适的输出。
解决方案
推荐阅读
- ios - 尽管插入了耳机,但在 iPad 上找不到 AVAudioSessionPortHeadsetMic
- node.js - 我的 node_modules 中的 'eslint' 和 '@eslint' 有什么区别?
- mysql - 比较分组查询中上一行的日期
- javascript - 如何在Javascript中将数字数组作为输入?
- bash - 当超过 512 个字符时,bash heredoc 挂起
- c++ - 将迭代器列为无序映射键
- three.js - 三个js:如何混合两个场景(一个有bloom)
- javascript - Javascript / Node.js 导入 html 文件并将参数传递给 html 文件
- c - C(POSIX)中的睡眠功能破坏了我的程序
- docker - 最佳实践 Net Core Api 和 Docker