追加のアルファマスクを指定してテクスチャをブリットする方法は?pyglet:指定したアルファマスクを使用してテクスチャをblitする
答えて
どういうわけか私はあなたのドライバがシェーダを提供していないが、それはショットの価値があるならば、FrameBufferObject拡張をサポートしているとは思えません。これはあなたが望むものではありません。あなたはおそらくglTexEnv
を使用しなければならないでしょうし、それについてはもうちょっと賢いかもしれませんが、これはマスクと画像を適用しますが、実際にはアルファ値を加えません:
import pyglet
from pyglet.gl import *
window = pyglet.window.Window()
image = pyglet.resource.image('pic.jpg')
mask = pyglet.resource.image('mask.jpg')
createdtex=False;
imagetex = 0
@window.event
def on_draw():
window.clear()
global createdtex
texfrmbuf =(GLuint*1)()
global imagetex
if createdtex!=True:
imagetex = image.get_texture()
glEnable(GL_BLEND)
glBlendFunc(GL_ZERO, GL_SRC_COLOR)
glGenFramebuffersEXT(1,texfrmbuf)
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT,texfrmbuf[0])
glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT, imagetex.target,imagetex.id,0)
mask.blit(0,0)
glFlush()
glDisable(GL_BLEND)
glDeleteFramebuffersEXT(1,texfrmbuf)
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT,0)
createdtex=True
imagetex.blit(0,0)
pyglet.app.run()
あなたの答えは正確な解決策ではありませんが、最終的に正しい方法を見つけるのを本当に手伝ってくれたので、私はそれを受け入れます。ここに作業コードがあります:http://paste.pocoo.org/show/534457/ありがとう、助けを求めるcocos2dのソースコード(: –
@Pevziはあなた自身の答えとしてそれを投稿し、そのようにマークすることは自由です。あなたが私に報いたいなら、いつでも私をアップアップすることができます。 – PeterT
これが最も簡単なフラグメントシェーダを用いて達成される:
uniform sampler2D image;
uniform sampler2D mask;
varying vec2 texcoord;
void main()
{
gl_FragColor.a = texture2D(mask, texcoord);
/* we use pre multiplied alpha */
gl_FragColor.rgb = texture2D(image, texcoord) * gl_FragColor.a;
}
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
でこれを組み合わせると、あなたが望むものを得た簡単に言えば、私はこのようなものを作りたいです。シェーダを使用できない、または使用したくない場合は、マルチテクスチャとテクスチャコンバイナ環境を使用してください:
最後にテクスチャコンバイナを使用して以来、ひどい時間がかかりました。おそらくいくつかの間違いがあります):
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE0);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE1);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_ALPHA);
また、テクスチャユニットやその他の不明瞭な状態スイッチを使用する必要もあります。個人的に私はシェイダーを好みます。
残念ながら、私のネットブックのビデオドライバはシェーダをまったくサポートしていませんが、マルチテクスチャは今まで私にとってはかなり難しいです。しかし、他の適切な解決策が見つからない場合は、フラグメントシェーダーを使用して終了します。あなたの答えをありがとう。 –
画像にアルファマスクを追加するには、Pygletのやや簡単な方法があります。 this sample code for displaying an imageに基づいて、必要なものが2つあります。
まず、これらの行:
# Enable alpha blending, required for image.blit.
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
第二に、あなたは1つの.pngファイルに、イメージとマスクを結合する必要があると思います。アルファチャンネル(.png形式をサポートする)にマスクを置きます。その後、イメージをblitすると、透過性を有効にして表示されます。 (2つの別々のファイルで動作するかもしれませんが、テストしたところ、1つの合成画像を使用しています)。
詳細については上記のサンプルコードをご覧ください。その中で、作者はチェッカー盤の背景を描くので、透明性の効果はより明らかです。
- 1. BlackスクリーンショットPygletを使用しました
- 2. Pygletがテキストをテクスチャに描画します
- 3. glGetFloatvを使用してpygletのmodelview行列を取得する
- 4. Pygletを使用して透明プリミティブを描画する方法
- 5. Imgur API - 指定したギャラリー/ディレクトリを使用してアップロードする
- 6. pygletスプライト/テクスチャの問題:左下から引き伸ばし
- 7. 指定されたキーストアを使用して署名するアプリケーション
- 8. のC#を使用して、指定したテキストを識別
- 9. テクスチャを使用したクォーツ描画
- 10. 32ビットRGBAテクスチャを使用したglBlendFunc()
- 11. Three.js、画像をアップロードしてテクスチャとして使用する
- 12. JGitを使用して指定したコミットにリセット
- 13. pygletを使用しての問題点と一緒に
- 14. GL_SHORTをテクスチャ座標として使用
- 15. QTラッパーを使用して3Dテクスチャを正しくアップロードする
- 16. matplotlibアニメーションプロットはblitを使用して軸上のラベルを更新しません
- 17. デスクトップをキャプチャしてテクスチャとして使用しますか?
- 18. fetch()を使用して指定したフィールドでデータを取得する
- 19. レンジャーのカスタムコマンドを使用して、指定したディレクトリにファイルを移動しますか?レンジャーを使用して
- 20. カスタムURLを使用して指定されたビューを開く
- 21. mediawiki:mediawiki APIを使用して、指定されたカテゴリのページを
- 22. 指定されたペアリストを使用してカメを描く
- 23. AttributeRoutingを使用してWebAPIのデフォルトコントローラ/アクションルートを指定します。
- 24. PercentRelativeLayoutを使用して幅のみを指定する(Heigh Auto)
- 25. fsockopenを使用してソースIPを指定する
- 26. フィルタメソッドを使用してオプション引数を指定する角度
- 27. kerasライブラリを使用して密集度を指定する
- 28. Teraformを使用してAWSにDockerrun.aws.jsonを指定する方法
- 29. datamapperを使用して結果の順序を指定する
- 30. sparklyrを使用して列クラスを指定する
ニースの女性、あなたは彼女を知っていますか? ;) 冗談だ。アルファブレンディングを調べる必要があります。私はまだpygletでそれをしていないので、私は貴重な助けを提供することはできません。 – Constantinius
CPUやシェーダでこれを行う必要がある場合を除き、次のようにします。 '... //マスクを描画します。 gl.glEnable(GL_BLEND); gl.glBlendFunc(GL_DST_COLOR、GL_ZERO) 2番目の画像を描画します.'そして、他のものの上にレンダリングしたい場合は、レンダーターゲットとしてテクスチャを使ってこれを行います。また、女性は、多くの画像処理論文で使用されていた有名な "lena"画像です。 – PeterT
@PeterTこれは私の望むものに近いようですが、レンダリングターゲットとしてのテクスチャでこれを実行する方法を説明できますか?私は本当にそれを理解することはできません。 –