3

追加のアルファマスクを指定してテクスチャをブリットする方法は?簡単に言えば、私はこのようなものを作りたいです:

例

4

3 に答える 3

3

どういうわけか、シェーダーが提供されていない場合、ドライバーが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()
于 2012-01-11T20:21:23.937 に答える
0

これは、フラグメントシェーダーを使用して最も簡単に実行できます。

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);

そして、テクスチャユニットやその他のあいまいな状態スイッチを調整する必要もあります。個人的にはシェーダーが好きです。

于 2012-01-10T15:31:33.583 に答える
0

Pygletで、画像にアルファマスクを追加する簡単な方法があります。画像を表示するためのこのサンプルコードに基づいて、必要なものが2つあります。

まず、これらの行:

# Enable alpha blending, required for image.blit.
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

次に、画像とマスクを1つの.pngファイルに結合する必要があります。マスクをアルファチャネル(.png形式でサポート)に配置します。次に、画像をブリットすると、透明度が有効になっている状態で表示されます。(2つの別々のファイルで動作する可能性がありますが、テストしたときは、単一​​の結合されたイメージを使用します。)

詳細については、上記のサンプルコードをご覧ください。その中で、作者はチェッカーボードの背景も描画するので、透明度の効果がより明確になります。

于 2013-11-29T17:13:55.953 に答える