很奇怪,当我像下面那个坏的那样使用纹理时,显示的纹理很糟糕,只显示了 View 大小的 1/16,应该用纹理填充 View 。
但是如果我像一击一样设置顶点数组,
然后 View 的右上四分之一完美地显示了纹理!
而且我尝试了更多的负顶点坐标,都失败了,买正顶点坐标就可以了。我很困惑!
这意味着,当我尝试将纹理粘贴到 View 时,只有 View 的右上四分之一可以,其他位置(甚至是全 View )无法显示,或无法正确显示,为什么?
程序(坏程序)在模拟器上运行,但在真实设备上失败...
注意: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,
};
好:(但只有 View 的右上四分之一是可以的)
结果图片: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];
最佳答案
终于,时隔2年我解决了这个问题...
问题是由于纹理和顶点的坐标颠倒造成的。
我曾经使用 glBindAttribLocation 函数绑定(bind)属性索引。
#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);
关于ios - iOS 上的 opengl : texture only showed correctly on right upper quarter of the view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15264545/