2017-01-24 7 views
0

저는 새로운 OpenGL 프로그래머입니다. 3D 그래프 형식으로 수천 개의 삼각형으로 구성된 높이 맵을 플로팅하고 있습니다. 그것들은 3 축에서 -1과 +1 사이에 플롯되도록 스케일됩니다. 이제는 X 축 만 확대 할 수 있으며 적절한 축척 및 변환 행렬을 적용하여 X 축에서 변환 할 수도 있습니다. 이렇게하면 효과적으로 데이터를 오른쪽으로 확대하고 선택한대로 x 방향으로 이동할 수 있습니다. 문제는 확대 된 후 x 방향의 데이터가 이제 그래프의 경계 인 -1에서 +1 영역 밖으로 확장된다는 것입니다. 이 데이터를 표시하지 않기를 바랍니다. 이것은 현대 OpenGL에서 어떻게 이루어 집니까? 당신에게 편집 감사합니다 다음과 같이 행렬은 다음과 같습니다축의 두 좌표 사이에서 OpenGL의 그리기를 어떻게 제한합니까?

 plottingProgram["projection_matrix"].SetValue(Matrix4.CreatePerspectiveFieldOfView(0.45f, (float)width/height, 0.1f, 1000f)); 
     plottingProgram["view_matrix"].SetValue(Matrix4.LookAt(new Vector3(0, 0, 10), Vector3.Zero, new Vector3(0, 1, 0))); 

및 버텍스 쉐이더 여기

public static string VertexShader = @" 
    #version 130 

    in vec3 vertexPosition; 

    out vec2 textureCoordinate; 

    uniform mat4 projection_matrix; 
    uniform mat4 view_matrix; 
    uniform mat4 model_matrix; 

    void main(void) 
    { 
     textureCoordinate = vertexPosition.xy; 
     gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1);   
    } 
    "; 

그래프에 대한 링크입니다 : http://va2fsq.com/wp-content/uploads/graph.jpg

감사

+0

문제의 스크린 샷을 추가 할 수 있습니까? 현재 사용중인 행렬도 표시하십시오 (투영법, ...). – BDL

+1

요청한대로 완료 – Tom

답변

0

나는 이것을 해결했다. glScissor와 같은 많은 것을 시도한 후에 glClip_distance가 발생했습니다. 그래서 내 최초의 시도는 이것에 문제가 vec4 비행기가 확장 및 모델 행렬의 크기를 조절하거나 변환 번역되어 지금

in vec3 vertexPosition; 
uniform vec4 plane0 = (-1,0,0,1); 
uniform vec4 plane1 = (1,0,0,1); 

void main(void) 
{ 
    gl_ClipDistance[0] = dot(vec4(vertexPosition,1), plane0; 
    gl_ClipDistance[1] = dot(vec4(vertexPosition,1), plane2; 

로 설정 쉐이더의 통일을 배치. 그래서 그것은 작동하지 않을 것입니다.

 Vector4 clip1 = new Vector4(-1, 0, 0, 1.0f/scale); 
     Vector4 clip2 = new Vector4(1, 0, 0, 1.0f/scale); 

     plottingProgram["model_matrix"].SetValue(Matrix4.CreateScaling(new Vector3(scale,1,1)) * Matrix4.CreateTranslation(new Vector3(0,0,0)) *Matrix4.CreateRotationY(yangle) * Matrix4.CreateRotationX(xangle)); 
     plottingProgram["plane0"].SetValue(clip1); 
     plottingProgram["plane1"].SetValue(clip2); 

및 전체 버텍스 쉐이더가

public static string VertexShader = @" 
    #version 130 

    in vec3 vertexPosition; 

    out vec2 textureCoordinate; 

    uniform mat4 projection_matrix; 
    uniform mat4 view_matrix; 
    uniform mat4 model_matrix; 

    uniform vec4 plane0; 
    uniform vec4 plane1; 

    void main(void) 
    { 
     textureCoordinate = vertexPosition.xy; 

     gl_ClipDistance[0] = dot(vec4(vertexPosition,1), plane0); 
     gl_ClipDistance[1] = dot(vec4(vertexPosition,1), plane1); 

     gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1); 
    } 
    "; 

또한 번역 할 수 있습니다에 의해 주어진다 : 그래서 솔루션은 다음과 같이 버텍스 쉐이더 외부 클립 벡터를 이동하고 그들에게 반대 스케일링을 적용하는 것입니다 같은 방법으로.