Qt を使用してレンダリング エンジンを作成していますが、モデルのテクスチャリングで問題が発生しています
テクスチャリングをテストするための非常に単純なシェーダーがあります: 頂点シェーダー:
Attribute vec4 Vertex;
Attribute vec2 texcoords;
uniform mat4 mvp;
varying vec2 outTexture;
void main() {
gl_Position = mvp * Vertex;
outTexture = texcoords;
}
およびフラグメント シェーダー:
uniform sampler2D tex;
varying vec2 outTexture;
void main() {
vec4 color = texture2D(tex, outTexture);
gl_FragColor = color;
}
テクスチャ座標をシェーダーに正しく渡しています。問題は、QImage をバインドし、それをテクスチャ ユニフォームに送信することです。
次のコードを使用してテクスチャをバインドしています。
const QString& filename;
GLuint m_texture;
QImage image(filename);
image = image.convertToFormat(QImage::Format_ARGB32);
glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexParameteri(GL_TEXTURE2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.width(), image.height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, image.bits());
glGenerateMipmap(GL_TEXTURE2D);
glEnable(GL_TEXTURE_2D);
シェーダーが機能し、ユニフォームをマトリックスに渡し、属性を頂点とテクスチャ座標に渡すことができますが、ユニフォームを同じ方法でテクスチャに送信しようとすると、次のようになります。
effect->setUniformValue(effect->uniformLocation("tex", texture->m_texture));
glGetError() が「無効な列挙型」を返し、「アクセス違反読み取り場所」エラーでプログラムがクラッシュする</p>
興味深いことに、テクスチャをサンプラーに送信せずにプログラムを実行しようとすると、テクスチャが実際にモデルに表示されます。これは、バインディングの方法が従来のテクスチャ処理と関係があり、テクスチャがシェーダーによって取得されている特定のテクスチャ アドレスにバインドされていると思わせます。これは私が望む効果ではありません。なぜなら、描画時にどのテクスチャをユニフォームに渡す必要があるかをプログラマーが明示的に述べられるようにしたいからです (他のユニフォームが設定されているのと同じように)。
テクスチャをサンプラーに渡すにはどうすればよいですか? テクスチャをバインドするときに何を変更する必要がありますか?