2012-12-25 35 views
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; 
} 

回答

5

我去之前,先說說源我的回答是:Imagination Technologies的開發者技術工程師,該公司負責iOS設備上的PowerVR GPU。

基本上,GLSL ES着色器無法正確調試,並且沒有與NSLog或printf等效的功能。如果你真的想進入你的GPU代碼,你需要使用OpenCL,這很難理解和實現,特別是在iOS設備上。調試着色器的常見方法通常發生在片段着色器中,其中已知的不正確值通常以突出的方式着色(例如,明亮的紅色)。頂點着色器很難調試,但至少它出現在片段着色器之前,主要取決於您的屬性和制服。

您應該已經知道您的主要非GPU程序中的normalnormalMatrix的值。一個應該是一個三維向量陣列,另一個應該是一個3x3矩陣。你可以將它們相乘,對它們進行歸一化處理,並在你的Objective-C程序的任何方法內的循環內將結果打印到NSLog中。這會給你的着色器計算出相同的值,並存儲在eyeNormal中。事實上,我沒有看到你的頂點着色器代碼的任何部分無法在CPU上計算出來 - 這是片段着色器,它真的會給你帶來麻煩!

+1

看到這個問題的類似的討論:http://stackoverflow.com/questions/2508818/how-to-debug-a-glsl-shader –

+0

感謝您的答案,我學到了新的東西:) – Pupillam