2016-09-10 2 views
4

libgdx를 사용하여 OpenGL과 함께 JWindow 유형 UI를 작성하고 있습니다. 웬일인지 GL20.GL_BLEND을 사용 가능하게 한 후에도 내 앱의 검정색 배경이 여전히 남아 있습니다. 내가 같은 일을 요청하는 사람의 스레드를 찾았지만 C (How to make an OpenGL rendering context with transparent background?)에 한libgdx 투명 오버레이

package com.mygdx.game; 

import com.badlogic.gdx.ApplicationAdapter; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.Color; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.graphics.glutils.ShapeRenderer; 
import com.badlogic.gdx.scenes.scene2d.Stage; 
import com.badlogic.gdx.utils.viewport.FitViewport; 

public class MyGdxGame extends ApplicationAdapter { 

    Stage stage; 
    SpriteBatch batch; 
    ShapeRenderer shapeRenderer; 

    @Override 
    public void create() { 
     stage = new Stage(new FitViewport(2560, 1440)); 
     batch = new SpriteBatch(); 
     shapeRenderer = new ShapeRenderer(); 
     shapeRenderer.setAutoShapeType(true); 
    } 

    @Override 
    public void render() { 
     Gdx.gl.glEnable(GL20.GL_BLEND); 
     Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); 

     Gdx.gl.glClearColor(0, 0, 0, .25f); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 



     batch.begin(); 
     shapeRenderer.begin(ShapeRenderer.ShapeType.Line); 
     shapeRenderer.setColor(Color.RED); 
     shapeRenderer.rect(100, 25, 200, 450); 

     shapeRenderer.set(ShapeRenderer.ShapeType.Filled); 
     shapeRenderer.setColor(Color.GREEN); 
     shapeRenderer.rect(303, 24, 10, 451); 
     shapeRenderer.end(); 
     batch.end(); 

     Gdx.gl.glDisable(GL20.GL_BLEND); 
    } 

    @Override 
    public void resize(int width, int height) { 
     stage.getViewport().update(width, height, true); 
    } 

    @Override 
    public void dispose() { 
     stage.dispose(); 
     batch.dispose(); 
     shapeRenderer.dispose(); 
    } 

} 

:

여기 내 코드입니다. 심지어 JWindow에 LwglAWTCanvas를 추가하려고 시도했지만 배경을 투명하게 만들 수 없습니다.

사용자 화면에 직사각형/도형을 그릴 수 있도록 명확한 배경을 갖고 싶습니다.

감사합니다.

+0

