2012-02-20 5 views
3

기본적으로 텍스처로 렌더링 할 때 텍스처의 일부가 손실 된 것처럼 보입니다. 오른쪽 마지막 쿼드 아래와 각각 그것에 대응 감촉 및 쿼드 보여주는 렌더링 쿼드 동안 정상적으로 display()을 사용하여 렌더링 된 좌, 삼각형 및 제 쿼드부터 출발텍스처로 렌더링하면 텍스처가 완전히 표시되지 않습니다.

package org.yourorghere; 

import com.jogamp.opengl.util.GLBuffers; 
import java.awt.Component; 
import java.nio.ByteBuffer; 
import javax.media.opengl.*; 
import javax.media.opengl.glu.GLU; 


public class GLRenderer implements GLEventListener { 

int[] textureID = new int[1]; 
private int floorWidth=48, floorHeight=48; 
int[] frameBufferID = new int[1]; 
int[] depthRenderBufferID = new int[1]; 
ByteBuffer pixels; 
GLU glu; 

public void init(GLAutoDrawable drawable) { 
    glu = new GLU(); 

    System.out.println("init"); 

    GL2 gl = drawable.getGL().getGL2(); 
    System.err.println("INIT GL IS: " + gl.getClass().getName()); 

    // Setup the drawing area and shading mode 
    gl.glShadeModel(GL2.GL_SMOOTH); // try setting this to GL_FLAT and see what happens. 

    renderShadowsToTexture(gl); 

    gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
} 

public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { 
} 

public void display(GLAutoDrawable drawable) { 
    GL2 gl = drawable.getGL().getGL2(); 

    System.out.println("display"); 

    float a = 1.0f; 

    gl.glMatrixMode(GL2.GL_PROJECTION); 
    // Reset the current matrix to the "identity" 
    gl.glLoadIdentity(); 
    glu.gluPerspective(60.0f, (((Component)drawable).getWidth()/ 
      ((Component)drawable).getHeight()), 1.0f, 50.0f); 

    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    glu.gluLookAt(0.0f, 0.0f, 0.0f, 
        0.0f, 0.0f, 1.0f, 
        0.0f, 1.0f, 0.0f); 

    // Clear the drawing area 
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); 

    gl.glTranslatef(-2.5f, 0.0f, 0.0f); 

    gl.glEnable(GL2.GL_TEXTURE_2D); 

    gl.glBindTexture(GL2.GL_TEXTURE_2D, textureID[0]); 

     gl.glColor3f(1.0f, 1.0f, 1.0f); 
     gl.glBegin(GL2.GL_QUADS); 
      gl.glTexCoord2f(0, 0); 
      gl.glVertex3f(-1.0f,-1.0f, 0.0f); 
      gl.glTexCoord2f(0, a); 
      gl.glVertex3f(-1.0f, 1.0f, 0.0f); 
      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3f(1.0f, 1.0f, 0.0f); 
      gl.glTexCoord2f(a, 0); 
      gl.glVertex3f(1.0f,-1.0f, 0.0f); 
     gl.glEnd(); 
    gl.glDisable(GL2.GL_TEXTURE_2D); 

    gl.glRasterPos2d(3, -2); 
    gl.glDrawPixels(floorWidth, floorHeight, GL2.GL_RGBA, GL2.GL_UNSIGNED_BYTE, pixels); 

} 

