【发布时间】:2014-02-24 22:29:37
【问题描述】:
public static int loadTexture(int resourceID) {
int textureHandle[] = new int[1];
GLES20.glGenTextures(1, textureHandle, 0);
if (textureHandle[0] != 0) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap b = BitmapFactory.decodeResource(SlingBall.context.getResources(), resourceID, options);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, b, 0);
b.recycle();
}
if (textureHandle[0] == 0) {
throw new RuntimeException("RUFK");
}
return textureHandle[0];
}
这是我从资源中加载纹理的代码。 这对于加载 16x16 PNG 文件效果很好,但是当尝试加载任何不是 16x16(更小或更大)的文件时,它就会变成完全黑色。
我尝试创建几个新的 PNG,是的,每一个 16x16 的文件都能正确加载。
这个函数在 onSurfaceCreated() 中被调用,顺便说一句。
发生了什么事?
编辑:还不如添加着色器,我认为它不应该是相关的,因为它们在 16x16 上工作得很好。
顶点
uniform mat4 u_mvpMatrix;
attribute vec3 a_vertexPosition;
attribute vec2 a_texturePosition;
varying vec2 v_texturePosition;
void main() {
v_texturePosition = a_texturePosition;
gl_Position = u_mvpMatrix * vec4(a_vertexPosition, 1.0);
}
片段
precision mediump float;
uniform vec4 u_color;
uniform sampler2D u_texture;
varying vec2 v_texturePosition;
void main() {
gl_FragColor = texture2D(u_texture, v_texturePosition);
}
(实际上它更多,但我已将其全部用于调试。没有任何区别。现在甚至没有使用 u_color)
顶点数据
private static final float vertexData[] = {
-1f, -1f, 0f, 0f, 0f,
-1f, 1f, 0f, 0f, 1f,
1f, -1f, 0f, 1f, 0f,
1f, 1f, 0f, 1f, 1f
};
3 表示位置,2 表示纹理位置。
如果我没有应用足够的数据,我很抱歉,但我不知道问题出在哪里,我只是想这可能是我在纹理加载时做错了,因为其他一切都适用于 16x16 .如果您认为问题可能出在代码中,请告诉我,我将在数据中进行编辑。
【问题讨论】:
-
这可能是你需要有 POT(2 的幂)纹理,这意味着每个维度都必须是 POT(2、4、8、16、32、64...),所以 128x256 应该没事而 200x200 则不应该。
-
是的,加载 32x32 PNG 工作正常。一定要这样吗?我可以改变它吗?它似乎非常严格......
-
您可能会尝试在网上找到一些支持非 POT 纹理的东西,但您会对性能产生影响。大多数人使用 texSubImage2D 填充纹理的一部分,例如加载 100x100 纹理,您将使用 texImage2D 128x128 尺寸和 NULL 数据,然后使用 texSubImage2D 填充 100x100 部分。请注意,您还需要更正纹理坐标,而不是 [.0, 1.0],它们应该是 [.0, 100.0/128.0]。