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);
}