GLSL纹理仅适用于(0,0)

时间:2015-09-23 12:53:24

标签: android opengl-es android-ndk

我创建了一个纹理,并在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)),我到处都是黑色。

1 个答案:

答案 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
    }
}