2016-01-05 1 views
0

Je rends une grande scène en utilisant opengl via lwjgl. Quand je mets le zFar de ma matrice de projection à un petit nombre comme 100, il coupe ma vue à cette distance. Mais si je le règle à 1000 ou plus, ce paramètre est ignoré et OpenGL se clipse juste à environ 500 unités de distance. Cela se produit pour tous mes shaders et le fait le plus intéressant est que cet écrêtage est aligné sur l'axe, donc cela ne dépend que de la distance de la caméra le long de l'axe, pas des distances diagonales.OpenGL caps vue frustum

Qu'est-ce que je fais mal? Existe-t-il un paramètre dans OpenGL pour limiter la vue à un certain point? Cela se passe à la fois sur ma carte Intel et sur ma carte Nvidia. J'utilise "OpenGL moderne" et gère moi-même les matrices.

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; 
} 

Y a-t-il un moyen qu'une vue Matrix peut couvrir la vue frustrum?

EDIT: Vertex Shader:

#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; 
} 

Commentant gl_ClipDistance [0] ne change rien.

Voici une image, ce n'est pas la fin du monde, c'est le terrain qui est coupé par les axes, si vous vous déplacez, vous en voyez plus. En outre, vous pouvez voir comment le terrain sous l'eau est coupé. Les modèles, l'eau ou les particules, qui utilisent différents shaders sont également coupés.

image here

+0

Quelle est la taille de votre «zNear»? – HolyBlackCat

+0

0.1f car les plus petites ne sont pas restituées sur les cartes AMD. Je vais essayer de plus gros nombres. – Geosearchef

+0

Toujours en cours avec un zNear de 50. – Geosearchef

Répondre

1

Merci pour tout le monde essaie d'aider, je me suis rendu ma faute. Le monde ne se fait pas écraser, la skybox est trop petite pour que cela se répercute sur le monde.