0

OpenGL を使用して透明な BGRA 画像 (テキスト オーバーレイ) を移動および回転したいと考えています。私が使用するコードスニペットは次のとおりです。

glViewport(0, 0, iWidth, iHeight); // Reset The Current Viewport
glEnable(GL_TEXTURE_2D);

glGenTextures(1, &arTex[0].iName);
glBindTexture(GL_TEXTURE_2D, arTex[0].iName);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, 4, imf.iWidth, imf.iHeight, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, ib.GetData());

glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Note: Transparent alpha value
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrtho(-dAspectCanvas / 2.0, dAspectCanvas / 2.0, -0.5, 0.5, -1.0, 1.0); // Note: Using (-1.0; 1.0) for Z-planes
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScaled(Motion.Scale.GetValue(dPosition), Motion.Scale.GetValue(dPosition), 1.0);
glTranslated(Motion.OffsetX.GetValue(dPosition) * dAspectCanvas, Motion.OffsetY.GetValue(dPosition), 0.0);
glRotated(Motion.Rotation.GetValue(dPosition), 0.0, 0.0, 1.0);
glTranslated(Motion.PositionX.GetValue(dPosition) * dAspectCanvas, Motion.PositionY.GetValue(dPosition), 1.0);

// Rotating and moving

glBindTexture(GL_TEXTURE_2D, arTex[iTexIndex].iName); // has to be called outside glBegin/glEnd scope

glBegin(GL_TRIANGLE_STRIP); // "Many OpenGL applications avoid quads altogether because of their inherent rasterization problems"

glTexCoord2d(rcTextureIntersection.left, rcTextureIntersection.top);
glVertex2d(rcVertexIntersection.left, rcVertexIntersection.top);
glTexCoord2d(rcTextureIntersection.right, rcTextureIntersection.top);
glVertex2d(rcVertexIntersection.right, rcVertexIntersection.top);
glTexCoord2d(rcTextureIntersection.left, rcTextureIntersection.bottom);
glVertex2d(rcVertexIntersection.left, rcVertexIntersection.bottom);
glTexCoord2d(rcTextureIntersection.right, rcTextureIntersection.bottom);
glVertex2d(rcVertexIntersection.right, rcVertexIntersection.bottom);
glEnd();

glDisable(GL_TEXTURE_2D);
glFlush();   
glReadBuffer(GL_BACK);
glReadPixels(0, 0, imf.iWidth, imf.iHeight, GL_BGRA_EXT, GL_UNSIGNED_BYTE, ibOut.GetData());

しかし、glTexImage2D で何を試しても、透明な黒の画像は完全に不透明な黒の画像になります。入力 BGRA イメージにはバイトが含まれます: 0, 0, 0, 0, 0 .... 回転後、出力イメージには 0, 0, 0, 255, 0, 0, 0, 255, 0.... が含まれます。常に 255 に設定されており、その理由がわかりません。

4

4 に答える 4

1

ここで 2 つの問題に直面しています。1 つは、ブレンドを有効にしなかったことです。これには、テクスチャのアルファ値が透明度に影響を与えないという効果があります。

もう 1 つの問題は、あなたにとってより重要なことですが、フレームバッファ (テクスチャを描画している場所) にはおそらくアルファ チャネルがないため、デフォルトで最大値になります。テクスチャがフレームバッファのアルファ値に影響を与えるようにするためにブレンドを有効にする必要はありません (置き換えられるだけです)。ただし、これを機能させるには、アルファ チャネルを備えたフレーム バッファが必要です。画面上のフレームバッファにアルファ バッファを取得することは可能です (私はそれをお勧めします)。しかし、画像操作の場合、フレームバッファは間違った場所です。これには安全な環境が必要です: A Framebuffer Object .

于 2012-02-13T23:10:52.010 に答える
0

アルファは「透明」という意味ではありません。アルファ自体には何の意味もありません。その価値を使って何かをして初めて意味があります。

オブジェクトをレンダリングし、アルファを使用してそのオブジェクトの透明度を制御する場合は、ブレンドを有効にして適切なブレンド モードを設定する必要があります。

于 2012-02-13T22:56:37.020 に答える
0

おそらく正しいアルファ色で glClearColor を設定します。

于 2013-01-08T22:22:57.513 に答える
0

何もブレンドする必要はありませんが、アルファ ビットを使用してフレーム バッファを設定する必要があります。これは問題でした。wglCreateContext を完全に忘れていました。

助けてくれてありがとう!

于 2012-02-14T22:06:00.393 に答える