가능한 복제 [? 어떻게 투명 배경으로 OpenGL은 렌더링 컨텍스트를 만드는 (http://stackoverflow.com/questions/4052940/how-to-make-an-opengl-rendering-context-with-transparent-background) – pleluron

+0

이 언어는 모국어가 아니기 때문에 중복되지는 않습니다. –

+0

그것이 제가 지적하고자했던 것입니다. Java에서는 응답이 없습니다. [this] (http://stackoverflow.com/questions/10276020/lwjgl-window-with-transparent-background)를 참조하십시오. – pleluron

답변

3

Windows에서 JNA를 사용하여이 작업을 수행 할 수있었습니다.

import com.badlogic.gdx.backends.lwjgl.LwjglApplication; 
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; 
import com.badlogic.gdx.graphics.Color; 
import com.mygdx.game.CharlatanoOverlay; 
import com.sun.jna.Pointer; 
import com.sun.jna.platform.win32.User32; 
import com.sun.jna.platform.win32.WinDef; 
import com.sun.jna.platform.win32.WinUser; 

import static com.sun.jna.platform.win32.WinUser.*; 

public class DesktopLauncher { 

    public static final WinDef.DWORD DWM_BB_ENABLE = new WinDef.DWORD(0x00000001); 
    public static final WinDef.DWORD DWM_BB_BLURREGION = new WinDef.DWORD(0x00000002); 
    public static final WinDef.DWORD DWM_BB_TRANSITIONONMAXIMIZED = new WinDef.DWORD(0x00000004); 

    public static final WinDef.HWND HWND_TOPPOS = new WinDef.HWND(new Pointer(-1)); 

    private static final int SWP_NOSIZE = 0x0001; 
    private static final int SWP_NOMOVE = 0x0002; 

    private static final int WS_EX_TOOLWINDOW = 0x00000080; 
    private static final int WS_EX_APPWINDOW = 0x00040000; 

    public static void main(String[] arg) { 
     LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration(); 
     System.setProperty("org.lwjgl.opengl.Window.undecorated", "true"); 
     cfg.width = LwjglApplicationConfiguration.getDesktopDisplayMode().width-1; 
     cfg.height = LwjglApplicationConfiguration.getDesktopDisplayMode().height-1; 
     cfg.resizable = false; 
     cfg.fullscreen = false; 
     cfg.initialBackgroundColor = new Color(0, 0, 0, 0); 

     new LwjglApplication(new CharlatanoOverlay(), cfg); 

     WinDef.HWND hwnd; 
     while ((hwnd = User32.INSTANCE.FindWindow(null, "CharlatanoOverlay")) == null) { 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     System.out.println(hwnd); 
     System.out.println(transparentWindow(hwnd)); 
    } 

    public static boolean transparentWindow(WinDef.HWND hwnd) { 
     DWM_BLURBEHIND bb = new DWM_BLURBEHIND(); 
     bb.dwFlags = DWM_BB_ENABLE; 
     bb.fEnable = true; 
     bb.hRgnBlur = null; 
     DWM.DwmEnableBlurBehindWindow(hwnd, bb); 

     int wl = User32.INSTANCE.GetWindowLong(hwnd, WinUser.GWL_EXSTYLE); 
     wl = wl | WinUser.WS_EX_LAYERED | WinUser.WS_EX_TRANSPARENT; 
     User32.INSTANCE.SetWindowLong(hwnd, WinUser.GWL_EXSTYLE, wl); 

     wl &= ~(WS_VISIBLE); 

     wl |= WS_EX_TOOLWINDOW; // flags don't work - windows remains in taskbar 
     wl &= ~(WS_EX_APPWINDOW); 

     User32.INSTANCE.ShowWindow(hwnd, SW_HIDE); // hide the window 
     User32.INSTANCE.SetWindowLong(hwnd, GWL_STYLE, wl); // set the style 
     User32.INSTANCE.ShowWindow(hwnd, SW_SHOW); // show the window for the new style to come into effect 
     User32.INSTANCE.SetWindowLong(hwnd, WinUser.GWL_EXSTYLE, wl); 

     return User32.INSTANCE.SetWindowPos(hwnd, HWND_TOPPOS, 0, 0, 2560, 1440, SWP_NOMOVE | SWP_NOSIZE); 
    } 
} 

DWM :

import com.sun.jna.Native; 
import com.sun.jna.platform.win32.WinDef; 
import com.sun.jna.platform.win32.WinNT; 

public class DWM { 

    static { 
     Native.register("Dwmapi"); 
    } 

    public static native WinNT.HRESULT DwmEnableBlurBehindWindow(WinDef.HWND hWnd, DWM_BLURBEHIND pBlurBehind); 

} 

DWM_BLURBEHIND :

import com.sun.jna.Structure; 
import com.sun.jna.platform.win32.WinDef; 

import java.util.Arrays; 
import java.util.List; 

public class DWM_BLURBEHIND extends Structure { 

    public WinDef.DWORD dwFlags; 
    public boolean fEnable; 
    public WinDef.HRGN hRgnBlur; 
    public boolean fTransitionOnMaximized; 

    @Override 
    protected List<String> getFieldOrder() { 
     return Arrays.asList("dwFlags", "fEnable", "hRgnBlur", "fTransitionOnMaximized"); 
    } 

} 
+0

잘 했어, 나는 그것이 가능하다는 것을 몰랐다. 휴대용 솔루션을 제공하기 위해 jna로 xlib에 액세스 할 수도 있습니다. – pleluron

+0

@pleluron이 지금 작업 중입니다. libgdx가 크로스 플랫폼 JWindow 유형 OpenGL 캔버스를 사용하는 것이 좋을 것입니다. : D –

+0

@ jonathan-beaudoin 혹시 리눅스에서이 작업을 했습니까? 이 효과를 plattform 교차시키고 싶습니다! – PureSpider

관련 문제