조각 셰이더는 픽셀 색상에 사용할 변수를 어떻게 알 수 있습니까?
다양한 조각 셰이더를 볼 수 있습니다.
#version 130
out vec4 flatColor;
void main(void)
{
flatColor = vec4(0.0,1.0,0.0,0.5);
}
그리고 그들은 모두 "out color"(이 경우 flatColor
) 에 대해 다른 변수를 사용합니다 . 그렇다면 OpenGL은 사용자가하려는 작업을 어떻게 알 수 있습니까?
으로 flatColor
정의 된 유일한 변수 이기 때문에 이것이 작동 out
한다고 생각하지만 더 많은 out
변수 를 추가 할 수 있습니다. 아니면 그냥 충돌할까요?
실제로 테스트로 방금 실행했습니다.
#version 330
in vec2 TexCoord0;
uniform sampler2D TexSampler;
out vec4 x;
out vec4 y;
void main()
{
y = texture2D(TexSampler, TexCoord0.xy);
}
내가 사용 x
하든 y
.
또한 미리 정의 된 gl_FragColor
. 차이점은 무엇이며 사람들이 일반적으로 자신의 변수를 사용하도록 고집하는 이유는 무엇입니까?
또한 미리 정의 된 gl_FragColor가 있습니다.
이것부터 시작합시다. 아니, 당신은 하지 않는 미리 정의 된 있습니다 gl_FragColor
. 핵심 OpenGL 3.1 이상에서 제거되었습니다. 호환성을 사용하지 않는 한 (이 경우 3.30 셰이더가 #version 330 compatibility
맨 위에 표시되어야 함) 이것을 사용해서는 안됩니다.
이제 사용자 정의 프래그먼트 셰이더 출력으로 돌아갑니다. 그러나 먼저 빠른 비유입니다.
버텍스 쉐이더에서 어떻게 입력이 있는지 기억하십니까? 그리고 이러한 입력은 속성 인덱스 정점 당신이 전달하는 숫자 표현 glVertexAttribPointer
과 glEnableVertexAttribArray
등과? 어떤 입력이 어떤 속성에서 가져 오는지 설정합니다. 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
.
명시 적으로 할당하지 않으면 일반적으로 구현에서 출력 변수 중 하나를 위치 0에 할당합니다. 그러나 OpenGL 표준은 이 동작을 요구 하지 않으므로이 동작에 의존해서는 안됩니다.
이제 박람회로, 프로그램이 있어야 실패 하면 다른 출력 위치를 못해서 두 개의 출력을 사용하는 경우 링크. 아마 컴파일러가 작성하지 않은 것을 최적화했기 때문에 링커 오류를 확인할 때가되었을 때 잊어 버렸습니다.
I'd like to specify this for OpenGLES 3.1 which uses GLSL_ES_3.10 link:
§4.4.2
If there is only a single output [in the fragment shader], the location does not need to be specified, in which case it defaults to zero.
'Program Tip' 카테고리의 다른 글
numpy 배열에서 다른 배열로 데이터를 복사하는 방법 (0) | 2020.10.16 |
---|---|
Android-스레드를 중지하는 가장 좋고 안전한 방법 (0) | 2020.10.16 |
Meteor로 파일 업로드를 어떻게 처리할까요? (0) | 2020.10.16 |
자바 스크립트 만 사용하여 div 태그의 텍스트를 얻는 방법 (jQuery 없음) (0) | 2020.10.16 |
게시 한 NPM 모듈을 어떻게 업데이트합니까? (0) | 2020.10.16 |