2013-07-26 47 views
9

tôi cố gắng để làm cho sử dụng GLSurfaceView, và bởi docs tôi đặt định dạng:GLSurfaceView - làm thế nào để làm cho nền mờ

getHolder().setFormat(PixelFormat.TRANSLUCENT); 

Các tôi sử dụng GLSurfaceView.Renderer, mà rút ra trong onDrawFrame:

GLES20.glClearColor(0, 0, 1, .5f); 
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 

Tuy nhiên, hiển thị GL trong GLSurfaceView không mờ và hoàn toàn màu xanh lam. Nếu tôi bỏ qua cuộc gọi glClear, thì nó hoàn toàn đen.

Làm cách nào để hiển thị GL có nền trong suốt, sao cho nó được pha trộn với các chế độ xem được vẽ phía sau?

enter image description here

EDIT: đây là GLSurfaceView tôi:

class GLView extends GLSurfaceView{ 
    MyRenderer r; 
    public GLView(Context ctx){ 
     super(ctx); 
     setEGLContextClientVersion(2); 

     getHolder().setFormat(PixelFormat.TRANSLUCENT); 

     setEGLConfigChooser(8, 8, 8, 8, 16, 0); 
     r = new MyRenderer(getContext()); 
     setRenderer(r); 
    } 
} 

Trả lời

6

OK, sau khi một số nghiên cứu tôi có thể trả lời này bản thân mình.

Cuối cùng tôi đã làm cho nó được vẽ với độ trong suốt bằng SurfaceView.setZOrderOnTop (true). Nhưng sau đó tôi mất khả năng đặt các chế độ xem khác trên đầu trang GLSurfaceView của mình.

tôi đã kết thúc với hai kết quả tốt:

behindon top

Bên trái là bề mặt GL chuẩn dưới tất cả các quan điểm khác, mà không thể được rút ra với tính minh bạch, vì GL bề mặt được vẽ trước khi bề mặt cửa sổ ứng dụng của và GLSurfaceView chỉ punches hole ở vị trí của nó sao cho bề mặt GL được nhìn xuyên qua.

Bên phải là bề mặt GL trong suốt được vẽ bằng setZOrderOnTop (true), do đó bề mặt của nó được vẽ trên đầu cửa sổ ứng dụng. Bây giờ nó trong suốt, nhưng được vẽ trên đầu các khung nhìn khác được đặt trên nó trong hệ thống phân cấp khung nhìn.Vì vậy, có vẻ như ứng dụng có một cửa sổ với bề mặt cho hệ thống phân cấp khung nhìn của nó, và SurfaceView có bề mặt riêng cho GL, có thể ở trên hoặc dưới cửa sổ ứng dụng. Thật không may, quan điểm GL trong suốt không thể được sắp xếp một cách chính xác trong hệ thống phân cấp khung nhìn với các chế độ xem khác trên đầu trang của nó.

+0

Tại sao bạn không trao tiền thưởng? –

+2

Tôi không thể trả lời câu trả lời của riêng mình và các câu trả lời khác không thỏa mãn tôi. –

0

Tôi không chắc chắn những gì vấn đề là chính xác nhưng một sự thay thế có thể được bao gồm màn hình với một hình chữ nhật màu mờ và chỉ thanh toán bù trừ bit đệm sâu.

Is there any alternative for GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)?

Nếu không đảm bảo độ sâu bit đệm của bạn là 1

Sẽ quay lại sau để cố gắng và tạo lại vấn đề trên điện thoại của tôi trong một chút khi tôi có thể.

Chỉnh sửa: Tôi vừa nhận ra rằng lý do xuất hiện màu xanh dương có thể là do bạn đặt thành .5f nên chỉ mất 2 cuộc gọi để đạt được độ mờ tối đa 1f. có nghĩa là phải mất 30fps 1/15 giây để chuyển sang màu xanh hoàn toàn.

Hãy thử hạ thấp giá trị minh bạch alpha để 0.01f hoặc 0.05f

+0

Lý do sai, thậm chí đặt alpha thành 0 không thay đổi. Có thể bạn nghĩ rằng thanh toán bù trừ thêm giá trị từ trước đó rõ ràng. Tuy nhiên, flinger bề mặt nên tạo bề mặt màn hình chính xác, bao gồm cả kênh alpha bề mặt GL. –

5

Bạn cần định dạng RGBA 8888 pixel mờ:

private void init(boolean translucent, int depth, int stencil) 
{ 
    /* By default, GLSurfaceView() creates a RGB_565 opaque surface. 
    * If we want a translucent one, we should change the surface's 
    * format here, using PixelFormat.TRANSLUCENT for GL Surfaces 
    * is interpreted as any 32-bit surface with alpha by SurfaceFlinger. 
    */ 
    this.getHolder().setFormat(PixelFormat.RGB_565); 
    if (translucent) 
    { 
     this.getHolder().setFormat(PixelFormat.TRANSLUCENT); 
    } 

    setEGLContextFactory(new ContextFactory()); 

    /* We need to choose an EGLConfig that matches the format of 
    * our surface exactly. This is going to be done in our 
    * custom config chooser. See ConfigChooser class definition 
    * below. 
    */ 
    setEGLConfigChooser(translucent ? 
         new ConfigChooser(8, 8, 8, 8, depth, stencil) : 
         new ConfigChooser(5, 6, 5, 0, depth, stencil)); 

    setRenderer(new Renderer()); 
} 
+0

Như bạn có thể thấy từ câu hỏi của tôi, tôi đặt PixelFormat.TRANSLUCENT. –

+0

Bạn có đặt nó là 8888 không? –

+0

Có, cũng đã thử điều này. Nhưng tài liệu đề cập đến PixelFormat.TRANSLUCENT phải được đặt. –

1

Bạn đã từng nghĩ đến việc sử dụng một số LayerDrawable với setAlpha? Dưới đây là một ví dụ tôi có hai hình ảnh ... một là minh bạch (bởi setAlpha) và một là không. 'Calendar_cell' là rắn và nằm ở mặt sau, sau đó đi kèm hộp trong suốt để hiển thị ô lịch đằng sau nó. Bằng cách này, bạn có thể xếp chồng nhiều hình ảnh như bạn muốn cho tất cả chúng một sự minh bạch khác nhau.

Drawable []layers = new Drawable [2]; 
int imageResource1 = mContext.getResources().getIdentifier("drawable/calendar_cell", null, mContext.getPackageName()); 
Drawable background = v.getResources().getDrawable(imageResource1); 
         layers [0]= background; 

int imageResource = mContext.getResources().getIdentifier("drawable/box_" + box, null, mContext.getPackageName()); 
Drawable boxImg = v.getResources().getDrawable(imageResource); 
    boxImg.setAlpha(100); 
    layers [1]= boxImg; 

LayerDrawable layerDrawable = new LayerDrawable (layers); 
v.setBackground(layerDrawable) 
Các vấn đề liên quan