2017-01-04 7 views
0

JOGL로 애니메이션을 만들고 있습니다. 몇 가지 요소를 그려야하지만 그 중 일부는 항상 같은 속성을 가진 동일한 요소이며 그 영역에서 다른 객체가 이동하지 않습니다. 이것이 내가 glScissor를 구현하는 이유입니다. 그래서 내 생각은 : 나는 부울 변수를 true로 선언하고 첫 번째 프레임에 대해서만 true 인 if 문을 수행합니다. if 문 안에서 필자는 상수로 필요한 것을 모두 칠하는 함수를 호출 한 다음 glScissors를 활성화합니다. 문제는 가위가있는 영역에서만 이미지가 변경되는 것을 볼 수 있지만 외부 영역에서는 깜박임을 볼 수 있다는 것입니다. 올바른 이미지로 다른 사람들과 검은 색 프레임이있는 것과 같습니다. 왜? 내가 도대체 ​​뭘 잘못하고있는 겁니까?)glScissors는 애니메이션 (JOGL)을 사용하여 깜박입니다.

A)()

또는

나 초기화에) glDrawBuffer (GL_FRONT_AND_BACK 쓰기 백 버퍼를 전면 버퍼를 복사

boolean first = true;  

public void init(GLAutoDrawable drawable) { 
    final GL2 gl = (GL2) drawable.getGL(); 

    // Enable z- (depth) buffer for hidden surface removal. 
    gl.glEnable(GL.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL.GL_LEQUAL); 

    // Enable smooth shading. 
    gl.glShadeModel(GL2.GL_SMOOTH); 

    // Define "clear" color. 
    gl.glClearColor(1f, 1f, 1f, 1f); 

    // We want a nice perspective. 
    gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); 

    // Create GLU. 
    glu = new GLU(); 
    GLProfile profile = GLProfile.get(GLProfile.GL2); 

    gl.glPixelStorei(gl.GL_PACK_ALIGNMENT, 1); 
} 

public void display(GLAutoDrawable drawable) { 

    final GL2 gl = (GL2) drawable.getGL(); 

    // Clear screen. 
    gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 

    // Set camera. 
    setCamera(gl, glu, 30); 

    // Prepare light parameters. 
    float SHINE_ALL_DIRECTIONS = 1; 
    float[] lightPos = {0, 0, 0, SHINE_ALL_DIRECTIONS}; 
    float[] lightColorAmbient = {1f, 1f, 1f, 1f}; 
    float[] lightColorSpecular = {1f, 1f, 1f, 1f}; 

    // Set light parameters. 
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_POSITION, lightPos, 0); 
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_AMBIENT, lightColorAmbient, 0); 
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_SPECULAR, lightColorSpecular, 0); 

    // Enable lighting in GL. 
    gl.glEnable(GL2.GL_LIGHT1); 
    gl.glEnable(GL2.GL_LIGHTING); 
    if (first==true){ 
     first=false; 
     //inside plot_constant_object I don't change anything related with lighting 
     Plot_constant_objects(drawable, gl); 
     gl.glScissor(100, 100, 500, 500); 
     gl.glEnable(gl.GL_SCISSOR_TEST); 
    } 
    //Draw other stuff 

} 
+0

당신은 사용 [사용되지 OpenGL은] (https://www.khronos.org/opengl/wiki/Legacy_OpenGL) 내가 당신을 조언 – elect

+0

작업을보고 안 여기에있는 예 : http://www.java-gaming.org/index.php/topic,13652. 그건 그렇고, "glu = new GLU()"를 "glu = GLU.createGLU (gl)"로 바꾸십시오. – gouessej

+0

차이점은 무엇입니까? 둘 다 나를 위해 일했다. 해당 페이지에 대해 작동하지 않았습니다! 바라기를 나는 해결책을 찾아 냈다 :) –

답변

0

http://anirudhsasikumar.net/blog/2006.03.04.html 다음 당신은 할 필요가있다. 기본 드로잉 버퍼 또는 기본 논리 연산을 변경하는 경우이를 저장하고 복원하는 것이 좋습니다. 해당 페이지에 표시된대로 코드는 다음과 같습니다

void copy_buffer() 
{ 
    static GLint viewport[4]; 
    static GLfloat raster_pos[4]; 

    glGetIntegerv(GL_VIEWPORT, viewport); 

    /* set source buffer */ 
    glReadBuffer(GL_FRONT); 

    /* set projection matrix */ 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity() ; 
    gluOrtho2D(0, viewport[2], 0, viewport[3]); 

    /* set modelview matrix */ 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    glLoadIdentity(); 

    /* save old raster position */ 
    glGetFloatv(GL_CURRENT_RASTER_POSITION, raster_pos); 

    /* set raster position */ 
    glRasterPos4f(0.0, 0.0, 0.0, 1.0); 

    /* copy buffer */ 
    glCopyPixels(0, 0, viewport[2], viewport[3], GL_COLOR); 

    /* restore old raster position */ 
    glRasterPos4fv(raster_pos); 

    /* restore old matrices */ 
    glPopMatrix(); 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 

    /* restore source buffer */ 
    glReadBuffer(GL_BACK); 
}