视差校正了Opengl中的立方体贴图
Parallax Corrected Cubemaps in Opengl?
我一直在尝试在 OpenGL 中内爆视差校正本地立方体贴图一段时间了,但我还没有真正设法到达任何地方,有人知道从哪里开始吗?
这是我当前的着色器代码:
片段:
#version 330
in vec2 TexCoord;
in vec3 Normal;
in vec3 Position;
in vec3 Color;
out vec4 color;
uniform samplerCube CubeMap;
uniform vec3 CameraPosition;
void main() {
vec4 OutColor = vec4(Color,1.0);
vec3 normal = normalize(Normal);
vec3 view = normalize(Position-CameraPosition);
vec3 ReflectionVector = reflect(view,normal);
vec4 ReflectionColor = texture(CubeMap,ReflectionVector);
OutColor = mix(OutColor,ReflectionColor,0.5);
color = OutColor;
}
顶点:
#version 330
layout (location = 0) in vec3 position;
layout (location = 2) in vec3 normal;
layout (location = 1) in vec2 texCoord;
layout (location = 3) in vec3 color;
out vec2 TexCoord;
out vec3 Normal;
out vec3 Position;
out vec3 Color;
uniform mat4 ModelMatrix;
uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;
void main()
{
gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(position, 1.0f);
TexCoord=texCoord;
Normal = normal;
Position = vec4(ModelMatrix * vec4(position,1.0)).xyz;
Color = color;
}
Position = vec4(ModelMatrix * vec4(position,1.0)).xyz;
这会将Position
输出变量放入世界空间。假设制服CameraPosition
也在世界空间中,那么:
vec3 view = normalize(Position-CameraPosition);
view
也将出现在世界空间。
但是,Normal
直接来自顶点属性。因此,除非每次旋转对象时都更新每个顶点的Normal
值,否则该值可能位于模型空间中。因此:
vec3 ReflectionVector = reflect(view,normal);
这种说法是不连贯的。 view
在一个空间,而normal
在另一个空间。而且你无法真正对不同坐标系中的向量执行合理的操作。
您需要确保 Normal
、 Position
和 CameraPosition
都在同一个空间中。如果你想让这个空间成为世界空间,那么你需要把Normal
转换成世界空间。在一般情况下,这需要计算模型到世界矩阵的逆/转置。
相关文章:
- 如何使用 std::累积在 C++ 中计算总和立方体
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 如何使用采样器立方体作为数组
- OpenGL,为什么这不是一个立方体?
- 在具有 MPI 的超立方体中广播
- Opengl 和 c++ 绘制多个立方体
- C++没有标准功能的立方体根查找器
- 现代OpenGL:如何获得立方体的矢量位置
- 使用此网格函数的立方体的正确顶点和索引是什么
- 为什么在GLFW窗口中没有用这个代码在我的屏幕上绘制立方体
- OpenGL中立方体的位置
- GL_INVALID_VALUE错误生成.纹理尺寸无效.在立方体贴图纹理 427*240*6 上
- 在犰狳立方体中添加一列 1 的有效方法
- 使用犰狳时无法加载犰狳立方体<uword>
- 将粒子投影到立方体的表面
- 犰狳:将立方体子视图(管)转换为矢量
- Armadillo是否支持布尔和8位型矩阵和立方体
- 有没有像犰狳中的稀疏立方体或某种使用稀疏矩阵作为立方体切片的方法?
- Qtopengl,为什么不能用不同的vbo画两个立方体
- OpenGL - 深度缓冲区在渲染半透明立方体时剪切掉不应该剪切的面