6

私はこれに対して何時間も頭を悩ませてきました。それは単純なことだと確信していますが、結果を得ることができません。OpenGL 呼び出しをカプセル化するために小さなライブラリを作成したため、このコードを少し編集する必要がありましたが、以下は状況の正確な説明です。

次の頂点シェーダーを使用しています。

#version 330
in vec4 position;
in vec2 uv;
out vec2 varying_uv;
void main(void)
{
    gl_Position = position;
    varying_uv = uv;
}

そして、次のフラグメント シェーダー:

#version 330
in vec2 varying_uv;
uniform sampler2D base_texture;
out vec4 fragment_colour;
void main(void)
{
    fragment_colour = texture2D(base_texture, varying_uv);
}

両方のシェーダーがコンパイルされ、プログラムが問題なくリンクされます。

私の init セクションでは、次のように 1 つのテクスチャをロードします。

// Check for errors.
kt::kits::open_gl::Core<QString>::throw_on_error();

// Load an image.
QImage image("G:/test_image.png");
image = image.convertToFormat(QImage::Format_RGB888);

if(!image.isNull())
{
    // Load up a single texture.
    glGenTextures(1, &Texture);
    glBindTexture(GL_TEXTURE_2D, Texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.constBits());
    glBindTexture(GL_TEXTURE_2D, 0);
}

// Check for errors.
kt::kits::open_gl::Core<QString>::throw_on_error();

Qt を使用してテクスチャをロードしていることがわかります。::throw_on_error() への呼び出しは、(Error() を呼び出して) OpenGL のエラーをチェックし、エラーが発生した場合は例外をスローします。このコードでは OpenGL エラーは発生せず、Qt を使用してロードされたイメージは有効です。

描画は次のように実行されます。

// Clear previous.
glClear(GL_COLOR_BUFFER_BIT |
    GL_DEPTH_BUFFER_BIT |
    GL_STENCIL_BUFFER_BIT);

// Use our program.
glUseProgram(GLProgram);

// Bind the vertex array.
glBindVertexArray(GLVertexArray);

/* ------------------ Setting active texture here ------------------- */

// Tell the shader which textures are which.
kt::kits::open_gl::gl_int tAddr = glGetUniformLocation(GLProgram, "base_texture");
glUniform1i(tAddr, 0);

// Activate the texture Texture(0) as texture 0.
glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, Texture);

/* ------------------------------------------------------------------ */

// Draw vertex array as triangles.
glDrawArrays(GL_TRIANGLES, 0, 4);
glBindVertexArray(0);
glUseProgram(0);

// Detect errors.
kt::kits::open_gl::Core<QString>::throw_on_error();

同様に、OpenGL エラーは発生せず、画面に三角形が描画されます。ただし、次のようになります。

テクスチャリング、期待どおりではありません。

問題はテクスチャ座標に関連している可能性があります。そこで、s を「赤」コンポーネントとして、t を「緑」コンポーネントとして使用して、次の画像をレンダリングしました。

st 座標を使用したカラーリング。

テクスチャ座標は正しいように見えますが、まだ破滅の黒い三角形が表示されています。私は何を間違っていますか?

4

2 に答える 2

11

テクスチャ オブジェクトの不完全な初期化に依存している可能性があると思います。

テクスチャの MIN および MAG フィルタを初期化してみてください

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

さらに、テクスチャのサイズを確認することをお勧めします。2 のべき乗でない場合は、ラッピング モードを CLAMP_TO_EDGE に設定する必要があります。

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);

黒いテクスチャはこの問題が原因であることが多く、非常に一般的な問題です。

チャオ

于 2012-01-11T11:22:54.713 に答える
2

フラグメントシェーダーでは、自己定義のターゲットに書き込んでいます

   fragment_colour = texture2D(base_texture, varying_uv);

それがまたはでない場合はgl_FragColorgl_FragData[…]指定されたフラグメントデータの場所を適切に設定しましたか?

于 2012-01-11T11:29:46.950 に答える