Изображение не отображается должным образом с помощью OpenGL в Android ndk - PullRequest
1 голос
/ 01 февраля 2012

Я пытаюсь отобразить изображение с помощью OpenGL ES через Android NDK. Я пытаюсь просто прочитать двоичный файл данных RGB размером 90x72.и пытается отобразить это изображение на эмуляторе ... Но изображение outpu это .. enter image description here

, а реальное изображение - enter image description here

Я не знаю, в чем проблема вмой код ... мой код JNI выглядит следующим образом ..

#include "com_example_sample_GlBufferView.h"
#include <GLES/gl.h>
#include <GLES/glext.h>
#include <string.h>
#include <pthread.h>
#include <android/log.h>
#include <stdio.h>
#include <time.h>

#define TEXTURE_WIDTH  256
#define TEXTURE_HEIGHT 128
#define MY_SCREEN_WIDTH  90
#define MY_SCREEN_HEIGHT 72

#define SB_PIXELS_SIZE (sizeof(sb_data[0]) * MY_SCREEN_WIDTH * MY_SCREEN_HEIGHT*3)

static int s_w;
static int s_h;
static pthread_cond_t s_vsync_cond;
static pthread_mutex_t s_vsync_mutex;
static GLuint s_texture;

FILE *fp;

static unsigned char *sb_data=0;

static void render_bytes(unsigned char *pixels)
{
    int x, y;
        int idx=0;
         fp=fopen("/data/123","rb");
         if(fp!=NULL)
            {
                fread(pixels,1,19584,fp);
                fclose(fp);
            }

}
static void wait_vsync()
{
       pthread_mutex_lock(&s_vsync_mutex);
       pthread_cond_wait(&s_vsync_cond, &s_vsync_mutex);
       pthread_mutex_unlock(&s_vsync_mutex);
}

JNIEXPORT void JNICALL Java_com_example_sample_GlBufferView_native_1start(JNIEnv * env, jobject obj)
{
       /* init conditions */
       pthread_cond_init(&s_vsync_cond, NULL);
       pthread_mutex_init(&s_vsync_mutex, NULL);
       sb_data=(unsigned char *)malloc(SB_PIXELS_SIZE);
       int incr = 1;
       while (1) {

               /* game code goes here */
               wait_vsync();
       }
}
JNIEXPORT void JNICALL  Java_com_example_sample_GlBufferView_native_1gl_1resize(JNIEnv * env, jobject obj, jint w, jint h)
{
       glEnable(GL_TEXTURE_2D);
       glDisable(GL_BLEND);
       glGenTextures(1, &s_texture);
       glBindTexture(GL_TEXTURE_2D, s_texture);
       glTexParameterf(GL_TEXTURE_2D,
                       GL_TEXTURE_MIN_FILTER, GL_LINEAR);
       glTexParameterf(GL_TEXTURE_2D,
                       GL_TEXTURE_MAG_FILTER, GL_LINEAR);

       glShadeModel(GL_SMOOTH);
       glColor4x(0x10000, 0x10000, 0x10000, 0x10000);

       int rect[4] = {0, TEXTURE_HEIGHT, TEXTURE_WIDTH, -TEXTURE_HEIGHT};
       glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
       glTexImage2D(GL_TEXTURE_2D,             /* target */
                       0,                      /* level */
                       GL_RGB,                 /* internal format */
                       TEXTURE_WIDTH,          /* width */
                       TEXTURE_HEIGHT,         /* height */
                       0,                      /* border */
                       GL_RGB,                 /* format */
                       GL_UNSIGNED_BYTE,/* type */
                       NULL);                  /* pixels */
       /* store the actual width of the screen */
       s_w = w;
       s_h = h;
}
JNIEXPORT void JNICALL Java_com_example_sample_GlBufferView_native_1gl_1render(JNIEnv * env, jobject obj)
{
       memset(sb_data, 0, SB_PIXELS_SIZE);

       render_bytes(sb_data);
       glClear(GL_COLOR_BUFFER_BIT);

       glTexSubImage2D(GL_TEXTURE_2D,          /* target */
                            0,                      /* level */
                            0,                      /* xoffset */
                            0,                      /* yoffset */
                            MY_SCREEN_WIDTH,        /* width */
                            MY_SCREEN_HEIGHT,       /* height */
                            GL_RGB,                 /* format */
                            GL_UNSIGNED_BYTE, /* type */
                            sb_data);              /* pixels */
       glDrawTexiOES(0, 0, 0, s_w, s_h);
       /* tell the other thread to carry on */
       pthread_cond_signal(&s_vsync_cond);
}

Может кто-нибудь, пожалуйста, скажите мне, где проблема в моем коде ..

Заранее спасибо

1 Ответ

2 голосов
/ 01 февраля 2012

Вы читаете 19584 байта, но ваша текстура составляет 90 * 72 * 3 = 19440 байтов. Ваши пиксели плотно упакованы между строками? Кажется, что вы дополняете два пикселя для каждой строки, или ширина неверна.

...