テクスチャを動的に生成し、NDKを使ってそれをクワッドにマッピングする簡単なプログラムを試しました。エミュレータではすべて正常ですが、実際のデバイスでは失敗しました。ここ は私のコードです:実際のデバイスでOpenGL ESでテクスチャをマッピングできない
private static class Renderer implements GLSurfaceView.Renderer
{
@Override
public void onDrawFrame(GL10 gl)
{
nativeDrawFrame();
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
{
nativeInit(width, height);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
// do nothing...
}
}
とネイティブコード:画面上の領域には、その色を変え続けて:それはちょうど私が期待どおりに動作エミュレータ上
const static GLfloat vertices_f[4][2] =
{
{ 0.0f, 0.0f },
{ 100.0f, 0.0f },
{ 100.0f, 100.0f },
{ 0.0f, 100.0f }
};
const static GLfloat texCoords_f[4][2] =
{
{ 0.0f, 0.0f },
{ 1.0f, 0.0f },
{ 1.0f, 1.0f },
{ 0.0f, 1.0f }
};
JNIEXPORT void JNICALL Java_com_sangfor_gltest_GLView_nativeInit(JNIEnv * env, jobject obj, jint width, jint height)
{
if (!bitmap)
{
// allocate dynamic texture memory
bitmap = memalign(16, 1024*1024);
if (!bitmap)
{
__android_log_print(ANDROID_LOG_ERROR, "native-render", "failed allocation.");
return;
}
}
glViewport(0, 0, width, height);
//glMatrixMode(GL_PROJECTION);
//glLoadIdentity();
//glOrthox(0, 0x10000, 0, 0x10000, 0x10000, -0x10000);
//glClearColorx(0, 0, 0, 0);
glGenTextures(1, &texture);
__android_log_print(ANDROID_LOG_INFO, "native-render", "texture = %d", texture);
// glVertexPointer(2, GL_FIXED, 0, vertices);
// glTexCoordPointer(2, GL_FIXED, 0, texCoords);
//glEnableClientState(GL_COLOR_ARRAY);
glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
glEnable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
JNIEXPORT void JNICALL Java_com_sangfor_gltest_GLView_nativeDrawFrame(JNIEnv * env, jobject obj)
{
struct timeval tv;
unsigned char color_value;
glClear(GL_COLOR_BUFFER_BIT);
// fill texture according to current timestamp
gettimeofday(&tv, NULL);
color_value = (unsigned char)(tv.tv_usec * 0.000255f);
memset(bitmap, color_value, 1024*1024);
__android_log_print(ANDROID_LOG_INFO, "native-render", "color_value = %d", color_value);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, bitmap);
glBindTexture(GL_TEXTURE_2D, texture);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords_f);
glVertexPointer(2, GL_FLOAT, 0, vertices_f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glFlush();
}
。 しかし、実際のデバイス(Samsung Galaxy S 2.3.3とAsus Transformer TF101 3.2.1)で実行すると、白いブロックが表示され、テクスチャマッピングが機能していないようです。
私は追加してコメントアウト投影変換、glEnable(GL_TEXTURE_2D)
を呼び出すことにより、テクスチャマッピングを可能にする、glDisable(...)
を呼び出すことにより、アルファブレンディングとテストを無効にし、機能をinitにglBindTexture
とglTexImage2D
を移動し、32×32が、これらの作品のどれにテクスチャサイズを変更してみました。
実際のデバイスだけでテクスチャマッピングが失敗する理由を知る手助けができますか? GPUの制限などはありますか?
EDIT:私はスプーンの提案を試みて、実際の問題を発見しました。どのテクスチャをバインドしても、デバイスはテクスチャを使用してクワッドをレンダリングするので、glBindTexture(GL_TEXTURE_2D, 0)
は正常に動作しますが、glBindTexture(GL_TEXTURE_2D, 1)
と返されるものはすべてglGenTextures(...)
で返されません。つまり、1つのテクスチャしか保存できませんが、2つ以上使用する必要があります。
感謝。私は 'glGenTextures()'によって返された値をチェックしました。それは10万を超える乱数を投げた。私は手動で供給された番号0を使用し、それは働いた! [documentation](http://www.khronos.org/opengles/documentation/opengles1_0/html/glBindTexture.html)によると、0は各テクスチャのデフォルトテクスチャを表す予約テクスチャ名と思われます_と_はバインドされています初期化時にはそのために1を試しましたが、失敗しました。 –
問題が解決しない場合は、EDITを参照してください。 –
'init()'では、 'glGenTexture'の後に' glBindTexture() 'を呼び出すか、手動でIDを割り当ててから、テクスチャパラメータを設定する必要があります。これはおそらく、最初のテクスチャ以外のテクスチャパラメータを設定していないので、うまくいかない理由です。私の答えを私の実装に加えました。私のものはすべてJavaですが、それは問題ではありません。 2.3.4を実行している火の火の上で動作します。 –