视差校正了Opengl中的立方体贴图

Parallax Corrected Cubemaps in Opengl?

本文关键字:立方 立方体 体贴 Opengl 视差      更新时间:2023-10-16

我一直在尝试在 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在另一个空间。而且你无法真正对不同坐标系中的向量执行合理的操作。

您需要确保 NormalPositionCameraPosition 都在同一个空间中。如果你想让这个空间成为世界空间,那么你需要把Normal转换成世界空间。在一般情况下,这需要计算模型到世界矩阵的逆/转置。