c++ - OpenGL-使用.obj/.mtl中的图像纹理绘制对象

标签 c++ opengl-es google-cardboard

我正在尝试使用带有Google Cardboard for Android的OpenGL创建具有图像纹理的多维数据集。我的代码主要基于Google的演示代码here。我可以很好地渲染黑色/无纹理的多维数据集,但纹理正是我所坚持的。

文件
这是.obj文件:

mtllib 9c9ab3c3-ea26-4524-88f5-a524b6bb6057.mtl

g Mesh1 Model

usemtl Tile_Hexagon_White
v 2.16011 0 -2.27458
vt -7.08697 8.39536
vn 0 -1 -0
v 1.16011 0 -1.27458
vt -3.80613 4.70441
v 1.16011 0 -2.27458
vt -3.80613 8.39536
f 1/1/1 2/2/1 3/3/1

v 2.16011 0 -1.27458
vt -7.08697 4.70441
f 2/2/1 1/1/1 4/4/1

vt 7.46254 0
vn 1 0 -0
v 2.16011 1 -1.27458
vt 4.1817 3.69094
vt 4.1817 0
f 1/5/2 5/6/2 4/7/2

v 2.16011 1 -2.27458
vt 7.46254 3.69094
f 5/6/2 1/5/2 6/8/2

vt -7.08697 0
vn 0 0 -1
v 1.16011 1 -2.27458
vt -3.80613 3.69094
vt -7.08697 3.69094
f 1/9/3 7/10/3 6/11/3

vt -3.80613 0
f 7/10/3 1/9/3 3/12/3

vt -4.1817 0
vn -1 0 -0
vt -7.46254 3.69094
vt -7.46254 0
f 2/13/4 7/14/4 3/15/4

v 1.16011 1 -1.27458
vt -4.1817 3.69094
f 7/14/4 2/13/4 8/16/4

vt 3.80613 0
vn 0 0 1
vt 7.08697 3.69094
vt 3.80613 3.69094
f 2/17/5 5/18/5 8/19/5

vt 7.08697 0
f 5/18/5 2/17/5 4/20/5

vt 7.08697 4.70441
vn 0 1 -0
vt 3.80613 8.39536
vt 3.80613 4.70441
f 5/21/6 7/22/6 8/23/6

vt 7.08697 8.39536
f 7/22/6 5/21/6 6/24/6
这是.mtl文件:
newmtl Tile_Hexagon_White
Ka 0.000000 0.000000 0.000000
Kd 0.835294 0.807843 0.800000
Ks 0.330000 0.330000 0.330000
map_Kd 9c9ab3c3-ea26-4524-88f5-a524b6bb6057/Tile_Hexagon_White.jpg

newmtl ForegroundColor
Ka 0.000000 0.000000 0.000000
Kd 0.000000 0.000000 0.000000
Ks 0.330000 0.330000 0.330000
纹理只是一个重复的六角形图案,我想覆盖整个立方体:
enter image description here


  • 加载OBJ文件并将数据分离为数组。

  • 我有Vertices_ [108],UV_ [72]和Indices_ [36]。我相信程序目前可以正常运行,但是如果需要,我可以提供这些值。
  • 我在以下位置加载图像:
  • GLuint texture_id;
        glGenTextures(1, &texture_id);
    
        imageNum = texture_id;
    
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, imageNum);
    
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
          
    
        /*I don't really know how this block of code works but it's supposed to Load an image from the asset manager.
         * env - the JNIEnv* environment
         * java_asset_mgr - AAssetManager for fetching files
         * path - the path and name of my texture
         */
        jclass bitmap_factory_class =
                env->FindClass("android/graphics/BitmapFactory");
        jclass asset_manager_class =
                env->FindClass("android/content/res/AssetManager");
        jclass gl_utils_class = env->FindClass("android/opengl/GLUtils");
        jmethodID decode_stream_method = env->GetStaticMethodID(
                bitmap_factory_class, "decodeStream",
                "(Ljava/io/InputStream;)Landroid/graphics/Bitmap;");
        jmethodID open_method = env->GetMethodID(
                asset_manager_class, "open", "(Ljava/lang/String;)Ljava/io/InputStream;");
        jmethodID tex_image_2d_method = env->GetStaticMethodID(
                gl_utils_class, "texImage2D", "(IILandroid/graphics/Bitmap;I)V");
    
        jstring j_path = env->NewStringUTF(path.c_str());
        RunAtEndOfScope cleanup_j_path([&] {
            if (j_path) {
              env->DeleteLocalRef(j_path);
            }
        });
        
        jobject image_stream =
                env->CallObjectMethod(java_asset_mgr, open_method, j_path);
        jobject image_obj = env->CallStaticObjectMethod(
                bitmap_factory_class, decode_stream_method, image_stream);
    
        env->CallStaticVoidMethod(gl_utils_class, tex_image_2d_method, GL_TEXTURE_2D, 0,
                                  image_obj, 0);
    
    
        glGenerateMipmap(GL_TEXTURE_2D);
    
  • 开奖:
  •   //obj_program has a vertex shader and fragment shader attached.
      glUseProgram(obj_program_);
    
      std::array<float, 16> target_array = modelview_projection_target_.ToGlArray();
      glUniformMatrix4fv(obj_modelview_projection_param_, 1, GL_FALSE,
                         target_array.data());
    
    
      glActiveTexture(GL_TEXTURE0);
      glBindTexture(GL_TEXTURE_2D, imageNum);
    
      //DRAW
      glEnableVertexAttribArray(0);
      glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, Vertices_.data());
    
      glEnableVertexAttribArray(1);
      glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, Uv_.data());
    
      glDrawElements(GL_TRIANGLES, Indices_.size(), GL_UNSIGNED_SHORT,
                     Indices_.data());
    
    
    结果
    我最终得到一个纹理奇怪的立方体,我不确定是什么原因造成的。
    enter image description here
    我肯定会有问题,所以我会尽力回答并提供任何有帮助的信息!

    最佳答案

    问题是我的纹理需要重复。这两行从

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    

    关于c++ - OpenGL-使用.obj/.mtl中的图像纹理绘制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64879898/

    相关文章:

    java - 减少android OpenGL相机的内存

    android - 如何为 unity 升级 google cardboard sdk?

    unity3d - Daydream Controller 无法与 Canvas 按钮正确交互

    c++ - QThread::wait() 不使用直接连接不返回

    c++ - C++中的多个相邻位字段

    c++ - 通过同步延长线程的生命周期 (C++11)

    java - 如何在 OpenGL ES 中移动带有纹理的形状?

    OpenGL 相当于 OpenGL ES 2.0 的扩展 GL_EXT_shader_framebuffer_fetch

    C++ 规则 5 - 自定义析构函数的段错误

    c# - 在 iOS 上删除 Google Cardboard 配对消息