ios - iOS 上的 opengl : texture only showed correctly on right upper quarter of the view

标签 ios opengl-es textures

很奇怪,当我像下面那个坏的那样使用纹理时,显示的纹理很糟糕,只显示了 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/

相关文章:

iphone - iOS iPhone 手指绘画类应用程序,是否有内置 Canvas 或开源项目可以帮助我入门?

android - GPU中的亮度直方图计算-android opengl es 3.0

ios - Imagemagick降低PNG深度

支持 alpha channel 的 Android opengl 屏幕截图

c++ - 加载的 2D 纹理未将自身绑定(bind)到 QUAD

ios - 将 subview 推送和弹出到堆栈时出现问题

ios - UINavigationItem 标题

java - opengl3中的立方体纹理

c++ - 为什么类 .setTexure() 方法的行为不同?

iphone - 在 iOS 上使用 Web 服务的最佳方式?