5

我是 OpenGL ES 编程的新手,我正在尝试调试我的着色器编程,我想知道是否有任何方法可以记录特定变量的值。比如下面的vertex shader程序中,我想测试一下normal返回的值,基本上就是在找类似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

在回答之前,我将引用我的来源:Imagination Technologies 的开发技术工程师,该公司负责 iOS 设备上的 PowerVR GPU。

基本上,GLSL ES 着色器还不能正确调试,并且没有与 NSLog 或 printf 等效的东西。如果你真的想进入你的 GPU 代码,你需要使用 OpenCL,它很难理解和实现,特别是在 iOS 设备上。调试着色器的常用方法通常出现在片段着色器中,其中已知不正确的值通常以它们突出的方式着色(例如亮红色)。顶点着色器更难调试,但至少它发生在片段着色器之前,并且主要取决于您的属性和制服。

您应该已经知道您在非 GPU 主程序中normal的值。normalMatrix一个应该是 3 维向量数组,另一个应该是 3x3 矩阵。您可以将它们相乘、标准化,然后在 Objective-C 程序的任何方法内的循环中将结果打印到 NSLog。这将为您提供由着色器计算并存储在eyeNormal. 事实上,我没有看到无法在 CPU 上计算的顶点着色器代码的任何部分 - 真正给您带来麻烦的是片段着色器!

于 2012-12-25T11:34:27.933 回答