1

OpenGL でチェッカーボードをレンダリングしようとしていますが、出力が正しくありません。[チェッカーボード] http://s9.postimg.org/g3wk1py4f/large_checkerboard.png「大きなチェッカーボード」

私は問題を絞り込もうとしましたが、11 x 11 のグリッドを描画しようとすると、垂直方向に 10 ピクセルしか表示されないことに気付きました [小さなチェッカーボード] http://s12.postimg.org/olu7575jd/small_checkerboard.png「小さいチェッカーボード」

質感自体はOKです。問題は頂点座標にあると思われます。コードは次のとおりです。

テクスチャの作成:

const int size = 11;

unsigned char buffer[size * size * 4];

for (size_t i = 0; i < size; i++)
{
    for (size_t j = 0; j < size; j++)
    {
        unsigned char rgb = i % 2 == 1 || j % 2 == 1 ? 255 : 0;
        int index = (i * size + j) * 4;
        buffer[index] = rgb;
        buffer[index + 1] = rgb;
        buffer[index + 2] = rgb;
        buffer[index + 3] = 255;
    }
}

テクスチャ パラメータ:

glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

頂点: (画面サイズは 1024 * 768 です。右上の 4 分の 1 は変換せずに描画しています)

float w = size / 512.0f;
float h = size / 384.0f;

GLfloat vertices[] =
{
     0.0f,    h, 0.0f, 1.0f,
     0.0f, 0.0f, 0.0f, 0.0f,
     w,       h, 1.0f, 1.0f,
     w,    0.0f, 1.0f, 0.0f
};

int positionLocation = glGetAttribLocation(program.getId(), "a_position");
int textureLocation = glGetAttribLocation(program.getId(), "a_texCoord");

glEnableVertexAttribArray(positionLocation);
glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), vertices);

glEnableVertexAttribArray(textureLocation);
glVertexAttribPointer(textureLocation, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), vertices + 2);

glUniform1i(textureLocation, 0);

図:

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

およびシェーダー:

const char* VertexShaderCode =
    "attribute vec4 a_position; \n"
    "attribute vec2 a_texCoord; \n"
    "varying vec2 v_texCoord; \n"
    "void main() \n"
    "{ \n"
    " gl_Position = a_position; \n"
    " v_texCoord = a_texCoord; \n"
    "}";

const char* FragmentShaderCode =
    "uniform sampler2D s_texture; \n"
    "varying vec2 v_texCoord; \n"
    "void main() \n"
    "{ \n"
    " gl_FragColor = texture2D(s_texture, v_texCoord); \n"
    "}";
4

2 に答える 2

1

これはよくある質問です。StackOverflowで(私も)何度も回答されています。これがそれらの答えの1つですhttps://stackoverflow.com/a/17422950/524368

基本的に、フェンスポスティングの問題に遭遇しています。

于 2013-07-27T10:38:28.903 に答える
0

これは私のコードのバグでした。OpenGL とは関係ありません。私は、調整幅と調整高さの代わりに、幅と高さを CreateWindow に渡していました。(ボーダーとメニューバーを考慮して計算しました)

于 2013-07-28T07:07:26.087 に答える