2012-02-20 17 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はそれをあなたにしていますか?そうであれば、テクスチャのサイズではなくウィンドウのサイズになります。この大きすぎるビューポートでは、シーンの一部が高座標の端で切り取られます。これは、表示されているテクスチャと一致しています(2番目の青い点は最初の点に非常に近く、離れて)。だから、あなたはrenderShadowsToTextureに追加する必要があります。

glViewport(0, 0, floorWidth, floorHeight) 

、おそらくその後、それを復元する(またはGL_VIEWPORT_BITglPushAttrib/glPopAttribを使用します)。

また、色成分は赤 - 緑 - 青であるため、欠落した点は赤ではなく緑になります。

+0

うん、私はあなたが独立したビューをレンダリングしようとしている時はいつでも感謝 – elect

+0

ちょうど全体の行列スタックをリセットし、ところで、それは動作しますが、色を混同。これには、メインシーン、HUD、レンダーテクスチャなどが含まれます。これは、ウィンドウのサイズ変更ハンドラでビューポートと投影を設定するのが理にかなっていない理由です。ところで、gluPerspectiveメソッドを呼び出さない、以前に使用された投影は引き続き使用されます。 – datenwolf

1

ケビン・リードの答え(彼のおかげで)私は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); 

} 
関連する問題