我正在尝试在iPhone上渲染OpenGL ES 2.0中的简单纹理四边形。几何图形很好,如果我在着色器中使用纯色,我会得到预期的四边形:
gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0);
如果我直接渲染纹理坐标,我会得到预期的渐变:
gl_FragColor = vec4 (texCoord.x, texCoord.y, 0.0, 1.0);
图像数据从UIImage加载,缩放到1024x1024以内,并加载到如下纹理中:
glGenTextures (1, &_texture); glBindTexture (GL_TEXTURE_2D, _texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
width
,height
以及data
的内容都是正确的,正如调试器中所检查的那样。
当我更改片段着色器以使用纹理时:
gl_FragColor = texture2D (tex, texCoord);
...并绑定纹理并像这样渲染:
glActiveTexture (GL_TEXTURE0); glBindTexture (GL_TEXTURE_2D, _texture); // this is unnecessary, as it defaults to 0, but for completeness... GLuint texLoc = glGetUniformLocation(_program, "tex"); glUniform1i(texLoc, 0); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
......我一无所获。黑色四边形。 glGetError()
不会返回错误,glIsTexture(_texture)
会返回true。
我在这里做错了什么?我在网上找到的每一个例子都是一遍又一遍,但是每个人都像我一样完成它,并且调试器显示我对各种GL功能的参数是我期望它们的。
答案 0 :(得分:1)
在glTexImage2D之后,使用glTexParameter设置MIN / MAG过滤器,默认值使用mipmap,因此该代码的纹理不完整。
答案 1 :(得分:1)
我遇到了同样的问题(黑色四边形),直到来自this question的jfcalvo的回复引导我到原因时才找到答案。基本上要确保你没有在不同的线程中加载纹理。
答案 2 :(得分:1)
确保在S和T方向上将纹理包装参数设置为GL_CLAMP_TO_EDGE。如果没有这个,纹理就不完整了,会显得很黑。
答案 3 :(得分:0)
确保使用正确的格式(常量)
调用(glTexImage2D)
确保您在glTexImage2D
这就是我在android上的表现:
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
mTextureID = textures[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_NEAREST);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_REPEAT);
InputStream is = mContext.getResources()
.openRawResource(R.drawable.ywemmo2);
Bitmap bitmap;
try {
bitmap = BitmapFactory.decodeStream(is);
} finally {
try {
is.close();
} catch(IOException e) {
// Ignore.
}
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
答案 4 :(得分:0)
也许你忘了
glEnable(GL_TEXTURE_2D);
就是这种情况,着色器中的texture2D会返回黑色,因为OP似乎受到影响。