为什么我的iPhone OpenGL-ES纹理不覆盖视口?

时间:2012-08-13 08:07:38

标签: iphone opengl-es vertex-shader

我有一个大小为320x320的方形图像,我从中创建了一个OpenGL纹理。我使用最基本的Vertext和Fragment着色器,我想在整个视图中显示纹理。视图(从许多OpenGL iOS示例中找到的UIView派生的EAGLView)的大小也是320x320。

问题是,图像绘制在左上角,仅覆盖整个视图的50%左右。它不包括100%的视图。我不知道为什么?

Red square is EAGLView

这是我的代码:

position = glGetAttribLocation(m_shaderProgram, "position");
inputTextureCoordinate = glGetAttribLocation(m_shaderProgram, "inputTextureCoordinate");    
inputImageTexture = glGetUniformLocation(m_shaderProgram, "inputImageTexture");

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

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

[EAGLContext setCurrentContext:context];

glViewport(0, 0, backingWidth, backingHeight); // These are 320, 320

glUseProgram(m_shaderProgram);

glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);

glActiveTexture(GL_TEXTURE2); 
glBindTexture(GL_TEXTURE_2D, sourceTextureID); // The texture is also of size 320x320

glUniform1i(inputImageTexture, 2);  

glVertexAttribPointer(position, 2, GL_FLOAT, 0, 0, imageVertices);
glVertexAttribPointer(textureCoordinate, 2, GL_FLOAT, 0, 0, textureCoordinates);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);    
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

Vertext Shader。

 attribute vec4 position;
 attribute vec4 inputTextureCoordinate;

 varying vec2 textureCoordinate;

 void main()
 {
    gl_Position = position;
    textureCoordinate = inputTextureCoordinate.xy;
 }

Fragment Shader。

 varying highp vec2 textureCoordinate;
 uniform sampler2D inputImageTexture;

 void main()
 {
    gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
 }

1 个答案:

答案 0 :(得分:2)

所以问题是纹理的尺寸不是2的力量。所以我们需要相应地缩放textureCoordinates。插入以下行解决了问题...

GLfloat textureCoordinates[] = {
    0.0f, 1.0f,
    1.0f, 1.0f,
    0.0f,  0.0f,
    1.0f,  0.0f,
};

float nearest2sPower = 2;

if (nearest2sPower < backingWidth) {
    while (nearest2sPower < backingWidth) {
        nearest2sPower *= 2;
    }
}

verticalFlipTextureCoordinates[2] = backingWidth/nearest2sPower;
verticalFlipTextureCoordinates[6] = backingWidth/nearest2sPower;

nearest2sPower = 2;

if (nearest2sPower < backingWidth) {
    while (nearest2sPower < backingWidth) {
        nearest2sPower *= 2;
    }
}

verticalFlipTextureCoordinates[1] = backingHeight/nearest2sPower;
verticalFlipTextureCoordinates[3] = backingHeight/nearest2sPower;