纹理不绘制

2024-03-06

我想在屏幕上绘制图像,但我得到的是黑色方块,但上面没有纹理。图像路径正确并已加载,因为矩形具有正确的大小。我有一个单独的类用于加载名为“Texture”的纹理,还有一个用于绘制名为“Sprite”的纹理的类。这是代码:

// Class Texture
public void loadFromResources(final Context context, int id) {
    GLES20.glGenTextures(1, mTextureID, 0);

    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inScaled = false;   // No pre-scaling

    // Temporary create a bitmap
    Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), id, options);

    // Bind texture to texturename
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID[0]);

    // Load the bitmap into the bound texture.
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);

    mSize = new Size(bmp.getWidth(), bmp.getHeight());

    // We are done using the bitmap so we should recycle it.
    bmp.recycle();
}

// Sprite class
public void setTexture(Texture texture) {
    mTexture = texture;

    Log.d("Sprite", mTexture.getSize().getWidth() + " " + mTexture.getSize().getHeight());

    vertices = new float[] {
            0.0f,                         0.0f,
            texture.getSize().getWidth(), 0.0f,
            texture.getSize().getWidth(), texture.getSize().getHeight(),
            0.0f,                         texture.getSize().getHeight() };


    // The vertex buffer.
    ByteBuffer bb = ByteBuffer.allocateDirect(vertices.length * 4);
    bb.order(ByteOrder.nativeOrder());
    vertexBuffer = bb.asFloatBuffer();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);

    // Create our UV coordinates.
    uvs = new float[] {
            0.0f, 0.0f,
            0.0f, 1.0f,
            1.0f, 1.0f,
            1.0f, 0.0f
    };

    // The texture buffer
    bb = ByteBuffer.allocateDirect(uvs.length * 4);
    bb.order(ByteOrder.nativeOrder());
    uvBuffer = bb.asFloatBuffer();
    uvBuffer.put(uvs);
    uvBuffer.position(0);
}

public void draw(float[] projectionMatrix) {
    float[] scratch = new float[16];

    float[] move = new float[16];
    Matrix.setIdentityM(move, 0);
    Matrix.translateM(move, 0, 10, 10, 0);

    Matrix.multiplyMM(scratch, 0, projectionMatrix, 0, move, 0);

    GLES20.glUseProgram(mProgram);

    // get handle to vertex shader's vPosition member
    int mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

    // Enable generic vertex attribute array
    GLES20.glEnableVertexAttribArray(mPositionHandle);

    // Prepare the triangle coordinate data
    GLES20.glVertexAttribPointer(mPositionHandle, 2,
            GLES20.GL_FLOAT, false,
            2 * 4, vertexBuffer);

    // Get handle to texture coordinates location
    int mTexCoordLoc = GLES20.glGetAttribLocation(mProgram, "a_texCoord");
    MyGLRenderer.checkGlError("glGetAttribLocation");

    // Enable generic vertex attribute array
    GLES20.glEnableVertexAttribArray(mTexCoordLoc);
    MyGLRenderer.checkGlError("glEnableVertexAttribArray");

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

    // Get handle to shape's transformation matrix
    int mtrxhandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
    MyGLRenderer.checkGlError("glGetUniformLocation");

    // Apply the projection and view transformation
    GLES20.glUniformMatrix4fv(mtrxhandle, 1, false, scratch, 0);
    MyGLRenderer.checkGlError("glUniformMatrix4fv");

    mTexture.useTexture();

    // Get handle to textures locations
    int mSamplerLoc = GLES20.glGetUniformLocation(mProgram, "s_texture" );
    MyGLRenderer.checkGlError("glGetUniformLocation");

    // Set the sampler texture unit to 0, where we have saved the texture.
    GLES20.glUniform1i( mSamplerLoc, 0);
    MyGLRenderer.checkGlError("glUniform1i");

    // Draw the triangle
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length,
            GLES20.GL_UNSIGNED_SHORT, drawListBuffer);

    // Disable vertex array
    GLES20.glDisableVertexAttribArray(mPositionHandle);
    GLES20.glDisableVertexAttribArray(mTexCoordLoc);
}

