[opengl] GLSL 쉐이더를 디버깅하는 방법?

GLSL 프로그램을 디버깅해야하지만 중간 결과를 출력하는 방법을 모르겠습니다. GLSL을 사용하여 printf와 같은 디버그 추적을 만들 수 있습니까?



답변

GLSL 내에서 CPU와 쉽게 다시 통신 할 수 없습니다. glslDevil 또는 다른 도구를 사용하는 것이 가장 좋습니다.

printf는 GLSL 코드를 실행하는 GPU에서 CPU로 돌아 가려고합니다. 대신 디스플레이로 넘어갈 수 있습니다. 텍스트를 출력하는 대신 시각적으로 독특한 것을 화면에 출력하십시오. 예를 들어 printf를 추가하려는 코드의 지점에 도달 한 경우에만 특정 색상으로 무언가를 페인트 할 수 있습니다. 값을 인쇄해야하는 경우 해당 값에 따라 색상을 설정할 수 있습니다.


답변

void main(){
  float bug=0.0;
  vec3 tile=texture2D(colMap, coords.st).xyz;
  vec4 col=vec4(tile, 1.0);

  if(something) bug=1.0;

  col.x+=bug;

  gl_FragColor=col;
}


답변

Transform Feedback 이 버텍스 쉐이더 디버깅에 유용한 도구 라는 것을 알았습니다 . 이를 사용하여 VS 출력 값을 캡처하고 래스터 라이저를 거치지 않고도 CPU 측에서 다시 읽을 수 있습니다.

다음 은 변환 피드백에 대한 자습서에 대한 또 다른 링크입니다.


답변

화면에서 값의 변형을 시각화하려면 다음과 유사한 히트 맵 기능을 사용할 수 있습니다 (hlsl로 작성했지만 glsl에 적응하기 쉽습니다).

float4 HeatMapColor(float value, float minValue, float maxValue)
{
    #define HEATMAP_COLORS_COUNT 6
    float4 colors[HEATMAP_COLORS_COUNT] =
    {
        float4(0.32, 0.00, 0.32, 1.00),
        float4(0.00, 0.00, 1.00, 1.00),
        float4(0.00, 1.00, 0.00, 1.00),
        float4(1.00, 1.00, 0.00, 1.00),
        float4(1.00, 0.60, 0.00, 1.00),
        float4(1.00, 0.00, 0.00, 1.00),
    };
    float ratio=(HEATMAP_COLORS_COUNT-1.0)*saturate((value-minValue)/(maxValue-minValue));
    float indexMin=floor(ratio);
    float indexMax=min(indexMin+1,HEATMAP_COLORS_COUNT-1);
    return lerp(colors[indexMin], colors[indexMax], ratio-indexMin);
}

그런 다음 픽셀 셰이더에서 다음과 같이 출력합니다.

return HeatMapColor(myValue, 0.00, 50.00);

픽셀마다 어떻게 다른지 알 수 있습니다.

여기에 이미지 설명을 입력하십시오

물론 원하는 색상 세트를 사용할 수 있습니다.


답변

GLSL 샌드 박스 는 셰이더에 매우 유용했습니다.

디버깅 자체는 불가능하지만 (답변 할 수없는 것으로 답변 됨) 출력의 변경 사항을 빠르게 확인할 수 있습니다.


답변

https://github.com/msqrt/shader-printf 를 사용해보십시오 . “GLSL의 간단한 printf 기능”이라고하는 적절한 구현입니다.

또한 ShaderToy를 사용 해보고 싶을 수도 있습니다. “The Art of Code”YouTube 채널 의 비디오 ( https://youtu.be/EBrAdahFtuo )에서 디버깅 및 시각화. 그는 정말 좋은 자료를 쓸 때 채널을 강력하게 추천 할 수 있으며 복잡한 아이디어를 소설적이고 매력적이며 소화하기 쉬운 형식으로 제시 할 수 있습니다 (Mandelbrot 비디오는 정확히 그 훌륭한 예입니다 : https : // youtu.be/6IWXkV82oyY )

나는이 늦은 답변을 신경 쓰지 않기를 희망하지만 GLSL 디버깅에 대한 Google 검색에서 질문의 순위가 높으며 9 년 만에 많은 변화가있었습니다 🙂

PS : 다른 대안으로는 NVIDIA nSight 및 AMD ShaderAnalyzer가 포함될 수 있으며 쉐이더를위한 전체 스테핑 디버거를 제공합니다.


답변

조각 쉐이더 예제를 공유하고 있는데 실제로 어떻게 디버깅합니까?

#version 410 core

uniform sampler2D samp;
in VS_OUT
{
    vec4 color;
    vec2 texcoord;
} fs_in;

out vec4 color;

void main(void)
{
    vec4 sampColor;
    if( texture2D(samp, fs_in.texcoord).x > 0.8f)  //Check if Color contains red
        sampColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);  //If yes, set it to white
    else
        sampColor = texture2D(samp, fs_in.texcoord); //else sample from original
    color = sampColor;

}

여기에 이미지 설명을 입력하십시오