2012-12-25 20 views
5

私はOpenGL ESプログラミングの初心者です。シェーダプログラミングをデバッグしようとしていますが、特定の変数の値を記録する方法があるのだろうかと思います。例えば、下記の頂点シェーダプログラムでは、私は通常で返される値をテストしたいと思い、基本的に、私は私が前に私のソースを引用するつもりです頂点シェーダ内の変数のログ値

attribute vec4 position; 
attribute vec3 normal; 
attribute vec2 texture; 
varying vec2 v_texCoord; 
varying float LightIntensity; 

uniform mat4 modelViewProjectionMatrix; 
uniform mat3 normalMatrix; 

void main() 
{ 
    vec3 eyeNormal = normalize(normalMatrix * normal); 
    vec3 lightPosition = vec3(-1.0, 0.0, 3.0); 

    float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); 
    LightIntensity = nDotVP; 

    v_texCoord = texture; 

    gl_Position = modelViewProjectionMatrix * position; 
} 

答えて

5

...のNSLogに似たものを探していました私の答え:Imagination Technologiesの開発技術エンジニア、iOSデバイスのPowerVR GPUを担当する会社。

基本的に、GLSL ESシェーダはまだ正しくデバッグできません。NSLogまたはprintfと同等のものはありません。あなたが本当にあなたのGPUコードの中に足を踏み入れたいのであれば、OpenCLを使う必要があります.OpenCLは、特にiOSデバイス上で理解して実装するのが難しいです。シェーダをデバッグする一般的な方法は、通常、フラグメントシェーダで起こります。ここで、間違っていることがわかっている値は、通常、目立つように色付けされています(例えば、明るい赤色)。頂点シェーダはデバッグするのが難しいですが、少なくともフラグメントシェーダの前に発生し、主に属性やユニフォームに依存します。

あなたのメインの非GPUプログラムでは、normalnormalMatrixの値を知っているはずです。 1つは3次元ベクトルの配列で、もう1つは3×3行列です。 Objective-Cプログラムの任意のメソッド内で、これらを乗算し、正規化し、結果をループ内のNSLogに出力することができます。これにより、シェーダによって計算された同じ値が与えられ、eyeNormalに格納されます。実際には、CPU上で計算できない頂点シェーダコードの一部は表示されません。これは本当に問題を引き起こすフラグメントシェーダです!

+1

この質問を参考にしてください:http://stackoverflow.com/questions/2508818/how-to-debug-a-glsl-shader –

+0

答えをありがとう、私は新しい何かを学んだ:) – Pupillam

関連する問題