// MyGLRenderer class
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

    mTexture = new Texture();
    mTexture.loadFromResources(context, R.drawable.hex);

    mSprite = new Sprite(context);
    mSprite.setTexture(mTexture);

编辑: 这是着色器:

// vert
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;

void main() {
    gl_Position = uMVPMatrix * vPosition;
    v_texCoord = a_texCoord;
}

// frag
precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D s_texture;

void main() {
    gl_FragColor = texture2D( s_texture, v_texCoord );
}

这是完整的纹理类:

public class Texture {
    private final int[] mTextureID = new int[1];
    private Size mSize = new Size(0,0);

    public Texture() {

    }

    public Size getSize() { return mSize; }

    public void loadFromResources(final Context context, int id) {
        GLES20.glGenTextures(1, mTextureID, 0);

        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inScaled = false;   // No pre-scaling

        // Temporary create a bitmap
        Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), id, options);

        // Bind texture to texturename
        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID[0]);

        // Load the bitmap into the bound texture.
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);

        mSize = new Size(bmp.getWidth(), bmp.getHeight());

        // We are done using the bitmap so we should recycle it.
        bmp.recycle();
    }

    public void useTexture() {
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID[0]);
    }
}

我发现了问题:在构造纹理类之前将下一行发布在 MyGLRenderer 中之前,但现在我已将它们添加到纹理类中的 glBindTexture() 和 texImage2D 之间:

    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
            GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
            GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

