gpt4 book ai didi

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

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

我的设备上有一个位图(它是一个 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;
}

这是我的 fragment 着色器:

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);

当我希望看到在立方体的所有面上渲染的照片(以像素为单位)时,我在纹理 View 中看到的只是黑屏。

如有任何指点或帮助,我们将不胜感激。

我试过:顶点着色器:

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

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

fragment 着色器:

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

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

但是我得到了同样的黑屏。

最佳答案

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

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

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

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

关于android - 在openGL android中将图像纹理渲染到立方体贴图中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35391371/

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