Tôi chỉ đang học cách làm việc với OpenGL ES 2.0 dành cho Android. Tôi đã cố gắng chỉ đơn giản là hiển thị một kết cấu ở giữa màn hình, đủ dễ dàng, nhưng tôi dường như không thể có được Alpha alpha hoạt động đúng cách. Hình ảnh sẽ hiển thị với nền đen hoặc toàn bộ hình ảnh sẽ được pha trộn thành màu nền một chút, tùy thuộc vào cài đặt tôi sử dụng.Kênh alpha alpha OpenGL ES 2.0
Các hướng dẫn thực tế mà tôi đã theo dõi để không bao giờ làm việc với tính minh bạch, vì vậy tôi đã cố gắng làm việc trong mã tôi đã tìm thấy bằng cách tìm kiếm xung quanh, và có khả năng vừa bỏ lỡ một bước quan trọng. Tôi đã tìm kiếm khá nhiều để tìm ra vấn đề này mặc dù, và tôi đã không nhìn thấy bất kỳ câu trả lời đã có một cái gì đó thiết lập của tôi không. Tôi đã thử mọi sự kết hợp của glBlendFunc và những gì không có may mắn.
Tôi đoán nếu tôi cố gắng dán tất cả mã có thể liên quan đến điều này, câu hỏi có vẻ rất cồng kềnh, vì vậy tôi sẽ sẵn lòng đăng bất kỳ mã nào bạn yêu cầu. Tôi rất cảm kích mọi ý tưởng cho những gì tôi nên thử tiếp theo.
EDIT :: Đây là trình đổ bóng phân đoạn của tôi, đó là điều tôi cho là nguyên nhân. Đây là phần duy nhất mà tôi chưa bao giờ thực sự tìm thấy một ví dụ phù hợp để làm việc với tính minh bạch, và mọi thứ khác phù hợp với những gì tôi đã thấy ở nơi khác.
final String fragmentShader =
"precision mediump float; \n"
+ "varying vec2 v_Color; \n"
+ "uniform sampler2D s_baseMap; \n"
+ "void main() \n"
+ "{ \n"
+ " vec4 baseColor; \n"
+ " baseColor = texture2D(s_baseMap, v_Color); \n"
+ " gl_FragColor = baseColor; \n"
+ "} \n";
Nó không bao giờ làm bất cứ điều gì với alpha rõ ràng, nó là từ một ví dụ mà không sử dụng nó sau khi tất cả, nhưng tôi vẫn không biết nhiều về bóng đổ mảnh và bởi vì nó dường như "loại" làm việc khi nó pha trộn hình ảnh vào nền, tôi figured nó đã được làm việc với alpha trong một số hình thức và tôi chỉ có một cái gì đó đặt sai.
EDIT :: Đây là phương thức "loadTexture". Nó gần như giống như ví dụ từ cuốn sách OpenGL ES 2.0 mà tôi đang cố gắng học hỏi, với một vài thay đổi dường như làm cho hình ảnh gần hơn để hoạt động đúng cách.
private int loadTexture (InputStream is)
{
int[] textureId = new int[1];
Bitmap bitmap;
bitmap = BitmapFactory.decodeStream(is);
byte[] buffer = new byte[bitmap.getWidth() * bitmap.getHeight() * 4];
for (int y = 0; y < bitmap.getHeight(); y++)
for (int x = 0; x < bitmap.getWidth(); x++)
{
int pixel = bitmap.getPixel(x, y);
buffer[(y * bitmap.getWidth() + x) * 4 + 0] = (byte)((pixel >> 16) & 0xFF);
buffer[(y * bitmap.getWidth() + x) * 4 + 1] = (byte)((pixel >> 8) & 0xFF);
buffer[(y * bitmap.getWidth() + x) * 4 + 2] = (byte)((pixel >> 0) & 0xFF);
}
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(bitmap.getWidth() * bitmap.getHeight() * 4);
byteBuffer.put(buffer).position(0);
GLES20.glGenTextures (1, textureId, 0);
GLES20.glBindTexture (GLES20.GL_TEXTURE_2D, textureId[0]);
GLES20.glTexImage2D (GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, bitmap.getWidth(), bitmap.getHeight(), 0,
GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, byteBuffer);
GLES20.glTexParameteri (GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri (GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri (GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri (GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
return textureId[0];
}
Tôi hiểu mã đang làm gì, nhưng phải thừa nhận rằng nó vẫn làm tôi bối rối vì vậy tôi có thể thiếu điều gì đó hiển nhiên do thiếu kiến thức.
Tôi không thấy bất kỳ phần nào khác trong mã của tôi có vẻ như gây ra vấn đề mà tôi đang gặp phải, nhưng lập trình luôn đầy bất ngờ (Đặc biệt trong thế giới OpenGL) nghĩ điều gì đó khác là nguyên nhân tôi chắc chắn sẽ đăng bài đó cho bạn. Xin lỗi cho tất cả những rắc rối!
Đảm bảo kênh alpha từ PNG được giữ nguyên khi tải ảnh vào kết cấu (thay vì tải ảnh RGB hoặc tạo kết cấu RGB). Và tất nhiên hãy chắc chắn bạn gọi 'glEnable (GL_BLEND)' (ngoài việc thiết lập 'glBlendFunc' đúng). Nhưng một số mã chắc chắn sẽ giúp đỡ nhiều hơn một chút để giúp bạn. Có lẽ chỉ là hình ảnh tải và kết cấu tạo mã và mã nơi bạn thiết lập trạng thái pha trộn. Và tất nhiên, vì bạn mới ở đây, đừng quên thông báo cho chính mình về các tính năng chấp nhận và bỏ phiếu. –
Trình đổ bóng phân đoạn có vẻ hợp lệ, vì nó ủy quyền chính xác độ phân giải của kết cấu cho màu sắc phân đoạn. Vì vậy, bạn sẽ không nhận được xung quanh đăng một số tải của bạn và tạo mã kết cấu. –
Bạn có thể thử 'gl_FragColor = vec4 (baseColor.aaa, 1.0)' với tính năng trộn bị tắt. Điều này sẽ cho bạn hình ảnh màu xám của kênh alpha. – trenki