У меня есть серия вызовов OpenGL-ES, которые правильно представляют треугольник и текстурируют его с альфой, смешивающейся на эмуляторе (2.0.1). Когда я разжигаю тот же код существующего устройства (Droid 2.0.1), все, что я получаю, белые квадраты.
Это намекает мне, что структуры не загружаются, но я не могу выяснить, почему они не загружаются. Все мои структуры являются 32-разрядным PNGs с альфа-каналами под res/raw, таким образом, они не оптимизированы на sdk документы.
Вот то, как я загружаю свои структуры:
private void loadGLTexture(GL10 gl, Context context, int reasource_id, int texture_id)
{
//Get the texture from the Android resource directory
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), reasource_id, sBitmapOptions);
//Generate one texture pointer...
gl.glGenTextures(1, textures, texture_id);
//...and bind it to our array
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[texture_id]);
//Create Nearest Filtered Texture
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
//Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
//Use the Android GLUtils to specify a two-dimensional texture image from our bitmap
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
//Clean up
bitmap.recycle();
}
Вот то, как я представляю структуру:
//Clear
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
//Enable vertex buffer
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
//Push transformation matrix
gl.glPushMatrix();
//Transformation matrices
gl.glTranslatef(x, y, 0.0f);
gl.glScalef(scalefactor, scalefactor, 0.0f);
gl.glColor4f(1.0f,1.0f,1.0f,1.0f);
//Bind the texture
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[textureid]);
//Draw the vertices as triangles
gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);
//Pop the matrix back to where we left it
gl.glPopMatrix();
//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
И вот опции, которые я включил:
gl.glShadeModel(GL10.GL_SMOOTH); //Enable Smooth Shading
gl.glEnable(GL10.GL_DEPTH_TEST); //Enables Depth Testing
gl.glDepthFunc(GL10.GL_LEQUAL); //The Type Of Depth Testing To Do
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA);
Править: Я просто попытался предоставить BitmapOptions к BitmapFactory.decodeResource () вызов, но это, кажется, не устраняет проблему, несмотря на ручную установку того же preferredconfig, плотности и targetdensity.
Edit2: Согласно просьбе вот снимок экрана работы эмулятора. Базовые треугольники показывают с круговой структурой, представленной на него, прозрачность работает, потому что Вы видите черный фон.
удаленная мертвая ссылка ImageShack
Вот выстрел того, что Droid делает с тем же самым кодом его:
удаленная мертвая ссылка ImageShack
Edit3: Вот мои BitmapOptions, обновил вызов выше с тем, как я теперь называю BitmapFactory, тем не менее те же результаты как указано ниже: sBitmapOptions.inPreferredConfig = Битовый массив. Конфигурация. RGB_565;
sBitmapOptions.inDensity = 160;
sBitmapOptions.inTargetDensity = 160;
sBitmapOptions.inScreenDensity = 160;
sBitmapOptions.inDither = false;
sBitmapOptions.inSampleSize = 1;
sBitmapOptions.inScaled = false;
Здесь мои вершины, текстурируют провода и индексы:
/** The initial vertex definition */
private static final float vertices[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f
};
/** The initial texture coordinates (u, v) */
private static final float texture[] = {
//Mapping coordinates for the vertices
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f
};
/** The initial indices definition */
private static final byte indices[] = {
//Faces definition
0,1,3, 0,3,2
};
Там должен так или иначе вывести содержание структуры, после того как она была загружена в OpenGL ES? Возможно, я могу сравнить загруженную структуру эмулятора с загруженной структурой существующего устройства?
Я действительно пробовал другой структурой (значок андроида по умолчанию) и снова, он хорошо работает для эмулятора, но не удается представить по фактическому телефону.
Edit4: Попробованное передвижение, когда я действительно текстурирую загрузку. Никакая удача. Испытанное использование постоянного смещения 0 к glGenTextures, никакому изменению.
Есть ли что-то, что я использую это поддержки эмулятора, которые не делает фактический телефон?
Edit5: На Ryan ниже, я изменил размер своей структуры от 200x200 до 256x256, и вопрос НЕ был решен.
Править: Согласно просьбе, добавленный вызовы к glVertexPointer и glTexCoordPointer выше. Кроме того, вот инициализация vertexBuffer, textureBuffer, и indexBuffer:
ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
vertexBuffer = byteBuf.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
byteBuf = ByteBuffer.allocateDirect(texture.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
textureBuffer = byteBuf.asFloatBuffer();
textureBuffer.put(texture);
textureBuffer.position(0);
indexBuffer = ByteBuffer.allocateDirect(indices.length);
indexBuffer.put(indices);
indexBuffer.position(0);
loadGLTextures(gl, this.context);
Я также новый для Android OpenGL ES DEV. У меня есть веха (евро версия для дроида).
Из того, что я вижу так далеко, стреляя несколько учебных приложений из разных книг / веб-сайтов на моей вехой, похоже, что этот телефон работает OpenGL ES другой, чем все другие телефоны Android, выпущенные до сих пор.
Я думаю, что его связанные с расширениями OpenGL поддерживаются на устройстве.
Проверьте эту ссылку для списка поддерживаемых расширений, я уверен, что код GURU найдет, почему именно Droid обрабатывает OpenGL ES таким странным способом.
http://www.rbgrn.net/content/345-hands-on-motorola-droid-opengl-es-specs
Надеюсь, это помогает .. немного
Отредактировано:
Я настраивал Mainifest.xml и заметил при использовании
<uses-sdk android:minSdkVersion="6"/>
Ресурсы вообще не загружаются.
При использовании
<uses-sdk android:minSdkVersion="3"/>
ресурсы загружаются нормально.
Итак, я переключился на
<uses-sdk android:minSdkVersion="6"/>
и изменил способ загружена растровое изображение.
Попробуйте заменить:
//Get the texture from the Android resource directory
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), reasource_id, sBitmapOptions);
с:
InputStream is = context.getResources().openRawResource(your.resource.there);
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(is);
} finally {
//Always clear and close
try {
is.close();
is = null;
} catch (IOException e) {
}
}
Texture загружается штраф на мою веху с этим кодом, надеюсь, что эта работа для вашей!
Я не уверен в том, что такое ваша проблема, я довольно новичок в развитии в целом, но мои проблемы OpenGL Android с разницей между эмулятором и телефоном были:
- может поддерживать размеры не 2 ^ x растровые изображения, телефон не может Распущенный экран в NDK для OpenGL, поэтому мне приходилось использовать негативные координаты для определения вида в эмуляторе, в то время как мой G1 использовал координаты не отрицания.
Надеюсь, это может помочь вам в любом случае.
Я думаю, что, возможно, у вас проблемы с загрузкой текстуры из APK. Попробуйте скопировать текстуру в SDCard и посмотрите, сможете ли вы загрузить ее оттуда.
вы где-нибудь используете интерфейс GL11? GL11 поддерживается не всеми устройствами. а также удалите строку glColor, возможно, ваша текстура отображается, но закрашена цветом? вот фрагмент кода, как я отображаю свои текстуры:
void draw(GL10 gl) {
// Enabled the vertices buffer for writing and to be used during
// rendering.
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// Specifies the location and data format of an array of vertex
// coordinates to use when rendering.
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
GL10.GL_LINEAR);
gl.glBindTexture(GL10.GL_TEXTURE_2D, myTextureId);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
gl.glDrawArrays(drawMode, 0, verticesCount);
gl.glDisable(GL10.GL_TEXTURE_2D);
// Disable the vertices buffer.
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}