我一直试图在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;
}
答案 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
位于另一个空格中。并且您无法对位于不同坐标系的矢量执行合理的操作。
您需要确保Normal
,Position
和CameraPosition
都在同一空间。如果您希望该空间成为世界空间,则需要将Normal
转换为世界空间。在一般情况下,需要计算模型到世界矩阵的逆/转置。