属性のOpenGL ES

新年カウントダウン

02

注:特に断りのない限り、GLSLのOpenGL ESバージョン2.0のテキストを参照してください。

特別な属性は、頂点シェーダに「外部」からの通信に使用される、可変型でのみ頂点シェーダ(頂点シェーダ)を用いることができ、他のシェーダで使用することができないGLSL、一般店舗属性位置座標に使用される、フランスベクター、色及びテクスチャ座標は、次のように定義されます:

attribute vec4 vPosition;

ISOは、OpenGLは、OpenGL ES 2.0の少なくとも8つの属性のOpenGL ES 3.0少なくとも16の支持属性、これは少なくともされることに注意してくださいを支持する所定の、次のように属性コードによってサポートされる最大数、Kotlinコードを取得し、8つ以上であってもよいです。

var count = IntArray(1)
GLES20.glGetIntegerv(GLES20.GL_MAX_VERTEX_ATTRIBS, count, 0)
Log.d("OpenGL ES", "attribute支持的最大数量:${count[0]}")

ここでは非常に単純なバーテックスシェーダは以下のとおりです。

attribute vec4 vPosition;
void main() {
    gl_Position = vPosition;
}

vPosition以下は頂点データのアプリケーションが私のvPositionに渡す方法について説明し、このデータは、外部アプリケーションから渡される必要がある、頂点データです。

01

属性のハンドルを取得します

次のコードのAndroid Kotlinでハンドルを取得します。

val loc = GLES20.glGetAttribLocation(programHandle, attrName)

programHandleは、ハンドルのプログラムであり、attrNameでは、属性の名前です。

02

定義された頂点データ

タイプ一般Androidの頂点データがFloatBufferである場合には、3つの頂点Kotlinコードを定義する以下の通りであります:

var vertexBuffer = array2Buffer(
            floatArrayOf(
                0.0f, 0.5f, 0.0f, // top
                -0.5f, -0.5f, 0.0f, // bottom left
                0.5f, -0.5f, 0.0f  // bottom right
            )
        )
    fun array2Buffer(array: FloatArray): FloatBuffer {
        val bb = ByteBuffer.allocateDirect(array.size * 4)
        bb.order(ByteOrder.nativeOrder())
        var buffer = bb.asFloatBuffer()
        buffer.put(array)
        buffer.position(0)
        return buffer
    }

03

属性データを設定します

頂点データセット、すなわち、頂点データは、次のようにKotlinコードは、GPUにCPUから転送されます。

fun setAttributePointer(location: Int, buffers: FloatBuffer, pointSize: Int) {
        buffers.position(0)
        GLES20.glEnableVertexAttribArray(location)
        GLES20.glVertexAttribPointer(location, pointSize, GLES20.GL_FLOAT, false, 0, buffers)
    }

これは一般的な方法を定義し、この方法は、以下に説明します。

  • GLES20.glEnableVertexAttribArray(位置)

現在の属性を活性化し、位置を得るvPositionハンドルの最初のステップであり、

  • GLES20.glVertexAttribPointer

属性セットのプロパティがどのようにバッファからデータを取得します。公式APIのアドレスします。https://www.khronos.org/registry/OpenGL-Refpages/es2.0/、パラメータを次のように

  •  場所:本出願のハンドル属性のプロパティは最初のステップで取得したvPositionハンドルを指します。

  • ポイントサイズ:各頂点属性データの数は、第二のステップで定義されたルック頂点データの配列を返し、3台のフロート表すX、Y、Zの各頂点は、(2つの頂点のフロートを表すことができますx、y)は、本出願の値は3です。

  • タイプ(第3パラメータ):本アプリケーションの頂点データのタイプは、値がGLES20.GL_FLOATで、フロートです。

  • 正規化された(第四パラメータ):正規化はこのような短いフロートスイッチとして、float型に浮いていないかどうか、それは、通常に設定偽を正規のAndroidを必要としません。

  • (5番目のパラメータ)のストライド2つの連続する頂点間のオフセットは、現在のアプリケーションのために、ゼロに設定頂点間の連続しています。

  • 頂点バッファ

GPUは、以下に示すようなデータ構造バッファの取得に計算するときのデータは、データが取られるかを定義するために固定領域に格納されているGPUの属性メモリ属性インデックスパラメータではなく、メモリ領域:

GPUへのアプリケーションデータの後に、データ構造は、上記で定義されたGPUの頂点にメモリに格納されたデータは次のとおり

頂点データ構造は、このデータ構造は、頂点データのあなたの定義に依存していません。

注目の過去

Androidの概要についてのOpenGL ES

ビルドへのOpenGL ES環境

あなたにこの記事は参考になりました場合は、スキャンコード懸念のサブスクリプション番号を歓迎します。

 

公開された123元の記事 ウォン称賛68 ビュー30万+

おすすめ

転載: blog.csdn.net/mengks1987/article/details/104075159