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);
픽셀마다 어떻게 다른지 알 수 있습니다.
물론 원하는 색상 세트를 사용할 수 있습니다.
답변
답변
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;
}