1

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

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

红色方块为 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];

顶点着色器。

 attribute vec4 position;
 attribute vec4 inputTextureCoordinate;

 varying vec2 textureCoordinate;

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

片段着色器。

 varying highp vec2 textureCoordinate;
 uniform sampler2D inputImageTexture;

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

1 回答 1

2

So the problem is that the texture's dimensions were not 2's power. So we need to scale the textureCoordinates accordingly. Inserting following lines solved the problem...

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;
于 2012-08-13T10:25:41.100 回答