2015-09-23 34 views
0

我已经创建了一个纹理,并使用Android上的OpenGL ES 3.1(使用NDK)填充紫色。 问题是,着色器中的纹理查找无法按预期工作。GLSL纹理只适用于(0,0)

创建纹理就像这样:

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

您是否尝试将'GL_MIN_FILTER'设置为'GL_LINEAR'或'GL_NEAREST'?当没有生成mipmap时,需要mipmap的插值模式将失败。 – BDL

+0

不幸的是,GL_NEAREST和GL_LINEAR都不能解决问题。 – mrueg

+0

您只设置img的前四个值,因为在每次迭代中i = 0。 – BDL

回答

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