我已经创建了这样的纹理
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
答案 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
以上是我的代码的快照,下面是片段着色器