문제
GLSL 1.40 사양 읽기 :
조각 출력은 플로트, 플로팅 포인트 벡터, 서명 또는 서명되지 않은 정수 또는 정수 벡터 또는 이들의 배열 일 수 있습니다. 매트릭스와 구조는 출력 할 수 없습니다. 조각 출력은 다음 예에서와 같이 선언됩니다.
vec4 fragmentColor; uint 광도;
조각 색상은 GL_FRAGCOLOR를 쓰는 것으로 정의되어 있습니다 ... 맞습니까? 누군가 이러한 출력에 대한 내 아이디어를 제거 할 수 있습니까? 조각 색상을 결정하기 위해 예제의 'FragmentColor'만 쓸 수 있습니까? 다시 읽을 수 있습니다 (예를 들어 '광도').
해결책
예제에는 2 개의 출력이 있습니다. 그들은 GLSL 프로그램 링크 후에 관련된 해당 FBO 슬롯을 가지고 있습니다. 사용 사용을 리디렉션 할 수 있습니다 glBindFragDataLocation
.
셰이더를 활성화하고 FBO를 활성화 한 후에는 모두가 설정 한 드로우 마스크에 따라 다릅니다. glDrawBuffers
. 예를 들어, 지나간 경우 GL_COLOR_ATTACHMENT0
그리고 GL_COLOR_ATTACHMENT2
이는 출력 인덱스 0이 첨부 파일 0으로 이동하고 출력 인덱스 1이 색상 첨부 파일 2로 이동 함을 의미합니다.
다른 팁
글로벌 출력 변수 GL_FRAGCOLOR는 GLSL 버전 120 이후에도 더 이상 사용되지 않습니다. 이제 예에서와 같이 이름을 직접 제공하고 직접 입력해야합니다. 여러 출력과 관련 하여이 링크는 매핑에 대한 정보를 제공합니다. http://www.opengl.org/wiki/glsl_objects#program_linking
(그리고 나는 그 링크를 찾았습니다. http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&number=270999 )
도움이 되었기를 바랍니다! :디
오프! Kvark가 관련 정보를 주었다는 것을 알았습니다. 어쨌든, 아마도 당신도 내 텍스트에서 무언가를 얻었을 것입니다.
몇 가지 예를 제시하고 싶습니다.
void add(in float a, in float b, out float c)
{
//you can not use c here. only set value
//changing values of a and b does not change anything.
c = a + b;
}
void getColor(out float r, out float g, out float b)
{
//you can not use r, g, b here. only set value
r = gl_FragColor.r;
g = gl_FragColor.g;
b = gl_FragColor.b;
}
void amplify(inout vec4 pixelColor, in value)
{
//inout is like a reference
pixelColor = pixelColor * value;
}