質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

GLSL ES

GLSL ESは、GLSLの派生規格で、 組み込み環境向けのOpenGL ES用のシェーダー言語です。

Android NDK

Android NDKとは、Android SDKと対を成すツールです。ネイティブコードのアプリ、またはC/C++言語の既存のポートライブラリでパフォーマンスクリティカルな部分を構築できます。ヘッダ、ライブラリを提供して、アクティビティやユーザ入力処理などを構築できます。

Q&A

0回答

1757閲覧

[Android]一部端末で画面に線が出てしまう

taiki.f

総合スコア4

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

GLSL ES

GLSL ESは、GLSLの派生規格で、 組み込み環境向けのOpenGL ES用のシェーダー言語です。

Android NDK

Android NDKとは、Android SDKと対を成すツールです。ネイティブコードのアプリ、またはC/C++言語の既存のポートライブラリでパフォーマンスクリティカルな部分を構築できます。ヘッダ、ライブラリを提供して、アクティビティやユーザ入力処理などを構築できます。

0グッド

0クリップ

投稿2020/02/04 06:33

編集2020/02/04 07:09

前提・実現したいこと

Android 上で OpenGLES2.0 を使用しテクスチャの合成テストをしたいと考えています。

プログラムを組んでいる中で、GLSL ES の gl_FragCoord 変数を使用し描画先のテクスチャと色を合成しようとしたところ合成結果に線が出てしまう現象が発生しました。

自分の扱い方が間違っている部分があるため当現象が起きているのだと思います。
線が出ないような方法が分かる方いらっしゃいましたらご教示頂けますと幸いです。

※GLSLのデバッグするコツなども教えて頂けると嬉しいです。

発生時のスクリーンショット

※テスト画像には「いらすとや」様よりダウンロードしてきた物を使用しております。
イメージ説明

検証端末

▼ 現象が発生するAndroid端末

  • Google Pixel 3(AndroidOS:10)

▼ 現象が発生しないAndroid端末

  • Xperia XZ premium(AndroidOS:9)

使用素材

▼画像1
画像1

▼画像2(いらすとや様よりダウンロードした物)
画像2

処理の概要

コード量が1,000行を超えておりますのでGithubでアップロードの準備しております。
アップロードできるまで実装の概要を記載致します。

2020/02/04 16:10 追記:GitHubプロジェクトの準備ができました。
処理の大まかな流れはそのまま残します。

  1. 画像1を読み込みテクスチャAを生成します。
  2. 画像2を読み込みテクスチャBを生成します。
  3. フレームバッファ1を生成します。
  4. フレームバッファ1のカラーバッファへテクスチャCをアタッチします。
  5. フレームバッファ1をバインドしテクスチャAを描画します。
  6. フレームバッファ1をバインドしテクスチャBとテクスチャCを合成し描画します。(※この際に下記記載のGLSL ESコードを使用しております。)
  7. 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 変数を独自で計算して出そうとしているようでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問