public void initDisplay(final Activity activity, int width, int height) {
...
createImageReader();
mMainHandler.post(() -> {
createVirtualDisplay();
});
}
protected void createImageReader() {
mImageReaderLock.lock();
try {
_imagePreviewReader = ImageReader.newInstance(mTextureWidth, mTextureHeight, PixelFormat.RGBA_8888, 2);
_imagePreviewReader.setOnImageAvailableListener(this, mMainHandler);
mSurface = _imagePreviewReader.getSurface();
} finally {
mImageReaderLock.unlock();
}
}
protected void createVirtualDisplay() {
int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY; // | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;
//int density = DisplayMetrics.DENSITY_DEVICE_STABLE;
// display metrics
DisplayMetrics metrics = mMainActivity.getResources().getDisplayMetrics();
int density = metrics.densityDpi;
virtualDisplay = displayManager.createVirtualDisplay("virtual_draw",
mTextureWidth, mTextureHeight, density, mSurface, flags);
presentation = new Presentation(this.mMainActivity, virtualDisplay.getDisplay());
myView = internalCreate(this.mMainActivity);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(mTextureWidth, mTextureHeight);
presentation.setContentView(myView, layoutParams);
presentation.show();
myView.setFocusable(true);
myView.setFocusableInTouchMode(true);
myView.requestFocus();
}
public int updateTexture() {
/*
if (mFrameAvailable) {
if (!Thread.currentThread().getName().equals("UnityMain")) {
Log.e(TAG, "Not called from render thread and hence update texture will fail");
throw new RuntimeException("Not called from render thread and hence update texture will fail ( " + Thread.currentThread().getName() + " )");
} else
{
//mSurfaceTexture.updateTexImage();
mFrameAvailable = false;
}
}
*/
synchronized (this) {
if (mFrameUpdated) {
mFrameUpdated = false;
}
GLES32.glActiveTexture(GLES32.GL_TEXTURE0);
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, mUnityTextureID);
Image image = _imagePreviewReader.acquireLatestImage();
if (image != null) {
Buffer buffer = image.getPlanes()[0].getBuffer();
/*
this code work
Bitmap bitmap = Bitmap.createBitmap(mTextureWidth, mTextureHeight, Bitmap.Config.ARGB_8888);
bitmap.eraseColor(Color.GREEN);
Canvas canvas = new Canvas(bitmap);
mP.setColor(Color.argb(255, mRnd.nextInt(255), mRnd.nextInt(255), mRnd.nextInt(255)));
int radius = mRnd.nextInt(100);
canvas.drawCircle(mRnd.nextInt(mTextureWidth), mRnd.nextInt(mTextureHeight), radius, mP);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,0, bitmap, 0);
*/
GLES30.glTexSubImage2D(GLES30.GL_TEXTURE_2D, 0, 0, 0, mTextureWidth, mTextureHeight, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, buffer);
image.close();
}
// mSurfaceTexture.updateTexImage();
return mUnityTextureID;
}
}
3 недели назад мой код работал на смартфоне Android, но 2 недели назад я попробовал его в шлеме мета-квеста, и дисплей был чересстрочным, затем я попытался найти ошибку и изменил мой код, и поскольку у меня черный экран (смартфон и квест), то же самое, если я напишу исходный код.
Я попробовал любой тест, чтобы исключить другие причины, связанные с передачей кода изображение на моей текстуре, это работает.
во-первых, я хотел бы иметь возможность найти исходное отображение моего представления, я думаю, что в первую очередь ошибка связана либо с ImageReader, либо с виртуальным дисплеем. потому что я не нашел способа их проверить.
//int density = DisplayMetrics.DENSITY_DEVICE_STABLE; // display metrics DisplayMetrics metrics = mMainActivity.getResources().getDisplayMetrics(); int density = metrics.densityDpi;
public int updateTexture() { /* if (mFrameAvailable) { if (!Thread.currentThread().getName().equals("UnityMain")) { Log.e(TAG, "Not called from render thread and hence update texture will fail"); throw new RuntimeException("Not called from render thread and hence update texture will fail ( " + Thread.currentThread().getName() + " )"); } else { //mSurfaceTexture.updateTexImage(); mFrameAvailable = false; } } */ synchronized (this) { if (mFrameUpdated) { mFrameUpdated = false; }
[/code] 3 недели назад мой код работал на смартфоне Android, но 2 недели назад я попробовал его в шлеме мета-квеста, и дисплей был чересстрочным, затем я попытался найти ошибку и изменил мой код, и поскольку у меня черный экран (смартфон и квест), то же самое, если я напишу исходный код. Я попробовал любой тест, чтобы исключить другие причины, связанные с передачей кода изображение на моей текстуре, это работает. во-первых, я хотел бы иметь возможность найти исходное отображение моего представления, я думаю, что в первую очередь ошибка связана либо с ImageReader, либо с виртуальным дисплеем. потому что я не нашел способа их проверить.