这很奇怪,当我使用下面的坏纹理时,纹理显示非常可见,仅显示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];
答案 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);