1

さて、Androidに関連するOpenGLは非常に新しいので、しばらく読んでいますが、コーディングでこの障害を乗り越えることはできません。

現在、drawablesフォルダーにある.pngファイルからBlenderで作成した.objモデルにテクスチャをロードするクラスを作成しようとしています。BlenderモデルでUVアンラップを実行し、次に.pngファイルのガイドとしてUVアンラップを使用しました。

現在の問題は、テクスチャをモデルにロードできることですが、これはテクスチャファイルから取得されたように見える1つの単色です。明らかに私はBlenderのUVテクスチャリングについて十分に理解していませんが、非常に多くの異なるOpenGLライブラリがあり、PCからAndroidまで非常に多くのバリエーションがあるため、どこで機能するかについて頭を悩ませることは非常に困難です。

誰かがこれを手伝ってくれたらとてもありがたいです。関連するコードの一部を次に示します。必要に応じてさらに投稿します。

TextureLoaderから:

public Texture getTexture(GL10 gl, final int ref) throws IOException {
    Texture tex = (Texture) table.get(ref);

    if (tex != null) {
        return tex;
    }

    Log.i("Textures:", "Loading texture: " + ref);

    tex = getTexture(gl, ref,
            GL10.GL_TEXTURE_2D, // target
            GL10.GL_RGBA,     // dst pixel format
            GL10.GL_LINEAR, // min filter (unused)
            GL10.GL_NEAREST);

    table.put(ref,tex);

    return tex;
}

public Texture getTexture(GL10 gl, final int ref,
                            int target, 
                            int dstPixelFormat, 
                            int minFilter, 
                            int magFilter)  throws IOException {
    if (!sReady) {
      throw new RuntimeException("Texture Loader not prepared");
    }

    int srcPixelFormat = 0;

    // create the texture ID for this texture 
    int id = createID(gl);
    Texture texture = new Texture(target, id);

    // bind this texture 
    gl.glBindTexture(target, id); 

    Bitmap bitmap = loadImage(ref);  
    texture.setWidth(bitmap.getWidth());
    texture.setHeight(bitmap.getHeight());

    if (bitmap.hasAlpha()) {
        srcPixelFormat = GL10.GL_RGBA;
    } else {
        srcPixelFormat = GL10.GL_RGB;
    }

 // convert that image into a byte buffer of texture data 
    ByteBuffer textureBuffer = convertImageData(bitmap); 

    if (target == GL10.GL_TEXTURE_2D) { 
        gl.glTexParameterf(target, GL10.GL_TEXTURE_MIN_FILTER, minFilter); 
        gl.glTexParameterf(target, GL10.GL_TEXTURE_MAG_FILTER, magFilter); 
    } 

    GLUtils.texImage2D(target, 0, bitmap, 0);
    /*gl.glTexImage2D(target, 
                      0, 
                      dstPixelFormat, 
                      get2Fold(bitmap.getWidth()), 
                      get2Fold(bitmap.getHeight()), 
                      0, 
                      srcPixelFormat, 
                      GL10.GL_UNSIGNED_BYTE, 
                      textureBuffer);*/

    bitmap.recycle();

    return texture;
  }

/**
 * Get the closest greater power of 2 to the fold number
 * 
 * @param fold The target number
 * @return The power of 2
 */
private int get2Fold(int fold) {
    int ret = 2;
    while (ret < fold) {
        ret *= 2;
    }
    return ret;
}

/**
 * Convert the buffered image to a texture
 *
 * @param bufferedImage The image to convert to a texture
 * @param texture The texture to store the data into
 * @return A buffer containing the data
 */
private ByteBuffer convertImageData(Bitmap bitmap) { 
    ByteBuffer imageBuffer = null;

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] data = stream.toByteArray();

    imageBuffer = ByteBuffer.allocateDirect(data.length); 
    imageBuffer.order(ByteOrder.nativeOrder()); 
    imageBuffer.put(data, 0, data.length); 
    imageBuffer.flip();

    return imageBuffer; 
}

/**
 * Creates an integer buffer to hold specified ints
 * - strictly a utility method
 *
 * @param size how many int to contain
 * @return created IntBuffer
 */
protected IntBuffer createIntBuffer(int size) {
  ByteBuffer temp = ByteBuffer.allocateDirect(4 * size);
  temp.order(ByteOrder.nativeOrder());

  return temp.asIntBuffer();
}

private Bitmap loadImage(int ref) {
    Bitmap bitmap = null;

    Matrix flip = new Matrix();
    flip.postScale(1f, -1f);

    // This will tell the BitmapFactory to not scale based on the device's pixel density:
    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inScaled = false;

    Bitmap temp = BitmapFactory.decodeResource(sContext.getResources(), ref, opts);
    bitmap = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(), temp.getHeight(), flip, true);
    temp.recycle();

    return bitmap;
}

テクスチャから:

public void bind(GL10 gl) {
  gl.glBindTexture(target, textureID);
  gl.glEnable(GL10.GL_TEXTURE_2D);
}

それが呼ばれるように:

public void render() {
    //Clear Screen And Depth Buffer
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
      gl.glEnable(GL10.GL_LIGHTING);
      gl.glPushMatrix();

      gl.glTranslatef(0.0f, -1.2f, z); //Move down 1.2 Unit And Into The Screen 6.0
      gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f); //X
      gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f); //Y

      texture.bind(gl);
      model.draw(gl);

      gl.glPopMatrix();
}
4

0 に答える 0