gpt4 book ai didi

Android OpenGLES 2.0 加载更多纹理

转载 作者:行者123 更新时间:2023-11-29 17:48:25 25 4
gpt4 key购买 nike

我想在 OpenGL 中加载多个纹理并使用它们。

这是 TextureLoader,我认为它正确地在 idx 位置加载纹理。

public  int[] texture = new int[10];
public int loadTexture(Context context, int resource,int idx){

GLES20.glGenTextures(idx, texture, 0);

BitmapFactory.Options bo = new BitmapFactory.Options();
Bitmap tex = BitmapFactory.decodeResource(context.getResources(), resource, bo);

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, tex, 0);
tex.recycle();

if(texture[idx] == 0){
// Displays error
}
return texture[idx];

}

这是我的渲染,我不知道如何选择加载的纹理。

      int mPositionHandle = 
GLES20.glGetAttribLocation(riGraphicTools.sp_Image, "vPosition");

GLES20.glEnableVertexAttribArray(mPositionHandle);

GLES20.glVertexAttribPointer(mPositionHandle, 3,
GLES20.GL_FLOAT, false,
0, vertexBuffer);

int mTexCoordLoc = GLES20.glGetAttribLocation(riGraphicTools.sp_Image,
"a_texCoord" );

GLES20.glEnableVertexAttribArray ( mTexCoordLoc );

// Prepare the texturecoordinates
GLES20.glVertexAttribPointer ( mTexCoordLoc, 2, GLES20.GL_FLOAT,
false,
0, uvBuffer);

int mtrxhandle = GLES20.glGetUniformLocation(riGraphicTools.sp_Image,
"uMVPMatrix");

GLES20.glUniformMatrix4fv(mtrxhandle, 1, false, m, 0);

int mSamplerLoc = GLES20.glGetUniformLocation (riGraphicTools.sp_Image,
"s_texture" );

GLES20.glUniform1i ( mSamplerLoc, 0);

GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length,
GLES20.GL_UNSIGNED_SHORT, drawListBuffer);

GLES20.glDisableVertexAttribArray(mPositionHandle);
GLES20.glDisableVertexAttribArray(mTexCoordLoc);

最佳答案

假设您已经用必要的数据填充了缓冲区,看起来您已经拥有了大部分所需的东西。在您的代码中有一个调用,其中的参数不是您一定想要的:

GLES20.glGenTextures(idx, texture, 0);

对于 Android 中的 Java 绑定(bind),第一个参数是您要生成的 ID 的数量,第二个参数是一个 ID 数组,第三个是存储生成的 ID 的数组中的起始索引。因此,要生成一个 id,并将其存储为 texture[idx],正确的参数是:

GLES20.glGenTextures(1, texture, idx);

然后,对于您问题的核心部分,您正在寻找的调用是 glBindTexture()。此调用定义了大多数与纹理相关的 OpenGL 操作使用哪个特定纹理。您将在多个地方需要此调用。

  • 在您的loadTexture() 方法中,GLES20.glTexParameteri()GLUtils.texImage2D() 都对当前绑定(bind)纹理。所以在这些调用之前,你需要添加这个调用来绑定(bind)你的新纹理:

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture[idx]);
  • 您需要在绘制操作之前进行相同的调用。因此,在您的渲染方法中的某处,在您调用 GLES20.glDrawElements() 之前,使用一个 glBindTexture() 调用,它看起来就像上面那个,带有 idx 您要使用的纹理的值。这是您真正选择在渲染过程中应用您加载的纹理的地方。

有些机制允许您同时绑定(bind)多个纹理。如果您的着色器需要从多个纹理中采样,这将非常有用。你很可能还不需要这个。但是一旦你达到这一点,你就会想要阅读“纹理单元”,并查找 glActiveTexture() 调用。

关于Android OpenGLES 2.0 加载更多纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24768679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com