1

サイズ 320x320 の正方形の画像があり、そこから OpenGL テクスチャを作成します。最も基本的な Vertext シェーダーと Fragment シェーダーを使用し、ビュー全体にテクスチャを表示したいと考えています。ビュー (多くの OpenGL iOS サンプルで見られる UIView から派生した EAGLView) も 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

問題は、テクスチャの寸法が 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;
于 2012-08-13T10:25:41.100 に答える