纹理不绘制 的相关文章

  • Twitter 登录说明

    我想在 Android 中创建一个 Twitter 应用程序 为此 我想创建一个登录页面并登录到 Twitter 为此 我们需要消费者密钥和消费者密钥 这是什么意思 要创建此登录页面 除了 Twitter 帐户之外 我们还需要其他任何东西吗
  • Service 和 IntentService,运行从服务器轮询数据库值的服务哪个更好?

    我读过很多关于Service and IntentService 然而 当做出决定时 我没有足够的信心选择使用哪种类型来创建一个后台服务 该服务将在一定时间间隔内从数据库轮询数据 并在获得所需数据时停止它 因为数据代表请求的状态 例如 订购
  • 安卓定位不准确

    我正在尝试获取当前用户的位置 我试图重构我的代码以获得更好的结果 但我只是不断得到关于准确度的荒谬位置 它在 900 600 米之间 如何才能得到更好的结果 使其精度达到50m以内 这是我的代码 package com agam mapsl
  • 如何在android线性布局上获得阴影? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在android中为View设置阴影 https stackoverflow com questions 4406524 how to set shadow to a view in androi
  • 如何为发布而不是调试创建密钥库?扑

    我按照使用此网站部署 flutter 的步骤进行操作https flutter io android release https flutter io android release 当我运行 flutter build apk 时出现此错
  • 出现错误错误:res/menu/mainMenu.xml:文件名无效:必须仅包含[a-z0-9_。]

    我是安卓新手 刚刚开始使用 我在 res 文件夹中创建了一个文件 menu mainMenu xml 但我得到了错误 Error res menu mainMenu xml invalid file name must contain on
  • 如何在android中设置权限WRITE_SECURE_SETTINGS? [复制]

    这个问题在这里已经有答案了 我正在尝试启用 4 0 以上的辅助功能服务设置 但它显示异常 即 引起原因 java lang SecurityException 权限拒绝 写入安全设置需要 android permission WRITE S
  • 放置在 NavigationDrawer 顶部的片段

    我正在尝试添加一个PreferenceFragment在我的应用程序中 问题是 它自动放置在我的顶部NavigationDrawer public class SetPreferenceActivity extends Activity O
  • 在旋转时从错误的资源文件夹中提取可绘制对象

    在这里拉我的头发 因此 我正在使用一个具有多种类型的可绘制对象的应用程序 并且它们的结构如下 res Portrait resources drawable mdpi drawable hdpi drawable xhdpi Landsca
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 在 Android 中调整可绘制对象的大小

    我正在为进度对话框设置一个可绘制对象 pbarDialog 但我的问题是我想每次调整可绘制的大小 但不知道如何调整 这是一些代码 Handler progressHandler new Handler public void handleM
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • Android:监听状态栏通知

    有没有办法在状态栏被下拉时监听通知 1 用于检测状态栏变化 您可以注册一个监听器来获取系统UI可见性变化的通知 因此 要在您的活动中注册侦听器 Detecting if the user swipe from the top down to
  • Android:RecyclerView 不显示片段中的列表项

    有人可以帮我尝试让我的 RecyclerView 出现吗 如果我不在片段中实现它 就会出现这种情况 然而 当我尝试将其实现到片段中时 CarFront 中的其他 XML 代码与 RecyclerView 分开显示 我的日志中收到此错误 E
  • 错误:无法创建新会话,因为找不到需要 HttpClient、InputStream 和 long 的“createSession”

    我正在尝试自动化 Android 混合应用程序 但出现以下错误 1 线程 main org openqa selenium WebDriverException中出现异常 无法创建新会话 因为未找到需要 HttpClient InputSt
  • 在 KitKat 4.4.2 中获取 SDard 路径和大小

    我在 Google Play 上有一个设备信息应用程序 在该应用程序中我有存储信息 我知道 Android 4 4 在访问外部 SD 卡方面发生了一些变化 内部似乎没有给我带来问题 我的问题是 如何可靠地获取 KitKat 上 SD 卡的大
  • Android:AsyncTask ProgressDialog 将不会在 ActivityGroup 中打开

    我试图在轮询我的服务器时打开一个进度对话框 该类是一个 ActivityGroup 因为它嵌套在选项卡栏中 为了将视图保持在框架内 需要 ActivityGroup 这是我的 ActivityGroup 类的声明 public class
  • Android 中带有组的列表视图

    我有一个列表视图 每行都有一些日期和文本 我可以像 iPhone 中那样将这个 listView 分组 组之间有标题吗 在 android 中是否可能 请帮忙 即 我需要在 Listview 行之间有标题栏 以便如果我使用日期对其进行分组
  • 如何在片段中实现 onBackPressed() 和意图?

    我知道 onBackPressed 是活动中的一种方法 但是 我想在片段中使用该功能 以便当按下后退按钮时 它会通过 Intent 重定向到另一个活动 有什么办法解决这个问题吗 public class News Events fragme

