私はこれに対して何時間も頭を悩ませてきました。それは単純なことだと確信していますが、結果を得ることができません。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 を「緑」コンポーネントとして使用して、次の画像をレンダリングしました。
テクスチャ座標は正しいように見えますが、まだ破滅の黒い三角形が表示されています。私は何を間違っていますか?