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

时间:2017-05-15 11:01:18

标签: c++ opengl glsl

我一直试图在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;
}

1 个答案:

答案 0 :(得分:2)

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转换为世界空间。在一般情况下,需要计算模型到世界矩阵的逆/转置。