iOS版---統一変数(制服)と変数の統一されたブロック上のOpenGL ES(UBO)

簡単な紹介

均一GPUアプリケーション・シェーダおよび頂点均一な特性にCPUからデータを送信するが、若干異なる方法です。

まず、均一であるグローバル(グローバル)インチ グローバル変数は一様に、各シェーダプログラムオブジェクト内で一意であることを意味しなければならない、そしてそれがどの段階でも、任意のシェーダシェーダプログラムにアクセスすることができます。
それらがリセットまたは更新されるまで第二に、何でも値が均一に設定されているものに入れ、均一では常に自分のデータを保存します。

単一の統合変数

声明

uniform vec3 color

割り当て

//获取指定统一变量的location
int vertexColorLocation = glGetUniformLocation(_program, "test");

//为vec3 的统一变量 赋值
glUniform3f(vertexColorLocation, 0.0f, 1.0f, 0.0f);

関数名が均一変数の変更値は、iは32ビット整数である。この図の受け入れのための番号(1,2,3,4)を含有するための調整変数の異なるタイプに応じて、均一な割り当て関数は、Fは32を表し、ビット浮動小数点、UIは、32ビットの符号なし整数型に対応するポインタのV受付を表す(またはアレイに渡される)、8ビット符号なしバイトをUB。

glUniform1f(GLint locaation,GLFloat x)これは、float型を表し
glUniform2f(GLint locaation,GLFloat x,GLFloat y)型フロートの二成分のベクトルで表される
glUniform1fv(GLint locaation,GLSize count,const GLfloat* value)float型のポインタ
glUniformMatrix4x3(Glint location,GLsizei count,GLboolean transpose,const GLfloat* value)4x3の行列パラメータとして表現を:.トランスポーズは、行優先順(GL_TRUE)を使用するかどうかを示します

UBO

UBO(ユニフォームバッファオブジェクト)が言語均一発色型変数格納するために使用されるバッファ・オブジェクトを異なる色の共通言語プログラムに実装均一変数UBOの使用を可能にする、可変言語プログラムの種類に均一な着色を達成するために設けられていてもよいですそして、更新。

UBOは、GLSLシェーディング言語の制服ブロックを言及する必要がある述べた多数の制服の変数の型を必要とするプログラムが大幅にパフォーマンスを向上させることができため、それは、変数制服一緒に統一された管理の多くの種類になります。(VBOのグローバルバージョンのようなビット)

原則

回路図.PNG

メモリキャッシュ(バッファ)で作成されたオブジェクトは、バッファに格納変数データを統一され、バッファはバッファインデックスポイントは、変数を統一する。この時点で接続変数とキャッシュ結合、結合点を指定しました。

UBOを設定します

//统一变量块
layout (std140) uniform colorBlock{
    vec4 cc;
};
        GLuint blockid,bufferid;
        GLint blocksize;
        GLint point = 1;
        
        // 统一变量数据
        GLfloat blockData[] = {
            1.0f,1.0f,1.0f,1.0f
        };

        //获取统一变量块索引
        blockid = glGetUniformBlockIndex(_program, "colorBlock");
        
        //获取统一变量块大小
        glGetActiveUniformBlockiv(_program, blockid, GL_UNIFORM_BLOCK_DATA_SIZE, &blocksize);
        
        //将变量索引 和 point 绑定
        glUniformBlockBinding(_program, blockid, point);

        //创建与绑定缓冲区
        glGenBuffers(1, &bufferid);
        glBindBuffer(GL_UNIFORM_BUFFER, bufferid);

        //向缓冲区中赋值
        glBufferData(GL_UNIFORM_BUFFER, blocksize, blockData, GL_DYNAMIC_DRAW);
        
        //将UBO 和 point 绑定
        glBindBufferBase(GL_UNIFORM_BUFFER, point, bufferid);

UBOを変更

        GLfloat uploadData[] = {
            0.0f,0.0f,1.0f,1.0f
        };

        // 绑定当然统一变量块的 buffer
        glBindBuffer(GL_UNIFORM_BUFFER, bufferid);
        
        //获取统一变量块 中 指定变量的 偏移量
        const GLchar *names[] = {"cc"};
        GLuint indices[1];
        glGetUniformIndices(_program, 1, names, indices);
        GLint offset[1];
        glGetActiveUniformsiv(_program, 1, indices, GL_UNIFORM_OFFSET, offset);
        glBufferSubData(GL_UNIFORM_BUFFER, offset[0], blocksize, uploadData);

機能補完

図1に示すように、glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint* uniformIndices)
関数は、変数の索引パラメータの変数の統一されたブロックを得るために使用されます。

プログラムプログラム・オブジェクト
配列変数名uniformCount内の要素数
配列のuniformNames変数名
の変数インデックス付きアレイを受けるためuniformIndices

2、glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
インデックスクエリ変数、変数のパラメータの機能情報:

プログラムオブジェクトプログラム
番号uniformCount変数
uniformIndicesインデックスとする配列変数
PNAMEプロパティがGL_UNIFORM_OFFSET変数(変数オフセット)GL_UNIFORM_SIZE(可変サイズ)GL_UNIFORM_NAME_LENGTH(変数名の長さ)GL_UNIFORM_TYPE(可変タイプ)...照会することを示して
クエリー結果を受信するのparamsを配列

注意を払います

シェーディング言語のコンパイラの最適化

あなたは制服を宣言するが、GLSLコードで使用されていない場合、コンパイラは黙って、最終的なバージョンをコンパイルする大手、この変数を削除し、それが含まれていません。

UBO予選

UBOでは、さまざまな状況のための修飾子は異なるバイトパディングがあるので、オフセット、サイズは最高の、独自の計算エラーを回避するために、クエリによって行われる取得します。

これは、メモリ割り当てstd140(統一規格可変ブロックレイアウト)修飾子です。

std140レイアウト.PNG

おすすめ

転載: www.cnblogs.com/dongguolei/p/11495301.html