2011-05-03 6 views
3

OpenGL에 약간 익숙합니다. 2D 응용 프로그램을 만들고 있는데, 텍스처가있는 정사각형을 정의하는 Quad 클래스를 정의했습니다. 텍스쳐 아틀라스에서 이러한 텍스쳐를로드하고 정확하게 처리합니다. 모든 것이 규칙적인 텍스처로 작동하고 텍스처가 올바르게 표시되지만 텍스처 이미지가 정사각형이 아닌 경우 올바르게 표시되지 않습니다.OpenGL non-square textures

예를 들어, 쿼드에 별 모양이 있고, 별이 나타나기를 원합니다. 별 이미지 주변이 여전히 쿼드에 놓여 투명하게 보이기를 원합니다. 그러나 일어나는 일은 별이 잘 드러나는 것입니다. 그리고 그 뒤에는 쿼드를 채우는 텍스처 맵의 또 다른 텍스처가 있습니다. 그 뒤에있는 텍스처가 시스템에로드 된 마지막 텍스처라고 가정합니다. 어쨌든, 나는 그 질감이 나타나기를 원하지 않는다.

내 뜻은 이렇습니다. 이 보여주는 뒤에 나는 스타가 아닌 클라우드 틱 텍스처를 원하는 :
enter image description here

내 렌더링 기능의 중요한 부분은 다음과 같습니다

glDisable(GL_CULL_FACE); 
glVertexPointer(vertexStride, GL_FLOAT, 0, vertexes); 
glEnableClientState(GL_VERTEX_ARRAY); 
glColorPointer(colorStride, GL_FLOAT, 0, colors); 
glEnableClientState(GL_COLOR_ARRAY); 

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, textureID); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, uvCoordinates); 

//render 
glDrawArrays(renderStyle, 0, vertexCount); 
+0

정사각형이 아닌 텍스처는 어떻습니까? 그것은 혼합 관련 문제로 보인다. 질문 제목은 오도 된 것입니다 ... – Luca

답변

3

명백한 선택은을 사용하는 것처럼 보인다 RGBA 텍스처를 만들고, 알파 채널을 0으로 설정하여 별 이외의 모든 것을 투명하게 만들고 (텍스처 유닛에 알파 블렌딩을 사용 가능하게 설정).

+0

이렇게하려면 스타의 픽셀을 알아 내야합니까? 별 질감은 투명한 배경과 별이있는 PNG입니다. 질감을 표시하면 별이 투명한 배경으로 표시됩니다. –

+1

@Mike : 추측하기 힘듭니다. PNG를로드하고 텍스처로 변환하는 데 사용하는 소프트웨어에 따라 다릅니다. 어느 정도로 투명성을 얻고있는 것처럼 들리지만 투명성이있는 부분이 무엇인지 분명하지 않습니다. –

1

이미지 조작 프로그램을 사용하십시오. 포토샵은 위대한 하나, 김프는 무료입니다. 실제로 OpenGL을 사용하여 텍스처를 자르지 않습니다. 오히려 텍스쳐는 프로그램을 위해 미리 준비해야합니다.

별 외부의 모든 것을 제거하는 아주 쉬운 도구가 있어야합니다. 제거 (remove) 란 알파 채널이 필요한 투명하게 만드는 것을 의미합니다. 즉, 프로그램에서 텍스처를로드하는 방법은 24 비트 색상 (RGB- 빨강, 녹색, 파랑)이 아닌 32 비트 색상 (RGBA- 빨강, 녹색, 파랑, 알파)을 고려해야합니다.).

별표 뒤의 모든 것을 투명하게 만들거나 투명하게 만듭니다.

또한 인터넷을 통해 저작권으로 보호되는 이미지를 찍어 게임/프로그램에서 사용할 수있는 것처럼 보입니다. 상업용으로 어떤 작업을하고 있다면 자신 만의 텍스처를 만드는 것이 좋습니다.

+0

좋아, 나는 이것을 시도 할 것이다. 오, 현재 사용중인 이미지는 개발 단계에서의 테스트 용입니다. 최종 제품에서 사용할 이미지는 사내에서 제작됩니다. –

0

glBindTexture (GL_TEXTURE_2D, 0)를 호출하려고합니다. 당신이 당신의 질감 를 매핑 한 후 여기

  // Bind the texture 
    glBindTexture(GL_TEXTURE_2D, image.getID()); 

    // Draw a QUAD with setting texture coordinates 
    glBegin(GL_QUADS); 
    { 
     // Top left corner of the texture 
     glTexCoord2f(0, 0); 
     glVertex2f(x, y); 

     // Top right corner of the texture 
     glTexCoord2f(image.getRelativeWidth(), 0); 
     glVertex2f(x+image.getImageWidth(), y); 

     // Bottom right corner of the texture 
     glTexCoord2f(image.getRelativeWidth(), image.getRelativeHeight()); 
     glVertex2f(x+image.getImageWidth()-20, y+image.getImageHeight()); 

     // Bottom left corner of the texture 
     glTexCoord2f(0, image.getRelativeHeight()); 
     glVertex2f(x+20, y+image.getImageHeight()); 
    } 
    glEnd(); 
    glBindTexture(GL_TEXTURE_2D, 0); 

내가 전문가는 오전적인 서면 일부 코드 필자의 예입니다 그러나 이것은 확실히 당신이 나를 위해가 발생하는 것을 해결했다.

+0

물론 클라우드는 이미지의 일부가 아닙니다. –