private void renderShadowsToTexture(GL2 gl) { 
    gl.glGenTextures(1, textureID, 0); 
    gl.glBindTexture(GL2.GL_TEXTURE_2D, textureID[0]); 

    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST); 
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_NEAREST); 

    // null means reserve texture memory, but texels are undefined 
    gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_RGB, floorWidth, floorHeight, 
               0, GL2.GL_RGB, GL2.GL_FLOAT, null); 

    gl.glGenFramebuffers(1, frameBufferID, 0); 
    gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, frameBufferID[0]); 

    //Attach 2D texture to this FBO 
    gl.glFramebufferTexture2D(GL2.GL_FRAMEBUFFER, GL2.GL_COLOR_ATTACHMENT0, 
            GL2.GL_TEXTURE_2D, textureID[0], 0); 

    // depth buffer 
    gl.glGenRenderbuffers(1, depthRenderBufferID, 0); 
    gl.glBindRenderbuffer(GL2.GL_RENDERBUFFER, depthRenderBufferID[0]); 
    gl.glRenderbufferStorage(GL2.GL_RENDERBUFFER, GL2.GL_DEPTH_COMPONENT, 
              floorWidth, floorHeight); 
    gl.glFramebufferRenderbuffer(GL2.GL_FRAMEBUFFER, GL2.GL_DEPTH_ATTACHMENT, 
             GL2.GL_RENDERBUFFER, depthRenderBufferID[0]); 

    if(gl.glCheckFramebufferStatus(GL2.GL_FRAMEBUFFER) == GL2.GL_FRAMEBUFFER_COMPLETE) 
     System.out.println("[Viewer] GL_FRAMEBUFFER_COMPLETE!!"); 
    else 
     System.out.println("..cazzo ^^"); 

    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glPushMatrix(); 
    gl.glLoadIdentity(); 

    gl.glClearColor(0.9f, 0.9f, 0.9f, 1.0f); 
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT); 

    gl.glPointSize(10.0f); 
    gl.glBegin(GL2.GL_POINTS); 
     gl.glColor3f(0.0f, 1.0f, 0.0f); 
     gl.glVertex2d(1.0f, 1.0f);  // THIS IS NOT SHOWN 
     gl.glColor3f(0.0f, 0.0f, 1.0f); 
     gl.glVertex2d(-1.0f, -1.0f); 
     gl.glVertex2d(-0.9f, -0.9f); 
    gl.glEnd(); 

    gl.glPopMatrix(); 

    pixels = GLBuffers.newDirectByteBuffer(floorWidth*floorHeight*4); 

    gl.glReadPixels(0, 0, floorWidth, floorHeight, GL2.GL_RGBA, 
               GL2.GL_UNSIGNED_BYTE, pixels); 


    System.out.println("glIsTexture: "+gl.glIsTexture(textureID[0])); 

    // bind the back buffer for rendering 
    gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, 0); 
} 

public void dispose(GLAutoDrawable glad) { 
//  throw new UnsupportedOperationException("Not supported yet."); 
     System.out.println("dispose"); 
    } 

} 

텍스처 자체 안에 무엇이 있는지.

기본적으로 빨간색 점은 표시되지 않고 파란색 점만 표시됩니다. 왜?

enter image description here

답변

4

나는이 특정 OpenGL을 래퍼에 익숙하지 해요,하지만 난 당신의 코드에 대해 주목하는 것은 renderShadowsToTexture 당신이 두 가지 구성하지 않는 것이 : 뷰포트와 투영 행렬을. 이 두 가지 모두 결과 이미지의 크기 조정에 영향을 미칩니다.

투영 행렬은 (아직 gluPerspective을 실행하지 않았기 때문에) 단위 행렬이 될 것입니다. 이는 사용중인 좌표에 알 맞습니다. 그러나 명확하고 견고 함을 위해 (pushMatrix/popMatrix를 사용하여) 원하는대로 명시 적으로 설정하는 것이 좋습니다.

그러나 코드가 뷰포트를 구성하는 곳을 전혀 볼 수 없습니까? 아마 JOGL이 당신을 위해 그것을합니까? 그렇다면 텍스처 크기가 아닌 창의 크기가됩니다. 이 너무 큰 뷰포트는 장면의 일부가 높은 좌표 끝에 끊어 지도록합니다. 이는보고있는 텍스처와 일치합니다 (두 번째 파란색 점은 첫 번째 점에 매우 가까워 야하지만 멀리 보이는 점에 유의하십시오 떨어져).

glViewport(0, 0, floorWidth, floorHeight) 

을하고 아마도 나중에 복원 (또는 GL_VIEWPORT_BITglPushAttrib/glPopAttrib 사용) : 그래서, 당신은 renderShadowsToTexture에 추가해야합니다.

