1

很奇怪,当我像下面那个坏的那样使用纹理时,出现的纹理很糟糕,只显示了视图的 1/16 大小,应该用纹理填充视图。

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

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

而且我尝试了更多的负顶点坐标,都失败了,买正顶点坐标就可以了。我感到很困惑!

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

并且程序(坏的)在模拟器上运行,但在真正的设备上失败了......

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

BAD 和 GOOD 之间的区别只是 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,
};

好:(但只有右上四分之一的视图是可以的)

结果图片: 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];
4

1 回答 1

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);
于 2015-06-12T12:39:17.297 回答