0

シェーダーで動作するパーティクル レンダリング ライブラリを取得しようとしています。それは固定機能で完璧に機能し、私が目指している結果を知っています. 最終的なブレンディングビットをどのように行うかがわかりません。

このようなパーティクル ライフを DWORD にパックし、dword を頂点属性の 1 つとして設定します。クワッドには、このような 4 つの頂点があります。3 つの float 位置、3 つの float 法線、4 バイトの拡散、2 つの float uv。4byte 属性はどうすればよいですか? glsl シェーダーで vec4 または float 属性として使用しますか? また、このライブラリは事前に乗算されたアルファを使用するため、どのようなブレンド方程式を使用すればよいですか? ライブラリはパイロ粒子ライブラリです。

int ir = (int) (r * 255.0f + 0.5f);
int ig = (int) (g * 255.0f + 0.5f);
int ib = (int) (b * 255.0f + 0.5f);
int ia = (int) (a * Particle.Visibility * 255.0f + 0.5f);
DWORD diffuse;

#ifdef __BIG_ENDIAN__
if (GetLibrary()->GetGraphicsDevice()->IsRGBA())
diffuse = (ir << 24) | (ig << 16) | (ib << 8) | ia;
else diffuse = (ib << 24) | (ig << 16) | (ir << 8) | ia;
#else
if (GetLibrary()->GetGraphicsDevice()->IsRGBA())
diffuse = ir | (ig << 8) | (ib << 16) | (ia << 24);
else diffuse = ib | (ig << 8) | (ir << 16) | (ia << 24);
#endif /* __BIG_ENDIAN__ */
4

1 に答える 1

0

4x 符号なしバイトはvec4(浮動小数点型) に変換されます。glVertexAttribPointerシェーダーでは常に入力タイプを float に変換します。

を選択した場合、それらの値は 0 ~ 255 の範囲normalize == GL_FALSEなります。normalize == GL_TRUE

事前に乗算されたアルファに関する質問については、ブレンド操作でソース データにアルファを乗算したくない場合は、次を使用します。

glBlendFunc(GL_ONE,                 //multiply source value by 1
            GL_ONE_MINUS_SRC_ALPHA  //multiply destination value by (1-src_alpha)
            )
于 2012-08-13T18:19:22.830 に答える