Позвольте мне предисловие, признав, что я новичок в области открытых технологий - это не что иное, как чудо, которое я сделал так далеко с разработкой игры.
Текстуры отлично выглядят в HTC Evo3d, Droid Bionic и удар молнии.Я только что купил Sprint Samsung Galaxy s2, и текстуры выглядят ужасно - моя теория заключается в том, что экран большего размера и, как следствие, меньший dpi влияет на фильтрацию текстур и магнитов (другая моя теория - я не знаю, что делаю).
Снимок экрана # 1 Galaxy S2 против HTC Evo 3d
Снимок экрана # 2 Galaxy S2 против HTC Evo 3d
Я попытался включить / отключить дизеринг, используя 16-битные, 24-битные и 32-битные текстуры, передавая параметры в метод декодирования Android BitmapFactory для предотвращения масштабирования, отключил все мои настройки opengl в приведенных ниже фрагментах, установил различные комбинацииНастраиваемые значения eglconfig с помощью setEGLConfigChooser, я просто делаю снимки в темноте.
Поэтому мой вопрос: какая функция opengl может быть ответственна за создание цветных полос (?) / плохо выглядящих текстур, которые виделина этих скриншотах?
Также стоит отметить:
- Нет ошибок open gl (я регистрирую каждый вызов open gl)
- Когда я добавляю больше источников света, производительность приложения значительно ухудшается (в то время как htc evo 3d, bionic и thunderbolt прекрасно работают с более чем одним источником света).
- OpenGL ES 1.1 (нет GLES20 да вмое приложение)
- Я использую min 3d framework
- Экран и разрешение:
- HTC Evo 3d: 4,3 "экран 540x960 с разрешением
- Samasung Sprint Galaxy s2: 4,52 "разрешение экрана 800x480
getWindowManager().getDefaultDisplay().getPixelFormat();
// HTC Evo 3d: 1 (PixelFormat.RGBA_8888)
// Sprint Samsung Galaxy s2: 5 (???)
В течение последних трех дней я неистово гуглил, чтобы узнать, есть ли у кого-то еще подобные проблемы и ничего не нашел.Спасибо за ваше время.
//##################
//# setup (one time calls)
//##################
_gl.glEnable(GL11.GL_DITHER);
_gl.glEnable(GL10.GL_DEPTH_TEST);
_gl.glClearDepthf(1.0f);
_gl.glDepthFunc(GL10.GL_LESS);
_gl.glDepthRangef(0, 1f);
_gl.glDepthMask(true);
_gl.glShadeModel(GL10.GL_SMOOTH);
// Alpha enabled
_gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
_gl.glAlphaFunc(GL10.GL_GREATER, 0.1f);
// CCW frontfaces only, by default
_gl.glFrontFace(GL10.GL_CCW);
_gl.glCullFace(GL10.GL_BACK);
_gl.glEnable(GL10.GL_CULL_FACE);
//##################
//# onSurfaceCreated
//##################
// build the lights - note this is specific to the min3d framework but
// its pretty straightforward - if a change is made to a light source the dirty flag is set
// and calls will be made to opengl to udpate accordingly in the onDrawFrame method
Light light1 = new Light();
light1.position.setAll(0, 10, 0);
light1.ambient= new Color4Managed(255, 255, 255, 255, light1);
light1.diffuse = new Color4Managed(255, 255, 255, 255, light1);
light1.specular = new Color4Managed(255, 255, 255, 255, light1);
light1.type(LightType.DIRECTIONAL);
_scene.lights().add(light1);
//##################
//# onSurfaceChanged
//##################
public void onSurfaceChanged(GL10 gl, int w, int h) {
this.w = w;
this.h = h;
_surfaceAspectRatio = (float) w / (float) h;
_gl.glViewport(0, 0, w, h);
// all the following updates the frustum
FrustumManaged vf = _scene.camera().frustum;
float n = vf.shortSideLength() / 2f;
float lt, rt, btm, top;
lt = vf.horizontalCenter() - n * _surfaceAspectRatio;
rt = vf.horizontalCenter() + n * _surfaceAspectRatio;
btm = vf.verticalCenter() - n * 1;
top = vf.verticalCenter() + n * 1;
if (_surfaceAspectRatio > 1) {
lt *= 1f / _surfaceAspectRatio;
rt *= 1f / _surfaceAspectRatio;
btm *= 1f / _surfaceAspectRatio;
top *= 1f / _surfaceAspectRatio;
}
_gl.glFrustumf(lt, rt, btm, top, vf.zNear(), vf.zFar());
Util.out("UPDATE VIEW FRUSTUM _surfaceAspectRatio: " + this._surfaceAspectRatio + " w: " + this.w + " h: " + this.h);
Util.out("UPDATE VIEW FRUSTUM lt: " + lt + " rt: " + rt + " btm: " + btm + " top: " + top + " vf.zNear(): " + vf.zNear() + " vf.zFar(): " + vf.zFar());
// sprint samsung galaxy 2s epic touch 4g
// 09-18 23:41:31.255: INFO/System.out(14069): 2011-09-18 23:41:31> UPDATE VIEW FRUSTUM _surfaceAspectRatio: 0.97959185 w: 480 h: 490
// 09-18 23:41:31.255: INFO/System.out(14069): 2011-09-18 23:41:31> UPDATE VIEW FRUSTUM lt: -0.48979592 rt: 0.48979592 btm: -0.5 top: 0.5 vf.zNear(): 1.0 vf.zFar(): 30.0
// htc evo 3d
// 09-18 23:46:16.744: INFO/System.out(7958): 2011-09-18 23:46:16> UPDATE VIEW FRUSTUM _surfaceAspectRatio: 0.83076924 w: 540 h: 650
// 09-18 23:46:16.754: INFO/System.out(7958): 2011-09-18 23:46:16> UPDATE VIEW FRUSTUM lt: -0.41538462 rt: 0.41538462 btm: -0.5 top: 0.5 vf.zNear(): 1.0 vf.zFar(): 30.0
}
//##################
//# upload texture
//##################
int[] a = new int[1];
_gl.glGenTextures(1, a, 0); // create a 'texture name' and put it in array element 0
_gl.glBindTexture(GL10.GL_TEXTURE_2D, a[0]);
if ($generateMipMap && _gl instanceof GL11) {
_gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL11.GL_TRUE);
}else {
_gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL11.GL_FALSE);
}
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, $bitmap, 0);
//##################
//# onDrawFrame
//##################
// draw setup
_gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// enable or disable lights
if(_scene.lights().isDirty()){
for (int glIndex = 0; glIndex < NUM_GLLIGHTS; glIndex++) {
if (_scene.lights().glIndexEnabledDirty()[glIndex] == true) {
if (_scene.lights().glIndexEnabled()[glIndex] == true) {
_gl.glEnable(GL10.GL_LIGHT0 + glIndex);
_scene.lights().getLightByGlIndex(glIndex).setAllDirty();
} else {
_gl.glDisable(GL10.GL_LIGHT0 + glIndex);
}
_scene.lights().glIndexEnabledDirty()[glIndex] = false; // clear dirtyflag
}
}
_scene.lights().clearDirtyFlag();
}
// handle individual light settings
Light[] lights = _scene.lights().toArray();
for (int i = 0; i < lights.length; i++) {
Light light = lights[i];
if (light.isDirty()) // .. something has changed
{
int glLightId = GL10.GL_LIGHT0 + _scene.lights().getGlIndexByLight(light);
if (light.position.isDirty()) {
light.commitPositionAndTypeBuffer();
_gl.glLightfv(glLightId, GL10.GL_POSITION, light.positionAndTypeBuffer());
light.position.clearDirtyFlag();
}
if (light.ambient.isDirty()) {
light.ambient.commitToFloatBuffer();
_gl.glLightfv(glLightId, GL10.GL_AMBIENT, ligh t.ambient.floatBuffer());
light.ambient.clearDirtyFlag();
}
if (light.diffuse.isDirty()) {
light.diffuse.commitToFloatBuffer();
_gl.glLightfv(glLightId, GL10.GL_DIFFUSE, light.diffuse.floatBuffer());
light.diffuse.clearDirtyFlag();
}
if (light.specular.isDirty()) {
light.specular.commitToFloatBuffer();
_gl.glLightfv(glLightId, GL10.GL_SPECULAR, light.specular.floatBuffer());
light.specular.clearDirtyFlag();
}
if (light.isVisibleBm().isDirty()) {
if (light.isVisible()) {
_gl.glEnable(glLightId);
} else {
_gl.glDisable(glLightId);
}
light.isVisibleBm().clearDirtyFlag();
}
if (light.attenuation().isDirty()) {
_gl.glLightf(glLightId, GL10.GL_CONSTANT_ATTENUATION, light.attenuation().getX());
_gl.glLightf(glLightId, GL10.GL_LINEAR_ATTENUATION, ligh t.attenuation().getY());
_gl.glLightf(glLightId, GL10.GL_QUADRATIC_ATTENUATION, light.attenuation().getZ());
}
light.clearDirtyFlag();
}
}
// finally draw objects (see definition below)
foreach(Object3d $o : _scene.children()){
drawObject($o);
}
//##################
//# draw 3d object
//##################
_gl.glEnable(GL10.GL_LIGHTING);
_gl.glEnable(GL10.GL_TEXTURE_2D);
_gl.glEnable(GL10.GL_ALPHA_TEST);
_gl.glEnable(GL10.GL_BLEND);
_gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
_gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
_gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
$o.vertices().normals().buffer().position(0);
_gl.glNormalPointer(GL10.GL_FLOAT, 0, $o.vertices().normals().buffer());
_gl.glEnable(GL10.GL_CULL_FACE);
// draw texture function info below
drawObject_textures($o);
_gl.glTranslatef($o.position().x, $o.position().y, $o.position().z);
_gl.glRotatef(($o.rotation().x), 1, 0, 0);
_gl.glRotatef(($o.rotation().y), 0, 1, 0);
_gl.glRotatef(($o.rotation().z), 0, 0, 1);
_gl.glScalef($o.scale().x, $o.scale().y, $o.scale().z);
$o.vertices().points().buffer().position(0);
_gl.glVertexPointer(3, GL10.GL_FLOAT, 0, $o.vertices().points().buffer());
$o.faces().buffer().position(pos);
_gl.glDrawElements($o.renderTypeInt(), $o.faces().size() * FacesBufferedList.PROPERTIES_PER_ELEMENT, GL10.GL_UNSIGNED_SHORT,$o.faces().buffer());
//##################
//# draw texture
//##################
int minFilterType = ZoneActivity.mipmap ? GL10.GL_NEAREST_MIPMAP_NEAREST : GL10.GL_NEAREST;
$o.vertices().uvs().buffer().position(0);
_gl.glActiveTexture(GL10.GL_TEXTURE0 );
_gl.glClientActiveTexture(GL10.GL_TEXTURE0);
_gl.glBindTexture(GL10.GL_TEXTURE_2D, $o.glTextureId);
_gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, $o.vertices().uvs().buffer());
_gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, minFilterType);
_gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
_gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
_gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
РЕДАКТИРОВАТЬ: Как оказалось, это был я.То, что казалось проблемой с текстурой, было побочным эффектом передачи неправильных значений в функции тумана (которые, естественно, я пропустил в моих примерах кода).
bad
// I was not converting my rgba shorts to the expected range (0.0f, 1.0f).
// the evo 3d, bionic, etc. must compensate for people like me and translate
// this to white so i never knew there was a problem
_gl.glFogfv(GL10.GL_FOG_COLOR, [255f,255f,255f,255f]);
good
_gl.glFogfv(GL10.GL_FOG_COLOR, [1.0f, 1.0f, 1.0f, 1.0f]);
Вероятно, безопасно закрыть это.