1

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>

興味深いことに、テクスチャをサンプラーに送信せずにプログラムを実行しようとすると、テクスチャが実際にモデルに表示されます。これは、バインディングの方法が従来のテクスチャ処理と関係があり、テクスチャがシェーダーによって取得されている特定のテクスチャ アドレスにバインドされていると思わせます。これは私が望む効果ではありません。なぜなら、描画時にどのテクスチャをユニフォームに渡す必要があるかをプログラマーが明示的に述べられるようにしたいからです (他のユニフォームが設​​定されているのと同じように)。

テクスチャをサンプラーに渡すにはどうすればよいですか? テクスチャをバインドするときに何を変更する必要がありますか?

4

2 に答える 2

3

に変更します

effect->setUniformValue(effect->uniformLocation("tex"), texture->m_texture);

また

effect->setUniformValue("tex", texture->m_texture); 
于 2011-08-12T00:05:28.593 に答える
1

次を使用して QImage を変換してみてください。

image = QGLWidget::convertToGLFormat(image);

別の考えとして、ES2 を使用している場合、GL_RGBA8 は有効ではありません。GL_BGRA はオプションの拡張機能であるか、ES 2 ではない可能性があると思います。これが役立つことを願っています。

于 2013-08-17T21:18:53.180 に答える