前提・実現したいこと
Android 上で OpenGLES2.0 を使用しテクスチャの合成テストをしたいと考えています。
プログラムを組んでいる中で、GLSL ES の gl_FragCoord 変数を使用し描画先のテクスチャと色を合成しようとしたところ合成結果に線が出てしまう現象が発生しました。
自分の扱い方が間違っている部分があるため当現象が起きているのだと思います。
線が出ないような方法が分かる方いらっしゃいましたらご教示頂けますと幸いです。
※GLSLのデバッグするコツなども教えて頂けると嬉しいです。
発生時のスクリーンショット
※テスト画像には「いらすとや」様よりダウンロードしてきた物を使用しております。
検証端末
▼ 現象が発生するAndroid端末
- Google Pixel 3(AndroidOS:10)
▼ 現象が発生しないAndroid端末
- Xperia XZ premium(AndroidOS:9)
使用素材
処理の概要
コード量が1,000行を超えておりますのでGithubでアップロードの準備しております。
アップロードできるまで実装の概要を記載致します。
2020/02/04 16:10 追記:GitHubプロジェクトの準備ができました。
処理の大まかな流れはそのまま残します。
- 画像1を読み込みテクスチャAを生成します。
- 画像2を読み込みテクスチャBを生成します。
- フレームバッファ1を生成します。
- フレームバッファ1のカラーバッファへテクスチャCをアタッチします。
- フレームバッファ1をバインドしテクスチャAを描画します。
- フレームバッファ1をバインドしテクスチャBとテクスチャCを合成し描画します。(※この際に下記記載のGLSL ESコードを使用しております。)
- Androidで標準で用意されているフレームバッファをバインドしテクスチャCを描画します。
結果:「発生時のスクリーンショット」のように画面に表示されます。
合成描画時に使用しているGLSL ESコード
const char BLEND_VERTEX_SHADER[] = // ブレンド用頂点シェーダ //"#version 100" "attribute vec4 position;" "attribute vec4 color;" "attribute vec2 texcoord;" "varying vec4 vColor;" "varying vec2 vTexcoord;" "uniform mat4 projection;" "void main() {" "gl_Position = projection * position;" "vColor = color;" "vTexcoord = texcoord;" "}"; const char BLEND_FRAGMENT_SHADER[] = // ブレンド用フラグメントシェーダプログラム //"#version 100" "precision mediump float;" "varying vec4 vColor;" "varying vec2 vTexcoord;" "uniform sampler2D textureSrc;" "uniform sampler2D textureDst;" "uniform vec2 textureSize;" "const vec4 minColor = vec4(0.0, 0.0, 0.0, 0.0);" "const vec4 maxColor = vec4(1.0, 1.0, 1.0, 1.0);" "vec3 GetColor(const in vec3 src, const in vec3 dst, const in float alpha)" "{" "return clamp(vec3(src * dst) * alpha + dst * (1.0 - alpha), minColor.rgb, maxColor.rgb);" "}" "void main() {" "lowp vec4 src = texture2D(textureSrc, vTexcoord);" "lowp vec4 dst = texture2D(textureDst, gl_FragCoord.xy / textureSize);" "gl_FragColor.rgb = GetColor(src.rgb * vColor.rgb, dst.rgb, src.a * vColor.a);" "gl_FragColor.a = 1.0;" "}";
試したこと
使用する画像を変更してみたり、glEnable関数/glDisable関数で色々な設定を有効/無効に変えたりしているのですがどうしても線が消えません。
gl_FragCoord 変数がバーテックスシェーダーで計算できるという記事を見たので試してみましたが、計算方法が良く分からず断念しました。
開発環境
- Visual Studio 2017 Professional
- Android NDK r15c
- Android SDK r25
- Java SE Development Kit 18.0.25
補足情報
一部端末でgl_FragCoord 変数がズレるという記事が書いてありました。
gl_FragCoord 変数を独自で計算して出そうとしているようでした。
あなたの回答
tips
プレビュー