2011-12-17 4 views
0

텍스처로 쿼드를 렌더링하려하지만 작동하지 않습니다.텍스처 쿼드 그리기 OpenGL

//Init Code 
    GL11.glViewport(0, 0, WIDTH, HEIGHT); 
    GL11.glMatrixMode(GL11.GL_PROJECTION); 
    GL11.glLoadIdentity(); 
    GLU.gluPerspective(45.0f, ((float) WIDTH/(float) HEIGHT), 0.1f, 100.0f); 
    GL11.glMatrixMode(GL11.GL_MODELVIEW); 
    GL11.glLoadIdentity(); 
    GL11.glShadeModel(GL11.GL_SMOOTH); 
    GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    GL11.glClearDepth(1.0f); 
    GL11.glEnable(GL11.GL_DEPTH_TEST); 
    GL11.glDepthFunc(GL11.GL_LEQUAL); 
    GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST); 
    GL11.glEnable(GL11.GL_TEXTURE_2D); 

//Render Code 
    BufferedImage textures = null; 
    try { 
     textures = ImageIO.read(BlockWorldComponent.class.getResource("/textures.png")); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    BufferedImage img = textures; 
    int w = img.getWidth(); 
    int h = img.getHeight(); 
    int imgInt[] = new int[w * h]; 
    byte imgByte[] = new byte[w * h * 4]; 
    img.getRGB(0, 0, w, h, imgInt, 0, w); 

    for (int i = 0; i < imgInt.length; i++) { 
     int a = imgInt[i] >> 24 & 0xFF; 
     int r = imgInt[i] >> 16 & 0xFF; 
     int g = imgInt[i] >> 8 & 0xFF; 
     int b = imgInt[i] & 0xFF; 

     imgByte[i * 4 + 0] = (byte) r; 
     imgByte[i * 4 + 1] = (byte) g; 
     imgByte[i * 4 + 2] = (byte) b; 
     imgByte[i * 4 + 3] = (byte) a; 
    } 

    ByteBuffer imageData = ByteBuffer.allocateDirect(imgByte.length); 
    imageData.order(ByteOrder.nativeOrder()); 
    imageData.clear(); 
    imageData.put(imgByte, 0, imgByte.length); 
    imageData.flip(); 
    int[] tex = new int[1]; 
    tex[0] = GL11.glGenTextures(); 
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, tex[0]); 
    System.out.println(tex[0]); 
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); 
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); 
    GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, w, h, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, imageData); 

    GL11.glScalef(0.25f, 0.25f, 0.25f); 


    //GL11.glColor3f(0.0f,1.0f,0.0f); 
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, tex[0]); 
    GL11.glBegin(GL11.GL_QUADS); 
    //Top Left 
    GL11.glTexCoord2f(0.0f, 1.0f); 
    GL11.glVertex3f(1.0f, 1.0f, -1.0f); 
    //Top Right 
    GL11.glTexCoord2f(1.0f, 1.0f); 
    GL11.glVertex3f(1.0f, 1.0f, 1.0f); 
    //Bottom Left 
    GL11.glTexCoord2f(0.0f, 0.0f); 
    GL11.glVertex3f(-1.0f, 1.0f, 1.0f); 
    //Bottom Right 
    GL11.glTexCoord2f(1.0f, 0.0f); 
    GL11.glVertex3f(-1.0f, 1.0f, -1.0f); 
    GL11.glEnd(); 
+1

코드 크기를 줄이려면 조금 더 자세하게 설명하십시오. – pmr

+0

이미지를로드하는 데 newdawn.slick을 사용하십시오. –

+0

@pmr 문제가있는 곳을 모르지만 ..... 이미지가 잘로드됩니다. 나는 그것이 OpenGL에 관한 것 같다고 생각한다. – Diesal11

답변

0

이 프로젝트에 텍스처링을 활성화 : 여기 내 코드? 귀하의 경우

glEnable(GL_TEXTURE_2D); 

아니면이 :

GL11.glEnable(GL_11.GL_TEXTURE_2D); 
+0

그래, 내 Init 코드를 질문에 추가한다. – Diesal11

2

여기 몇 가지 문제를 참조하십시오. 첫째, glTexImage2D에 전화 할 때 텍스쳐 바운드가없는 것 같습니다. 텍스처를 OpenGL에서 올바르게 설정하려면 호출하기 전에 glBindTexture(GL_TEXTURE_2D, tex[0]);으로 전화해야합니다. 그리고 그 전에 glGenTextures으로 전화하여 tex[0]을 채워야합니다.

두 번째로 glBeginglEnd 사이의 호출간에 glBindTexture을 호출 할 수 없습니다. 결과적으로 도면 섹션에서 호출하는 첫 번째 바인딩 인 GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);이 적용되지만 두 번째 호출은 glBegin을 호출 한 이후이므로 두 번째 호출은 적용되지 않습니다. 따라서 렌더링에 텍스처가 사용되지 않습니다.

+0

이 코드에서 그 tex [0]을 바꾸는 걸 잊어 버렸습니다. tex [0]은 정수로만 0입니다. 또한 glGenTextures는 어떻게 작동합니까? Java/LWJGL에서 OpenGL 용 Javadoc을 찾을 수 없습니다. 도움 주셔서 감사합니다. – Diesal11

+0

glGenTextures 부분을 알아 냈지만 여전히 작동하지 않습니다. 내가 지금 가지고있는 코드로 업데이트하길 원하니? – Diesal11

+0

@ Diesal11 괜찮 으면 도움이 될 것입니다. 예 – nonVirtualThunk