在openGL android中将图像纹理渲染到立方体贴图中

时间:2016-02-14 11:47:06

标签: android opengl-es opengl-es-2.0

我的设备上有一个位图(这是一个6x1立方体贴图),我想在立方体的所有面上渲染

 InputStream is = getContext().getResources().openRawResource(R.raw.photo);
 Bitmap bitmap = BitmapFactory.decodeStream(is);
 int bytes = bitmap.getByteCount();
 ByteBuffer pixels = ByteBuffer.allocate(bytes);
 bitmap.copyPixelsToBuffer(pixels);

这是我的顶点着色器:

uniform mat4 uMVPMatrix;
uniform mat4 uSTMatrix;

attribute vec4 aPosition;
attribute vec4 aTextureCoord;
attribute vec4 aColor;
varying vec2 vTextureCoord;
varying vec4 vColor;

void main() {
  gl_Position = uMVPMatrix * aPosition;
  vTextureCoord = (uSTMatrix * aTextureCoord).xy;
  vColor = aColor;
}

这是我的片段着色器:

precision mediump float;

varying vec2 vTextureCoord;
varying vec4 vColor;

uniform samplerCube sTexture;

void main() {
    gl_FragColor = textureCube(sTexture, vec3(vTextureCoord, 1.0)) * vColor;
}

以下是我在onSurfaceCreated()的渲染器中所做的事情:

GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
int[] texIds = new int[1];
GLES20.glGenTextures(1, texIds, 0);
m360PhotoTextureId = texIds[0];

GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(
    GLES20.GL_TEXTURE_CUBE_MAP,
    mTextureId);

for (int i = 0 ; i < 6 ; i++ ){
  pixels.position(0);
  GLES20.glTexImage2D(
      GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
      0,
      GLES20.GL_RGBA,
      1,
      1,
      0,
      GLES20.GL_RGBA,
      GLES20.GL_UNSIGNED_BYTE,
      pixels);
}

GLES20.glTexParameteri(
        GLES20.GL_TEXTURE_CUBE_MAP,
        GLES20.GL_TEXTURE_MIN_FILTER,
        GLES20.GL_LINEAR);
GLES20.glTexParameteri(
        GLES20.GL_TEXTURE_CUBE_MAP,
        GLES20.GL_TEXTURE_MAG_FILTER,
        GLES20.GL_LINEAR);
GLES20.glTexParameteri(
        GLES20.GL_TEXTURE_CUBE_MAP,
        GLES20.GL_TEXTURE_WRAP_S,
        GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(
        GLES20.GL_TEXTURE_CUBE_MAP,
        GLES20.GL_TEXTURE_WRAP_T,
        GLES20.GL_CLAMP_TO_EDGE);
GLES20.glBindTexture(GLES20.GL_TEXTURE_CUBE_MAP, 0);

我所看到的只是纹理视图中的黑色屏幕,当我希望在立方体的所有面上都能看到一张照片(在像素中)。

任何指示或帮助都将不胜感激。

我试过了: 顶点着色器:

uniform mat4 uMVPMatrix;
attribute vec4 aPosition;
varying vec3 vTextureCoord;

void main() {
  gl_Position = uMVPMatrix * aPosition;
  vTextureCoord = aPosition.xyz;
}

片段着色器:

precision mediump float;
varying vec3 vTextureCoord;
uniform samplerCube sTexture;

void main() {
    gl_FragColor = textureCube(sTexture, vTextureCoord);
}

但我得到了相同的黑屏。

1 个答案:

答案 0 :(得分:2)

cubemap texture是一个纹理,其图像代表立方体的面。立方体贴图纹理的“纹理坐标”是指从立方体中心指向您要使用的颜色的矢量方向

您正在尝试使用常规的旧2D纹理坐标,可能会添加第三个组件以使编译器静音。您必须提供路线,而不是2D坐标。您可以从您的位置在顶点着色器中生成它们。但这需要知道aPosition是什么空间,而你没有告诉我。所以我不能告诉你如何做到这一点。

无论如何,顶点着色器需要为纹理坐标提供3D方向。它应该从VS输入生成或传递。

请注意,您的程序可能还有其他问题。但这是可以从您的代码中推断出来的问题。