2014-09-27 2 views
0

4 색 (노란색, 파란색, 녹색, 빨간색) 4 개의 사각형으로 구성된 512 x 512 텍스처로 쿼드를 그립니다. 나는 모든 노란색하지만 0에서 1로 텍스 좌표 공간 그리고 내가 여기에 코드의 ... 그들이 올바르게 매핑하고 꽤 확신 이미지를 볼 때 :LWJGL 텍스처로드/매핑 문제

private void loadTexture(String textureFile) { 
     TexHandle = glGenTextures(); 
     BufferedImage TextureBuffer = null; 
     try { 
      TextureBuffer = ImageIO.read(new File(textureFile)); 
     } catch (IOException ex) { 
      System.err.println("Error while reading the texture: " + textureFile); 
      System.exit(1); 
     } 
     Width = TextureBuffer.getWidth(); 
     Height = TextureBuffer.getHeight(); 
     AlphaChannel = TextureBuffer.getColorModel().hasAlpha(); 
     int pixel; 
     int[] pixels = TextureBuffer.getRGB(0, 0, Width, Height, null, 0, Width); 
     ByteBuffer Buffer = BufferUtils.createByteBuffer(Width * Height * 4); 
     for(int i = 0; i < Height; i++){ 
      for(int j = 0; j < Width; j++){ 
       pixel = pixels[i * Width + j]; 

       Buffer.put((byte)(pixel  & 0xff)); 
       Buffer.put((byte)((pixel >> 8) & 0xff)); 
       Buffer.put((byte)((pixel >> 16) & 0xff)); 

       if(AlphaChannel) 
        Buffer.put((byte)((pixel >> 24) & 0xff)); 
       else 
        Buffer.put((byte)0xff); 
      } 
     } 
     glBindTexture(GL_TEXTURE_2D, TexHandle); 

     Buffer.flip(); 
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, Width, Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, Buffer); 

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

     glBindTexture(GL_TEXTURE_2D, 0); 
    } 

public void initOpenGL() { 
     glClearColor(0f, 0f, 0.4f, 1f); 

     glFrontFace(GL_CCW); 

     glCullFace(GL_BACK); 
     glEnable(GL_CULL_FACE); 

     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
     glEnable(GL_BLEND); 

     glDepthFunc(GL_LEQUAL); 
     glEnable(GL_DEPTH_TEST); 
     glEnable(GL_DEPTH_CLAMP); 

     glEnable(GL_TEXTURE_2D); 
    } 

주 :

while(!window.isClosing()){ 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     program.updateUniform("TextureIndex", 0); 
     glActiveTexture(GL_TEXTURE0 + 0); 
     glBindTexture(GL_TEXTURE_2D, TexHandle); 
     glBegin(GL_QUADS); 
     glNormal3f(0, 0, 0); 

     glTexCoord2f(0, 0); 
     glVertex3f(-.5f, -.5f, -2f); 

     glTexCoord2f(1, 0); 
     glVertex3f(.5f, -.5f, -2f); 

     glTexCoord2f(1, 1); 
     glVertex3f(.5f, .5f, -2f); 

     glTexCoord2f(0, 1); 
     glVertex3f(-.5f, .5f, -2f); 

     glEnd(); 

     window.update(); 
    } 

정점 :

layout(location = 0) in vec3 in_position; 
layout(location = 1) in vec2 in_texture_coord; 
layout(location = 2) in vec3 in_normal; 
out vec2 out_texture_coord; 

void main(){ 

    gl_Position = vec4(in_position, 1.0); 
    out_texture_coord = in_texture_coord; 

} 

단편

out vec4 out_color; 
    in vec2 in_texture_coord; // passed from the vertex shader 
    uniform sampler2D TextureIndex; 

    void main(){ 

     out_color = texture2D(TextureIndex, in_texture_coord); 

    } 
,536,913,632 10
+0

누락 된 한 가지 사실은 그리기 전에 창을 지우는'glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)'호출입니다.그 외에도, 다음 추측은 버텍스 쉐이더에서 문제가 될 것입니다. –

+0

함수를 추가했지만 여전히 오류가 발생합니다. 또한 vertex shader를 추가했습니다. – Mk3Y

답변

0

문제는 변수 이름입니다. VS에서 "out vec3 out_tex_coord"를 갖고있는 반면 FS에서는 "vec3 in_tex_coord"가 있고 항상 텍스처 (0,0)의 UV와 일치하지 않기 때문입니다.

2

게시 된 코드는 레거시 OpenGL 기능을 지원되지 않는 방식으로 최신 OpenGL 기능과 혼합합니다. 정점 사양 코드는 이전 스타일 고정 기능은 속성을 사용하여 버텍스 쉐이더가 기대하는

glNormal3f(0, 0, 0); 
glTexCoord2f(0, 0); 
glVertex3f(-.5f, -.5f, -2f); 

동안 일반 정점 속성 :

layout(location = 0) in vec3 in_position; 
layout(location = 1) in vec2 in_texture_coord; 
layout(location = 2) in vec3 in_normal; 

이 둘 사이에 직접적인 대응이 없습니다. 이 스펙에는 일반 속성 0이 레거시 버텍스 위치에 매핑되지만 모든 드라이버에서 항상 안정적으로 작동하지는 않는다는 일부 언어가 있습니다. 그리고 예를 들어 glTexCoord2f()으로 지정된 값이 버텍스 셰이더에서 (location = 1) 인 속성에 매핑된다고 가정하는 것은 무의미합니다.

그 문제를 해결하는 두 가지 방법이 있습니다 :

  1. 변경 쉐이더 코드를 정점 데이터를 지정하는 데 사용되는 기존의 전화와 함께 작동하는가. 이것은 정점 셰이더 코드에 in 변수 선언을 제거하고, 속성 값에 액세스하기 위해 미리 정의 된 변수를 사용하여 수행된다 : 텍스처에 대한 정점 위치

    gl_MultiTexCoord0위한

    gl_Vertex

    좌표 gl_Normal 일반용

  2. 고정 함수 속성 대신 일반 정점 속성 값을 설정하는 API 함수를 사용하십시오. 코드 위의 조각 및 버텍스 쉐이더 코드에서 위치를 일치하는 경우 : 현대는 OpenGL을 향해 움직일 준비가되면

    glVertexAttrib3f(2, 0.0f, 0.0f, 0.0f); 
    glVertexAttrib2f(1, 0.0f, 0.0f); 
    glVertexAttrib3f(0, -0.5f, -0.5f, -2.0f); 
    

는 옵션이 더 나은 방향으로 될 것입니다. 이 경로의 다음 단계 중 하나는 현재 코드의 직접 모드 호출 대신 정점 버퍼 객체 (VBO)를 사용하여 정점 데이터를 지정하는 것입니다.

+0

도움 주셔서 감사합니다.하지만 # 2 수정을 구현했지만 여전히 완전히 노란색 사각형을 얻습니다. 내 문제는 텍스처 로더/OpenGL 초기화에 놓여있는 것 같아요. 이 코드는 내가 일하는 중이 야 몇 년 전에 해왔 던 지금은 내가 그것을 업데이 트하고 몇 가지 기능을 추가하려고 노력하고 오래된 응용 프로그램입니다 – Mk3Y