随机推荐

  • shared_ptr 析构函数、复制和不完整类型

    我有一个头文件foo h像这样 无关的东西省略 pragma once include
  • 互换使用 str 和 String

    假设我正在尝试使用 Rust 做一个奇特的零拷贝解析器 str 但有时我需要修改文本 例如实现变量替换 我真的想做这样的事情 fn main let mut v Vec lt str gt Hello there world split w
  • 单行 FFMPEG cmd 合并视频/音频并保留两个音频

    我有一个项目需要将视频文件与另一个音频文件合并 预期输出是一个视频文件 其中包含实际视频中的音频和合并的音频文件 输出视频文件的长度将与实际视频文件的大小相同 是否有单行 FFMPEG 命令可以使用 copy 和 map 参数来实现此目的
  • Android 上的 OkHttp PublicKey 固定

    有谁知道我们如何使用 OkHttp3 实现公钥固定 一直在阅读有关 SSL 固定的内容 我发现我们可以使用证书固定或公钥固定 后者似乎更灵活 来实现 但我只能找到例子证书固定 https github com square okhttp w
  • WSL (Ubuntu):如何从 bash 终端在浏览器中打开 localhost

    我正在尝试打开http localhost http localhost在 WSL bash 终端的 任何 浏览器中 到目前为止我已经尝试过 如何从 URL localhost 3000 的终端打开 Google Chrome https
  • iOS 的日志框架? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 iOS 是否有一个日志框架可以帮助开发人员诊断应用程序崩溃 您可能喜欢 伐木工人 https gith
  • Bootstrap 网格列相互重叠

    我对 Bootstrap 的网格布局和其中的列重叠有疑问 我不确定问题到底是什么 任何建议将不胜感激 谢谢 div class container div class row div class col md 6 img src conte
  • 错误提示“.class 文件中的版本错误”

    我使用了JSP代码并在tomcat5 5服务器下执行了相同的操作 它工作被罚款 现在我已经将相同的代码复制到其他系统的tomcat服务器下 但是在提交该 jsp 文件时 收到以下错误 导致错误的原因可能是什么 请指教 root cause
  • 使 d3.js 可视化布局响应式的最佳方法是什么?

    假设我有一个直方图脚本 可以构建 960 500 svg 图形 我如何使其响应 以便调整图形宽度和高度是动态的
  • 如何快速学习Java RMI [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个 Java 应用程序 我已经开发了一两年了 我想创建一组非常简单的接口 以后可能会增加复杂性 我可以使用它从另一个 JVM 例
  • Jmeter - 如何向计数器添加前缀。类似于随机变量

    目前 在随机变量中 我可以在变量的输出格式中添加前缀或后缀 然而 这个很好的功能不适用于简单的计数器控制器 每次使用变量时连接 string counter 对我来说并不是一个好的选择 因为我经常这样做 有没有办法以随机变量的方式实现前缀
  • 对内置数据类型使用前向声明

    我明白 只要有可能 我们就应该使用前向声明而不是包含来加快编译速度 我有课Person像这样 pragma once include
  • 如何将 TWSocket 的 OnDataAvailable() 事件推送到 Delphi 6 应用程序中的后台线程?

    我有一个 Delphi 6 应用程序 它使用 ICS 组件套件进行套接字通信 我有自己的服务器套接字 VCL 组件 当新会话可用时 它会创建客户端 TWSocket 套接字 我创建的客户端套接字确实将 Multithreaded 属性设置为
  • 如何一起使用SparkSession和StreamingContext?

    我正在尝试从本地计算机 OSX 上的文件夹流式传输 CSV 文件 我将 SparkSession 和 StreamingContext 一起使用 如下所示 val sc SparkContext createSparkContext spa
  • 我应该使用哪些 Maven 工件来导入 PowerMock?

    我需要添加哪些罐子到我的pom xml让 PowerMock 与 Mockito 一起工作 我有以下依赖项
  • Google.Apis.Requests.RequestError 需要登录 [401] 消息[需要登录] 位置

    因此 我从 Nuget 下载了 Cloud Storage 的 NET 客户端 Google Apis Storage v1 版本 1 8 1 10 使用开发人员控制台创建了一个项目 生成了 API 密钥 启用了计费 创建了一个存储桶 但是
  • 如何绑定 ListBoxItem 的索引

    我想将列表框项目的 z 索引绑定到它们的索引 理想情况下 我们会有
  • Clojure、方面、Defprotocol、Defrecord

    defprotocol IAnimal IAnimal report o println type o reporting n inner report o println type o out n defrecord Dog IAnima
  • 如何将 JSON 转换为 CSV 格式并存储在变量中

    我有一个可以在浏览器中打开 JSON 数据的链接 但不幸的是我不知道如何阅读它 有没有办法使用 JavaScript 将这些数据转换为 CSV 格式并将其保存在 JavaScript 文件中 数据如下 count 2 items title
  • 纹理不绘制

    我想在屏幕上绘制图像 但我得到的是黑色方块 但上面没有纹理 图像路径正确并已加载 因为矩形具有正确的大小 我有一个单独的类用于加载名为 Texture 的纹理 还有一个用于绘制名为 Sprite 的纹理的类 这是代码 Class Textu