我创建了一个纹理,并在Android上使用OpenGL ES 3.1(使用NDK)填充紫色。 问题是着色器中的纹理查找无法按预期工作。
我像这样创建纹理:
glGenTextures(1, &mGLTexture);
glBindTexture(GL_TEXTURE_2D, mGLTexture);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, textureSize.x, textureSize.y);
vector<GLubyte> img; int i = 0;
img.resize(4 * textureSize.x * textureSize.y);
for (unsigned x = 0; x < 64; ++x) {
for (unsigned y = 0; y < 64; ++y) {
img[i * 4 + 0] = 255;
img[i * 4 + 1] = 0;
img[i * 4 + 2] = 255;
img[i * 4 + 3] = 255;
// purple with full alpha
}
}
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
64, 64,
GL_RGBA, GL_UNSIGNED_BYTE, img.data());
在此过程中不会抛出OpenGL错误。
然后我绑定纹理:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, mGLTexture);
glUniform1i(texLocation, 0); // got texLocation using glGetUniformLocation
现在,问题出现了:在我的着色器中,当我仅在(0,0)处查找纹理时,使用FragColor = texture(tex, vec2(0,0));
它按预期工作,即事物被涂成紫色。
对于所有其他纹理坐标(例如vec2(0.5f,0.5f)
),我到处都是黑色。
答案 0 :(得分:2)
在循环中只分配了img的前四个元素。您可能忘记更新索引变量i。
for (unsigned x = 0; x < 64; ++x) {
for (unsigned y = 0; y < 64; ++y) {
i = y * 64 + x;
img[i * 4 + 0] = 255;
img[i * 4 + 1] = 0;
img[i * 4 + 2] = 255;
img[i * 4 + 3] = 255;
// purple with full alpha
}
}