OpenGL上限查看视锥体

时间:2016-01-05 11:07:13

标签: opengl lwjgl frustum

我正在通过lwjgl使用opengl渲染一个大场景。当我将投影矩阵的zFar设置为像100这样的小数字时,它会在该距离处剪切我的视锥体。但如果我将其设置为1000或更大,则忽略此设置,OpenGL只会剪切大约500个单位。对于我的所有着色器都会发生这种情况,最有趣的事实是此裁剪发生轴对齐,因此它只取决于相机沿轴的距离,而不是对角线距离。

我做错了什么? OpenGL中是否有设置限制某一点的视图?这种情况发生在我的英特尔和我的Nvidia卡上。我正在使用“现代OpenGL”来管理自己的基质。

private void createProjectionMatrix()
{
    float aspectRatio = (float) Display.getWidth() / (float) Display.getHeight();
    float y_scale = (float) ((1f / Math.tan(Math.toRadians(FOV / 2f))) * aspectRatio);
    float x_scale = y_scale / aspectRatio;
    float frustum_length = FAR_PLANE - NEAR_PLANE;

    projectionMatrix = new Matrix4f();
    projectionMatrix.m00 = x_scale;
    projectionMatrix.m11 = y_scale;
    projectionMatrix.m22 = - ((FAR_PLANE + NEAR_PLANE) / frustum_length);
    projectionMatrix.m23 = -1;
    projectionMatrix.m32 = -((2 * NEAR_PLANE * FAR_PLANE) / frustum_length);
    projectionMatrix.m33 = 0;
}

视图矩阵是否可以限制视图截止日期?

修改 顶点着色器:

#version 400 core

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 transformationMatrix;

uniform vec3 lightPosition[4];

uniform float fogDensity;
uniform float fogGradient;

uniform vec4 plane;

uniform mat4 lightSpaceMatrix;

in vec3 position;
in vec2 textureCoords;
in vec3 normal;

out vec2 pass_textureCoords;
out vec3 surfaceNormal;
out vec3 toLightVector[4];
out vec3 toCameraVector;
out float visibility;
out vec4 FragPosLightSpace;


void main(void)
{
    vec4 worldPosition = transformationMatrix * vec4(position, 1.0);

    gl_ClipDistance[0] = dot(worldPosition, plane);

    vec4 positionRelativeToCam = viewMatrix * worldPosition;
    gl_Position = projectionMatrix * viewMatrix * worldPosition;

    pass_textureCoords = textureCoords;

    surfaceNormal = (transformationMatrix * vec4(normal, 0.0)).xyz;
    for(int i = 0;i < 4;i++)
    {
        toLightVector[i] = lightPosition[i] - worldPosition.xyz;
    }
    toCameraVector = (inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz - worldPosition.xyz;

    float distanceToCam = length(positionRelativeToCam.xyz);
    visibility = exp(-pow((distanceToCam * fogDensity), fogGradient));
    visibility = clamp(visibility, 0.0, 1.0);

    FragPosLightSpace = lightSpaceMatrix * worldPosition;
}

注释掉gl_ClipDistance [0]不会改变任何东西。

这是一个图像,这不是世界末日,这是沿着轴剪裁的地形,如果你移动你会看到更多。您还可以看到水下地形是如何被剪裁的。使用不同着色器的模型,水或粒子也会被剪裁。

image here

1 个答案:

答案 0 :(得分:1)

感谢所有想要帮助的人,我意识到自己的错。世界不会被削减,天空盒也会变小,所以它会渲染到全世界。