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的PNG都能正确加载。
在onSurfaceCreated(),btw。
中调用此函数发生了什么事?
编辑:不妨添加着色器,而不是我认为它应该是相关的,因为它们可以正常工作16x16。
VERTEX
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);
}
FRAGMENT
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)
VERTEX DATA
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 。如果您认为问题可能存在于代码中,请告诉我,我将编辑数据。
答案 0 :(得分:1)
如果你使用的是非二次幂(NPOT)纹理,那么事情会变得有点复杂。摘自OpenGL ES 2.0 Specification(第3.8.2节,第87-88页):
Calling a sampler from a fragment shader will return (R; G; B; A) =
(0; 0; 0; 1) if any of the following conditions are true:
...
- A two-dimensional sampler is called, the corresponding texture image is a
non-power-of-two image (as described in the Mipmapping discussion of
section 3.7.7), and either the texture wrap mode is not CLAMP_TO_EDGE, or
the minification filter is neither NEAREST nor LINEAR.
因此,请确保您的纹理包装模式也是CLAMP_TO_EDGE
。 OES_texture_npot扩展程序提供对REPEAT
和MIRRORED_REPEAT
换行模式的支持。可能是您的设备不支持该扩展程序。
或者您可以尝试避免使用NPOT纹理。