0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GearVR Frameworkでカスタムシェーダーを使う

Posted at

GearVR Frameworkのカスタムシェーダーを使うやり方のWebページの内容が古くてそのままやってもエラーで動かなかったのでいろいろ試行錯誤した結果、以下のようにしてうまくいきました。
ソースファイル中に定数文字列でシェーダーコードを書くと読みづらいのでリソースファイルから読み込むようにしました。

まず、res/raw以下にシェーダーを記述したファイルを作ります。

res/raw/vertexshader.glsl
precision highp float;
in vec3 a_position;
uniform mat4 u_mvp;

void main()
{
    gl_Position = u_mvp * vec4(a_position, 1.0);
}
res/raw/fragmentshader.glsl
precision mediump float;
uniform vec4 u_color;
out vec4 fragColor;

void main()
{
    fragColor = u_color;
}

次に、GVRShaderTemplateを継承したクラスを作り、コンストラクタの中でsetSegment("FragmentTemplate",...),setSegment("VertexTemplate",...)に各シェーダーのソースコードを渡すようにします。
GVRShaderTemplateのコンストラクタ引数には、このシェーダーが取りうるパラメーターを第一引数に、シェーダーのバージョンを第二引数に渡します。
リソースから文字列を読み込むのにKotlinの方が楽だったのでKotlinで実装しました。

ColorShader.kt
import android.content.Context
import org.gearvrf.GVRContext
import org.gearvrf.GVRShaderTemplate
import java.io.InputStream
import java.nio.charset.Charset

class ColorShader(gvr: GVRContext) : GVRShaderTemplate("int u_right", 300) {

    init {
        setSegment("FragmentTemplate", shaderSource(gvr.context, R.raw.fragmentshader))
        setSegment("VertexTemplate", shaderSource(gvr.context, R.raw.vertexshader))
    }

    private fun shaderSource(context: Context, rawRes: Int): String = readTextAndClose(context.resources.openRawResource(rawRes))

    private fun readTextAndClose(inputStream: InputStream, charset: Charset = Charsets.UTF_8): String {
        return inputStream.bufferedReader(charset).use { it.readText() }
    }
}

そして、このシェーダーを使って描画したいオブジェクトのGVRRenderDataに、setShaderTemplate()で先ほど作ったクラスを渡します。

// Kotlin
sceneObject.renderData.setShaderTemplate(ColorShader::class.java)
// Java
sceneObject.getRenderData().setShaderTemplate(ColorShader.class);

それから、このオブジェクトに適用するマテリアルはコンストラクタでGVRMaterial(gvrContext, GVRMaterial.GVRShaderType.BeingGenerated.ID)のようにして、シェーダーがまだ設定されていないことを明示することが推奨されています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?