Android OpenGL:如何更改附加到纹理的位图?

时间:2015-05-21 12:08:00

标签: android opengl-es

我已经创建了这样的纹理

private void FillCombobox2()
{
    string S = ConfigurationManager

    // TSQL-Statement
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandText = ("SELECT DISTINCT Monat from tblSales");            
    //SqlDataReader myReader;
    try
    {
        con.Open();
     SqlDataAdapter ad = new SqlDataAdapter(cmd);
     DataTable dt = new DataTable();
            ad.Fill(dt)             
            combobox1.DisplayMember = "Monat";
            combobox1.ValueMember = "Monat";
            combobox1.DataSource = dt;
            combobox1.SelectedIndex = -1;

        }

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        con.Close();
    }
}

现在,根据用户输入,我想使用新的public int createTexture(Bitmap bitmap){ final int[] textureHandle = new int[1]; GLES20.glGenTextures(1, textureHandle, 0); glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]); glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); // Load the bitmap into the bound texture. GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); return textureHandle[0]; } 更新Texture。我尝试用不同的Bitmap调用相同的函数,但它没有得到更新。我在这里做错了吗?

修改

我试着像汤米在他的回答中说的那样但是毫无用处。让我详细说明我如何使用纹理。

Bitmap

public void changeFilter(){ //create required bitmap here if(mTextureDataHandle1==0) mTextureDataHandle1 =loadTexture(bitmap); else updateTexture(mTextureDataHandle1); }

onDrawFrame

3 个答案:

答案 0 :(得分:4)

该方法都会创建一个新纹理并向其上传<form id="SendForm" class="SendMsg" role="form" method="post" action="sendmessagefriend.php"> <input type="text" id="s_firstname" name="s_firstname" class="MsgInputHidden" value="<?= $_SESSION["user"]["firstname"] ?>" /> <input type="text" id="s_lastname" name="s_lastname" class="MsgInputHidden" value="<?= $_SESSION["user"]["lastname"] ?>" /> <input type="text" id="sender" name="sender" class="MsgInputHidden" value="<?= $_SESSION["user"]["id"] ?>" /> <input type="text" id="r_firstname" name="r_firstname" class="MsgInputHidden"value="<?= $FriendName->firstname ?>" /> <input type="text" id="r_lastname" name="r_lastname" class="MsgInputHidden"value="<?= $FriendName->lastname ?>" /> <input type="text" id="recipient" name="recipient" class="MsgInputHidden" value="<?= $FriendName->id ?>" /> <input type="text" id="ip" name="ip" class="MsgInputHidden" value="<?= $_SERVER["REMOTE_ADDR"] ?>" /> <input type="text" id="date" name="date" class="MsgInputHidden" value="<?= date('Y-m-d') ."\n" ?>" /> <?php $now = time(); $utc_time = $now - intval(date('Z', $now)); ?> <input type="text" id="time" name="time" class="MsgInputHidden" value="<?= '' . date('H:i:s', $now) . '' ?>" /> <input id="message" type="text" name="message" style="width: 100%; overflow: scroll;"> <input id="submit" class="submit" type="submit" name="submit" value="Submit" /> </form>。听起来你想做第二件事而不是第一件事吗?如果是,那么提供Bitmap纹理名称作为参数而不是作为结果接收它,并直接跳到int(即省略glBindTexure,这是创建新纹理的原因)。

E.g。

glGenTextures

所以你上传public int createTexture(Bitmap bitmap){ final int[] textureHandle = new int[1]; GLES20.glGenTextures(1, textureHandle, 0); glBindTexture(GLES20.GL_TEXTURE_2D, textureName); glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); updateTexture(textureHandle[0], bitmap); return textureHandle[0]; } public void updateTexture(int textureName, Bitmap bitmap) { glBindTexture(GLES20.GL_TEXTURE_2D, textureName); // Load the bitmap into the bound texture. GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); } 的位从你创建纹理的位中设置出来并设置其过滤类型;要使用之前获得的Bitmap更新现有纹理,请直接调用int

答案 1 :(得分:1)

更改位图时,您可能根本不在OpenGL渲染线程上。当您更改位图时,保存在您执行此操作的布尔值中,然后仅在渲染线程中调用texImage2D。

答案 2 :(得分:1)

我在上面的回答中尝试了这些技巧我的表现很糟糕。如果你想要的是更新纹理 live ,如60 fps 那么有更好的方法。顺便说一下,我没有找到相关文件,我不得不从不同来源拼凑起来。

(1)你必须告诉OpenGL扩展使用外部纹理。这是在定义纹理而不是使用GLES20.GL_TEXTURE0时使用 GLES11Ext.GL_TEXTURE_EXTERNAL_OES

(2)你必须使用Surface和SurfaceTexture类。 (更深入地了解消费者和生产者。他们的工作方式类似于服务器/客户端,但体系结构称为消费者/生产者)

(3)您必须在片段着色器上启用扩展名。您不能使用sampler2D,您必须使用 samplerExternalOES 。要启用扩展程序,请将以下行放在着色器代码的顶部:

  

#extension GL_OES_EGL_image_external:require

Code snapshot

以上是我的代码的快照,下面是片段着色器

Fragment shader