Zostałem przypisany do utworzenia portu Java o otwartym kodzie źródłowym tego Objective C GPUImage Framework, dzięki czemu można go używać w aplikacji na Androida. Mam go odtworzyć jak najdokładniej, z wszystkimi nazwami zmiennych, nazwami funkcji itd. Jestem na początkowych etapach i próbuję połączyć GPUImageOpenGLESContext.h i GPUImageOpenGLESContext.m (Przepraszam, będę udostępniać linki, ale jako nowi użytkownicy nie mogę dodać więcej linków).Określanie limitu rozmiaru tekstury maks./min. W systemie Android OpenGLES
Mam problem z tymi metodami
+ (GLint)maximumTextureSizeForThisDevice;
{
GLint maxTextureSize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
return maxTextureSize;
}
+ (GLint)maximumTextureUnitsForThisDevice;
{
GLint maxTextureUnits;
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
return maxTextureUnits;
}
Wydaje się, że w Objective C, można po prostu zadzwonić do tych metod w Javie, ale nie możesz. Zrobiłem trochę wyszukiwania i okazało się, że większość ludzi mówi, że używają GLSurfaceView, ale to wymagałoby działania, prawda? Byłem bardzo podekscytowany, gdy znalazłem to Get Maximum OpenGL ES 2.0 Texture Size Limit on Android, ale odpowiedź twierdzi, że kod nie zadziałałby.
Moje pytanie brzmi: jak mogę uzyskać minimalną i maksymalną teksturę w klasie, która nie jest działaniem? Korzystanie z GLSurfaceView?
Chciałbym również docenić wszelkie sugestie, jak to przelecieć. Nigdy nie przenosiłem niczego z Objective C na Javę, więc każda rada byłaby doceniona!
Jeśli byłoby pomocne, tutaj jest mój bieżący kod:
public class GPUImageOpenGLESContext
{
private static GPUImageOpenGLESContext instance = null;
EGLContext context;
protected GPUImageOpenGLESContext()
{
// This is a protected empty method
// that exists only to prevent
// this singleton object from
// multiple instantiation
return;
}
public enum GPUImageRotationMode {
kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical,
kGPUImageFlipHorizontal, kGPUImageRotateRightFlipVertical, kGPUImageRotate180
}
public GPUImageRotationMode GPUImageRotationSwapsWidthAndHeight(GPUImageRotationMode rotation)
{
// TODO: Implement GPUImageRotationSwapsWidthAndHeight macro as method
//rotation = ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical)
return rotation;
}
public static GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext()
{
if (instance == null)
{
instance = new GPUImageOpenGLESContext();
}
return instance;
}
public static void useImageProcessingContext()
{
EGLContext imageProcessingContext = GPUImageOpenGLESContext.sharedImageProcessingOpenGLESContext().context;
if (EGLContext.getEGL() != imageProcessingContext)
{
// In Objective C, this call would be here:
// [EAGLContext setCurrentContext:imageProcessingContext]
// Cannot figure out how to handle this. For now, throws an exception.
throw new RuntimeException("useImageProcessingContext not equal to EGLContext");
}
return;
}
public static int maximumTextureSizeForThisDevice()
{
int[] maxTextureSize = new int[1];
// TODO: See if you can use gl. without an activity
//GL10 gl = new GL10();
//EGL gl = EGLContext.getEGL();
//gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);
return maxTextureSize[0];
}
public static int maximumTextureUnitsForThisDevice()
{
// TODO: Implement maximumTextureUnitsForThisDevice();
return -1;
}
public static CGSize sizeThatFitsWithinATextureForSize(CGSize inputSize)
{
int maxTextureSize = maximumTextureSizeForThisDevice();
if ((inputSize.width < maxTextureSize) && (inputSize.height < maxTextureSize))
{
return inputSize;
}
CGSize adjustedSize = new CGSize();
if (inputSize.width > inputSize.height)
{
adjustedSize.width = (float)maxTextureSize;
adjustedSize.height = ((float)maxTextureSize/inputSize.width) * inputSize.height;
}
else
{
adjustedSize.height = (float)maxTextureSize;
adjustedSize.width = ((float)maxTextureSize/inputSize.height) * inputSize.width;
}
return adjustedSize;
}
public EGLContext getContext()
{
if (context == null)
{
// TODO: Implement getContext()
}
}
public interface GPUImageInput
{
public void newFrameReadyAtTime(Time frameTime);
public void setInputTextureAtIndex(int newInputTexture, int textureIndex);
public int nextAvailableTextureIndex();
public void setInputSizeAtIndex(CGSize newSize, int textureIndex);
public void setInputRotationAtIndex(GPUImageRotationMode newInputRotation, int textureIndex);
public CGSize maximumOutputSize();
public void endProcessing();
public boolean shouldIgnoreUpdatesToThisTarget();
}
}
Po zakończeniu, daj znać tej osobie: http://stackoverflow.com/questions/11405207/gpuimage-port-for-android –
Czy próbowałeś GLES20.glGetIntegerv (GLES20.GL_MAX_TEXTURE_SIZE, rozmiar, 0); ? – cleuton