OpenGL的Andr​​oid上 - 纹理映射 - 只有左上角像素可见 [英] OpenGL on Android - Texture Mapping - Only top left pixel visible

查看:105
本文介绍了OpenGL的Andr​​oid上 - 纹理映射 - 只有左上角像素可见的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在玩OpenGL ES的Andr​​oid和不知我的纹理总是充满了左上角最像素的颜色。我想的标志是错误的,但我已经尝试了很多的逻辑组合,似乎它没有任何区别。

为什么质感表现得像这样吗?什么是位(标志确实是位)我缺少什么?谢谢

 公共无效loadGLTexture(GL10 GL,上下文的背景下){
    位图位图= BitmapFactory.de codeResource(context.getResources(),RESOURCEID);    gl.glGenTextures(1,纹理,0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D,纹理[0]);    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);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_CLAMP_TO_EDGE);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV,GL10.GL_TEXTURE_ENV_MODE,GL10.GL_REPLACE);    GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,位图,0);    bitmap.recycle();
}公共无效画(GL10 GL){
    //绑定pviously生成的纹理的$ P $
    gl.glBindTexture(GL10.GL_TEXTURE_2D,纹理[0]);    ((GL11Ext)GL).glDrawTexfOES(position.getX(),position.getY(),0,宽度,高度);
}

的表面被设置为

  gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearColor(0.0,0.0,0.0,0.5F);
gl.glClearDepthf(1.0F);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);


解决方案

显然质感裁剪矩形已被明确地设置:

  INT cropWorkspace [] =新INT [4];
最后BitmapFactory.Options选项=新BitmapFactory.Options();
options.in preferredConfig = Bitmap.Config.RGB_565;
cropWorkspace [0] = 0;
cropWorkspace [1] =高度;
cropWorkspace [2] =宽度;
cropWorkspace [3] = -height;((GL11)GL).glTexParameteriv(GL10.GL_TEXTURE_2D,GL11Ext.GL_TEXTURE_CROP_RECT_OES,cropWorkspace,0);

I've been playing with OpenGL ES Android and somehow my textures are always filled with the color of the the top left-most pixel. I suppose the flags are wrong, but I've tried a many logical combinations and it does not seem to make any difference.

Why would the texture behave like so? What's the bit (flag bit indeed) that am I missing? Thanks

public void loadGLTexture(GL10 gl, Context context) {
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId);

    gl.glGenTextures(1, textures, 0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    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);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

    bitmap.recycle();
}

public void draw(GL10 gl) {
    // bind the previously generated texture
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    ((GL11Ext) gl).glDrawTexfOES(position.getX(), position.getY(), 0, width, height);
}

the surface is set to

gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

解决方案

Obviously texture crop rectangle has to be explicitly set:

int cropWorkspace[] = new int[4];
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
cropWorkspace[0] = 0;
cropWorkspace[1] = height;
cropWorkspace[2] = width;
cropWorkspace[3] = -height;

((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, cropWorkspace, 0);

这篇关于OpenGL的Andr​​oid上 - 纹理映射 - 只有左上角像素可见的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