0

我正在开发一个使用 opengl 1.1 的游戏。我希望使用 opengl 将纹理直接打印到 2D 屏幕上。我才刚刚开始。我在这个位置关注博客文章:

http://quirkygba.blogspot.com/2010/10/android-native-coding-in-c.html

不过,我无法让它工作。附上一大段代码,应该在屏幕上打印一些东西。什么都会好的。现在它只打印黑色。如果我取消注释“glClearColor”和“glClear”行,我可以获得屏幕颜色,所以我知道我可以调用 opengl 命令并让它工作。就好像“glDrawTexiOES”不起作用。我正在使用 ndk 7b,并且已经在模拟器以及 2.2 和 2.3 设备上进行了测试。任何帮助,将不胜感激。

// Android.mk file ////////////////////////

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := something
LOCAL_CFLAGS    := -Werror 
LOCAL_SRC_FILES := something.c
LOCAL_LDLIBS    := -llog -lGLESv1_CM 

include $(BUILD_SHARED_LIBRARY)

// something.c ////////////////////////////////

//some other includes here.
#include <GLES/gl.h>
#include <GLES/glext.h>

#define  LOG_TAG              "something-jni"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define RGB565(r, g, b)  (((r) << (5+6)) | ((g) << 6) | (b))

#define TRUE 1
#define FALSE 0 

#define TEX_WIDTH   256
#define TEX_HEIGHT  256

#define TEX_DIMENSION   256

static uint16_t *pixbuf = NULL;
static GLuint   texture;
static int screen_width, screen_height;

static void check_gl_error(const char* op)
{
    GLint error;
    for (error = glGetError(); error; error = glGetError())
    LOGE("after %s() glError (0x%x)\n", op, error);
}



void init(void)
{
    int i;
    int tex_width, tex_height;


    tex_width = TEX_WIDTH;
    tex_height = TEX_HEIGHT;

    GLint crop[4] = { 0, tex_height, tex_width, - tex_height };

    pixbuf = malloc(tex_width * tex_height * 2);
        for (i = 0; i < TEX_DIMENSION * TEX_DIMENSION ; i ++ ) {
        pixbuf[i] = 0xffff;//RGB565(0xf,0,0);
    }

    glEnable(GL_TEXTURE_2D);

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);

    glTexParameterf( GL_TEXTURE_2D,
        GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    check_gl_error("glTexParameteri");

    glTexParameterf( GL_TEXTURE_2D,
            GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    check_gl_error("glTexParameteri");

    glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
    check_gl_error("glTexParameteriv");

    glShadeModel(GL_FLAT);
    check_gl_error("glShadeModel");

    glTexImage2D(GL_TEXTURE_2D, 0, 
        GL_RGB, 
        tex_width, tex_height, 
        0, 
        GL_RGB,
        GL_UNSIGNED_SHORT_5_6_5, 
        pixbuf);
    check_gl_error("glTexImage2D");


    glDisable(GL_BLEND);
    glDisable(GL_DITHER);
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_FOG);
    glDisable(GL_LIGHTING);
    glDisable(GL_ALPHA_TEST);
    glDisable(GL_COLOR_LOGIC_OP);
    glDisable(GL_COLOR_MATERIAL);
    glDisable(GL_STENCIL_TEST);

    glDepthMask(GL_FALSE);
    check_gl_error("glDepthMask");

    glDisable(GL_CULL_FACE);
    check_gl_error("glDisable");

    //glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
    //glClear(GL_COLOR_BUFFER_BIT);
    glDrawTexiOES(0, 0, 0, screen_width, screen_height);

    check_gl_error("glDrawTexiOES");

}

// JNI methods for something.c ////////////////


JNIEXPORT void JNICALL Java_org_..._Panel_JNIinit(JNIEnv * env, jobject  obj, jint w, jint h)
{
    //screen_width = w;
    //screen_height = h;
    init();

}

正如我所说,任何帮助将不胜感激。

4

2 回答 2

0

你确定你的纹理尺寸是2的幂吗?

于 2012-05-02T15:23:23.627 回答
0

除非您有一些未与我们共享的代码,否则我注意到的第一件事是您不会在任何地方创建 OpenGL 上下文或表面。您应该研究如何在 Android NDK 中使用 EGL。

于 2014-06-08T16:42:57.330 回答