2013-07-07 3 views
3

libgdx의 텍스처를 그레이 스케일 이미지로 변환 할 수있는 방법이 있습니까? 지금까지 나는 그레이 스케일로 만들고자하는 이미지를 복사해서 수동으로 만들었지 만, 게임이 점점 더 많은 이미지를 사용하고 많은 디스크 공간을 사용하기 때문에 이것이 최선의 해결책이 아니라고 생각합니다.libgdx의 텍스처 그레이 스케일

답변

6

그레이 스케일로 텍스처를 렌더링하는 GLSL 셰이더를 작성할 수 있어야합니다. OpenGL 2.x가 필요하며 텍스처를 실제로 "변환"하지 않고 디스플레이에 그레이 스케일로 렌더링합니다. 그레이 스케일 쉐이더 체크 아웃 포함 쉐이더에 대한 자세한 튜토리얼

: 대부분의 자습서 또는 코드 당신이에 찾을 수 있도록 https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson3

(Libgdx 정말 GLSL 쉐이더 API를 정의하지 않는, 즉, OpenGL을에서 통과 것 일반 OpenGL 용 웹이 작동해야합니다.)

더 많은 직접적인 해킹을 위해서는 the Libgdx SpriteBatch shader을 가져 와서 프래그먼트 셰이더를 변경하여 rgb 구성 요소를 평균화하십시오. (당신은 당신의 자신의 ShaderProgram을 정의하고 사용하기 SpriteBatch에 제공 할 수 있습니다.) 프래그먼트 쉐이더의 변경 몸과 같이 뭔가 (테스트되지 않은, 그래서 컴파일하지 않을 수 있습니다) :

+ " vec4 c = v_color * texture2D(u_texture, v_texCoords);\n" // 
+ " float grey = (c.r + c.g + c.b)/3.0;\n" // 
+ " gl_FragColor = vec4(grey, grey, grey, c.a);\n" // 
2

당신은 텍스처를로드 할 수 있습니다 루미넌스 전용, 또는 GLES에서 루미넌스와 알파 (glTexImage2D 참조). libgdx에서 Texture을 인스턴스화 할 때 PixFormat.Intensity (휘도) 또는 LuminanceAlpha (휘도 및 알파)을 지정할 수 있습니다. 이것은 그레이 스케일 텍스처를 생성합니다.

두 개의 텍스처 (하나의 색상, 하나의 회색 명암)를로드해야하지만 동일한 소스를 사용할 수 있으며 휘도는 메모리의 픽셀 당 1 바이트 만 사용합니다. 더 효율적인 솔루션은 P.T.에서 제안한대로 쉐이더를 구현하는 것이지만 GLES 2에서만 사용할 수 있습니다.

4

생각 나는 일부 복사/붙여 넣기 코드를 사용하고자하는 모든 사람들에게 이것을 알리고 싶습니다.

import com.badlogic.gdx.graphics.glutils.ShaderProgram; 

public class GrayscaleShader { 
    static String vertexShader = "attribute vec4 a_position;\n" + 
      "attribute vec4 a_color;\n" + 
      "attribute vec2 a_texCoord0;\n" + 
      "\n" + 
      "uniform mat4 u_projTrans;\n" + 
      "\n" + 
      "varying vec4 v_color;\n" + 
      "varying vec2 v_texCoords;\n" + 
      "\n" + 
      "void main() {\n" + 
      " v_color = a_color;\n" + 
      " v_texCoords = a_texCoord0;\n" + 
      " gl_Position = u_projTrans * a_position;\n" + 
      "}"; 

    static String fragmentShader = "#ifdef GL_ES\n" + 
      " precision mediump float;\n" + 
      "#endif\n" + 
      "\n" + 
      "varying vec4 v_color;\n" + 
      "varying vec2 v_texCoords;\n" + 
      "uniform sampler2D u_texture;\n" + 
      "\n" + 
      "void main() {\n" + 
      " vec4 c = v_color * texture2D(u_texture, v_texCoords);\n" + 
      " float grey = (c.r + c.g + c.b)/3.0;\n" + 
      " gl_FragColor = vec4(grey, grey, grey, c.a);\n" + 
      "}"; 

    public static ShaderProgram grayscaleShader = new ShaderProgram(vertexShader, 
      fragmentShader); 
} 

spriteBatch.setShader(GrayscaleShader.grayscaleShader) 

전화 그리고 당신은 그레이 스케일을 완료하면 당신은 정말 별도의 파일에 쉐이더를 넣어 그들을로드해야

spriteBatch.setShader(null); 
+0

를 호출하는 것을 잊지 마세요 사용하려면 (그리고 깔끔한 쉐이더 도구를 사용합니다.) 유지 관리 가독성 악몽을 원한다면이 옵션을 선택하십시오. –

+1

@iLoveUnicorns 동의 함. 그러나 그것은 빠른 솔루션을 원하고 테스트하기를 원하는 누군가를위한 복사/붙여 넣기 옵션이 아닙니다. 이것이 그렇게하지 못하게하는 것은 아닙니다. 올바른 방향으로 나아가는 것입니다. –