5

OpenGL ES プログラミングは初めてで、シェーダー プログラミングをデバッグしようとしていますが、特定の変数の値をログに記録する方法があるかどうか疑問に思っています。たとえば、以下の頂点シェーダー プログラムでは、通常の戻り値をテストしたいと思います。基本的には、NSLog に似たものを探していました...

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

1 に答える 1

5

回答の前に情報源を引用します。iOS デバイスの PowerVR GPU を担当する会社、Imagination Technologies の Developer Technology Engineers です。

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

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

于 2012-12-25T11:34:27.933 に答える