편집 : 스택 오버플로의 질문과 중복됩니다. https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel
정점 셰이더에서 조각 셰이더로 값을 보내려면 정점 셰이더가 하나의 변수를 out
로 선언해야하며 조각 셰이더는 다른 변수를 다음과 같이 선언해야합니다. in
및 두 변수의 이름과 유형이 동일해야합니다. 그러나 이것은 조각 셰이더에서 색상 값을 보내려고 할 때 발생하지 않습니다. 실제로 원하는대로 출력 변수를 호출 할 수 있습니다. 이유는 무엇입니까? 이전 버전에는 gl_FragColor
프로그램이 출력 조각 변수를 gl_FragColor와 어떻게 연결합니까?
Comments
- 교차 사이트 중복 및 문제인지 여부에 대한 메타 토론
- 추가 질문이있는 경우 기존 질문으로 수정하지 말고 새 질문으로 게시하세요. 개별 질문에 대한 답변을 독립적으로 비교할 수있는 방법입니다. 관련이있는 경우 질문간에 링크를 포함 할 수 있습니다.
답변
정점 셰이더 입력과 거의 똑같은 방식으로 작동합니다.
정점 셰이더에는 입력이 있습니다. 이러한 입력은 및
등. 어떤 입력이 어떤 속성에서 가져 오는지 설정합니다. GLSL 3.30에서는 다음 구문을 사용합니다.
layout(location = 2) in color;
이것은 color
버텍스 셰이더 입력을 속성에서 가져 오도록 설정합니다. 위치 2. 3.30 이전 (또는 ARB_explicit_attrib_location없이) 이전에 glBindAttrbLocation
를 사용하여이를 명시 적으로 설정해야합니다. glGetAttribLocation
를 사용하여 프로그램에 속성 색인을 연결하거나 쿼리합니다. 속성 위치를 명시 적으로 제공하지 않으면 GLSL은 임의로 위치를 할당합니다 (예 : 구현 정의 방식).
셰이더에서 설정하는 것은 거의 항상 더 나은 옵션입니다.
어쨌든 조각 셰이더 출력은 거의 동일한 방식으로 작동합니다. 조각 셰이더는 다중 출력 색상 에 쓸 수 있습니다. 그 자체가 프레임 버퍼의 여러 버퍼 에 매핑됩니다. 따라서 어떤 출력이 어떤 조각 출력 색상으로 이동하는지 표시해야합니다.
이것은 프로세스는 조각 출력 위치 값으로 시작합니다. 정점 셰이더 입력 위치와 매우 유사하게 설정됩니다.
layout(location = 1) out secColor;
API 함수도 있습니다. glBindFragDataLocation
및 glGetFragDataLocation
는 glBindAttribLocation
및 glGetAttribLocation
와 유사합니다.
명시적인 지원을 수행하지 않는 경우 gnments, 구현은 일반적으로 위치 0에 출력 변수 중 하나를 할당합니다. 그러나 OpenGL 표준은이 동작을 요구 하지 않으므로 이에 의존해서는 안됩니다.