0

GLKViewController のサブクラスを作成して、すべて正常に動作する GLKBaseEffect を使用していくつかの波形をレンダリングしました。

独自の頂点シェーダーとフラグメント シェーダーを使用したいので、デフォルトの OpenGL ゲーム プロジェクトのボイラープレート コードを使用しました。どちらのシェーダーもコンパイル、リンク、および使用可能です。頂点シェーダーで問題なく色を変更できます。

私が抱えている問題は、自分のユニフォームをフラグメント シェーダーに渡すことです。これを頂点シェーダーに渡してそこで使用することはできますが、同じ変数を

コード:

// 頂点シェーダー

attribute vec4 position;
uniform float amplitudeMax;

void main() {
    gl_Position = position + amplitudeMax; // This works and offsets the drawing
}

// フラグメント シェーダー

uniform float amplitudeMax; // Fails to compile
//uniform float amplitudeMax; // Compiles fine

void main()
{
    gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
}

好奇心が強い場合は、ユニフォームとシェーダーをセットアップする方法を次に示します

func loadShaders() -> Bool {

    // Copied from default OpenGL Game project

    // link program ...

    uniforms[UNIFORM_AMPLITUDE_MAX] = glGetUniformLocation(program, "amplitudeMax")

    // release shaders ...

}

// The draw loop
func render() {

    configureShaders()

    // ... draw
}

func configureShaders() {

    glUseProgram(program)

    let max = AudioManager.sharedInstance.bufferManager.currentPower)
    glUniform1f(uniforms[UNIFORM_AMPLITUDE_MAX], max)

}

さまざまなフロートを使用して、頂点シェーダーからフラグメント シェーダーに値を渡すという別のアイデアがありました。ここでも、頂点シェーダーで変数を宣言して使用できますが、フラグメント シェーダーで変数をデラリングすると、コンパイルに失敗します。

編集: - - - - - - - - - - - - - - - - - - - - - - - - --

試行錯誤の結果、(フラグメント シェーダーで) if (フラグメント シェーダー) がユニフォームと可変の両方で機能する精度でユニフォーム宣言を修飾することがわかりました (頂点からシェーダーに渡すことができます)。

uniform lowp float amplitudeMax;

void main() {
    gl_FragColor = vec4(amplitudeMax, 0.0, 1.0, 1.0);
}
4

0 に答える 0