또한 색상 구성 요소는 빨간색 - 녹색 - 파랑이므로 누락 된 점은 빨간색이 아닌 녹색입니다.

+0

그래, 나는 BTW 당신이 독립적 인보기를 렌더링하려고 할 때마다, 감사 – elect

+0

그냥 전체 행렬 스택을 다시 작동 색상을 혼동. 메인 장면, HUD, 렌더링 - 투 - 텍스처 등이 포함됩니다. 이는 또한 윈도우의 크기 조정 핸들러에 뷰포트와 프로젝션을 설정하는 것이 타당하지 않은 이유이기도합니다. BTW : gluPerspective를 호출하지 않으면 이전에 사용한 투영이 여전히 사용됩니다. – datenwolf

1

Kevin Reid의 대답 (그에 대한 감사)에 따르면 나는 renderShadowsToTexture(GL2 gl)을 수정했으며 저에게는 큰 도움이되었습니다. 나는 그저 이민자들과 공유하고 싶었습니다.

private void renderShadowsToTexture(GL2 gl) { 

    gl.glGenTextures(1, textureID, 0); 
    gl.glBindTexture(GL2.GL_TEXTURE_2D, textureID[0]); 

    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, 
      GL2.GL_NEAREST); 
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, 
      GL2.GL_NEAREST); 

    // null means reserve texture memory, but texels are undefined 
    gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_RGB, floorWidth, 
      floorHeight, 0, GL2.GL_RGB, GL2.GL_FLOAT, null); 

    gl.glGenFramebuffers(1, frameBufferID, 0); 
    gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, frameBufferID[0]); 

    // Attach 2D texture to this FBO 
    gl.glFramebufferTexture2D(GL2.GL_FRAMEBUFFER, GL2.GL_COLOR_ATTACHMENT0, 
      GL2.GL_TEXTURE_2D, textureID[0], 0); 

    // depth buffer 
    gl.glGenRenderbuffers(1, depthRenderBufferID, 0); 
    gl.glBindRenderbuffer(GL2.GL_RENDERBUFFER, depthRenderBufferID[0]); 
    gl.glRenderbufferStorage(GL2.GL_RENDERBUFFER, GL2.GL_DEPTH_COMPONENT, 
      floorWidth, floorHeight); 
    gl.glFramebufferRenderbuffer(GL2.GL_FRAMEBUFFER, 
      GL2.GL_DEPTH_ATTACHMENT, GL2.GL_RENDERBUFFER, 
      depthRenderBufferID[0]); 

    if (gl.glCheckFramebufferStatus(GL2.GL_FRAMEBUFFER) == GL2.GL_FRAMEBUFFER_COMPLETE) 
     System.out.println("[Viewer] GL_FRAMEBUFFER_COMPLETE!!"); 
    else 
     System.out.println("..cazzo ^^"); 

    gl.glViewport(0, 0, floorWidth, floorHeight); 

    gl.glMatrixMode(GL2.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glOrthof(0, floorWidth, 0, floorHeight, -10, 10); 

    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glPushMatrix(); 
    gl.glLoadIdentity(); 

    gl.glClearColor(0.9f, 0.9f, 0.9f, 1.0f); 
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT); 

    gl.glPointSize(10.0f); 
    gl.glBegin(GL2.GL_POINTS); 
    gl.glColor3f(0.0f, 1.0f, 0.0f); 
    gl.glVertex2d(20.0f, 32.0f); // THIS IS NOT SHOWN 

    gl.glColor3f(0.0f, 0.0f, 1.0f); 
    gl.glVertex2d(20.0f, 10.0f); 
    gl.glVertex2d(0.9f, 0.9f); 

    gl.glEnd(); 

    gl.glPopMatrix(); 

    pixels = GLBuffers.newDirectByteBuffer(floorWidth * floorHeight * 4); 

    gl.glReadPixels(0, 0, floorWidth, floorHeight, GL2.GL_RGBA, 
      GL2.GL_UNSIGNED_BYTE, pixels); 

    System.out.println("glIsTexture: " + gl.glIsTexture(textureID[0])); 

    // bind the back buffer for rendering 
    gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, 0); 

} 
관련 문제