3

QPainter を使用して描画する QPixmap を作成したいと思います。QPixmap は、あらかじめ乗算されたカラー チャネルを使用せずに透明度をサポートする必要があります。

現在、これを行うには、目的の寸法で QPixmap を作成し、各チャネル (アルファを含む) をゼロに設定した QColor で塗りつぶします。

tex = QtGui.QPixmap(width, height)
c = QtGui.QColor(0)
c.setAlpha(0)
tex.fill(c)

これにより、QPixmap に透明度が追加されます。ただし、QPainter を使用して QPixmap に描画すると、描画された色の値にソースのアルファ値が乗算されます。QPixmap は後で QGLWidget のテクスチャとして使用され、QPixmap のアルファ チャネル (現在は QPainter を使用して描画されたソースのアルファ) をレンダリングすると、カラー チャネルに対して再度乗算されるため、これは必要ありません。つまり、アルファが 2 倍になります。

QPixmap の代わりに QtGui.QImage.Format_ARGB32 形式の QImage を使用すると、カラー チャネルはあらかじめ乗算されず、アルファは 1 回だけ適用されます。ただし、これはレンダリング中に遅すぎます。上記の形式で QImages に描画してから QPixmaps に変換しようとしましたが、同じ結果が得られました (事前に乗算されたカラー チャネルに再びアルファ チャネルが乗算されます)。Trolltechのドキュメントによると、

システムに応じて、QPixmap は RGB32 または事前に乗算されたアルファ形式を使用して保存されます。画像にアルファ チャネルがあり、システムで許可されている場合、優先される形式は乗算済みアルファです。

X (Linux) を使用しています。QPixmap にアルファ チャンネルがある場合、QPixmap がカラー チャンネルを事前乗算しないようにする方法はありますか?

4

1 に答える 1

0

最終的に QImages を使用し、呼び出していた QGLWidget::bindTextures の数を最小限に抑えることでコードを最適化しました。事前に乗算された QPixmap を半透明のテクスチャとして使用する方法については、まだ満足のいく回答を受け取っていませんが、プログラムのパフォーマンスには満足しており、このスレッドをチェックすることはもうありません。

于 2011-04-28T01:14:51.793 に答える