2012-12-25 3 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과 비슷한 뭔가를 찾고 있었다 내 답변 : iOS 디바이스의 PowerVR GPU를 담당하는 Imagination Technologies의 개발자 기술 엔지니어.

기본적으로 GLSL ES 쉐이더는 아직 제대로 디버깅 될 수 없으며 NSLog 또는 printf와 동등한 것이 없습니다. GPU 코드를 실제로 사용하려면 OpenCL을 사용해야합니다. OpenCL은 iOS 기기에서 이해하기 쉽고 구현하기가 어렵습니다. 셰이더를 디버깅하는 일반적인 방법은 조각 쉐이더 (fragment shader)에서 일반적으로 발생합니다.이 셰이더에서는 잘못 알려진 값이 일반적으로 눈에 띄는 방식으로 표시됩니다 (예 : 밝은 빨강). 버텍스 쉐이더는 디버그하기가 더 어렵지만 적어도 프래그먼트 쉐이더 이전에 발생하며 대부분 속성과 유니폼에 의존합니다.

메인 GPU가 아닌 프로그램에서 normalnormalMatrix에 대한 값을 이미 알고 있어야합니다. 하나는 3 차원 벡터 배열이고 다른 하나는 3x3 매트릭스 여야합니다. Objective-C 프로그램의 모든 메서드 내에서 루프를 통해 NSLog에 곱해서 정규화하고 결과를 인쇄 할 수 있습니다. 이것은 쉐이더에 의해 계산 된 동일한 값을주고 eyeNormal에 저장됩니다. 실제로, CPU에서 계산할 수없는 버텍스 쉐이더 코드의 어떤 부분도 보지 못합니다. 정말 문제를 일으킬 조각 쉐이더입니다!

+1

비슷한 질문에 대한 답변보기 : http://stackoverflow.com/questions/2508818/how-to-debug-a-glsl-shader –

+0

답변 주셔서 감사합니다. 저는 새로운 것을 배웠습니다 :) – Pupillam

관련 문제