iOS上的opengl:纹理仅在视图的右上角正确显示

时间:2013-03-07 06:25:49

标签: ios opengl-es textures

这很奇怪,当我使用下面的坏纹理时,纹理显示非常可见,仅显示1/16大小的视图,应该用纹理填充视图。

但如果我将顶点数组设置为好的一击,

然后右上角的四分之一显示纹理完美!

我尝试了更多的负顶点坐标,全部失败,买正顶点坐标都可以。我很困惑!

这意味着,当我尝试将纹理粘贴到视图时,只有视图的右上角可以正常,其他位置(甚至是完整视图)无法显示,或者无法正确显示,为什么?

程序(坏程序)在模拟器上运行,但在真实设备上失败...

注意:squareVertices是顶点数组,coordVertices是纹理坐标数组。

BAD one和GOOD one之间的差异只是squareVertices数组。

坏:

结果图片:http://i.stack.imgur.com/SycVY.png (抱歉,我无法发布图片)

static const GLfloat squareVertices[] = {
    -1.0f, -1.0f,
    1.0f, -1.0f,
    -1.0f,  1.0f,
    1.0f,  1.0f,
};

static const GLfloat coordVertices[] = {
    0.0f, 1.0f,
    1.0f, 1.0f,
    0.0f,  0.0f,
    1.0f,  0.0f,
};

GOOD :(但只有视图的右上角四分之一)

结果图片:http://i.stack.imgur.com/yg2Kg.png (抱歉,我无法发布图片)

static const GLfloat squareVertices[] = {
    0.0f, 0.0f,
    1.0f, 0.0f,
    0.0f,  1.0f,
    1.0f,  1.0f,
};

static const GLfloat coordVertices[] = {
    0.0f, 1.0f,
    1.0f, 1.0f,
    0.0f,  0.0f,
    1.0f,  0.0f,
};

// Update attribute values
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);

glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, coordVertices);
glEnableVertexAttribArray(ATTRIB_TEXTURE);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, iTexNameY);
glUniform1i(textureUniformY, 0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, iTexNameU);
glUniform1i(textureUniformU, 1);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, iTexNameV);
glUniform1i(textureUniformV, 2);

// Draw
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

// glFlush();   
[_context presentRenderbuffer:GL_RENDERBUFFER];

1 个答案:

答案 0 :(得分:1)

最后,我在2年后解决了这个问题......

问题是由于纹理和顶点的坐标反转而发生的。

我曾经使用glBindAttribLocation函数绑定属性索引。

#define ATTRIB_VERTEX 0
#define ATTRIB_TEXTURE 1

    glBindAttribLocation(gProgram, ATTRIB_VERTEX, "position");
    glBindAttribLocation(gProgram, ATTRIB_TEXTURE, "textureCoordinate");

但由于某种原因,它不起作用。

所以我调用函数glGetAttribLocation来获取属性的实际索引:

int attrib_vertex = glGetAttribLocation(gProgram, "position");
int attrib_texture = glGetAttribLocation(gProgram, "textureCoordinate");

我发现attrib_vertex = 1和attrib_texture = 0 ......

所以我应该将纹理数组设置为索引0,将顶点数组设置为索引1。

glVertexAttribPointer(attrib_vertex, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(attrib_vertex);

glVertexAttribPointer(attrib_texture, 2, GL_FLOAT, 0, 0, coordVertices);
glEnableVertexAttribArray(attrib_texture);