2017-03-19 5 views
0

glDrawArraysInstanced 함수를 사용하여 삼각형을 이중화하고 싶습니다. 둘 사이의 차이점은 MVP 매트릭스입니다. 그런 다음 FBO에 2 GL_COLOR_ATTACHMENT를 적용하고 glDrawBuffers (2, ...)를 활성화했습니다. fragmentShader에서 데이터를 출력 할 때 레이아웃 위치를 바꿈

내 버텍스 쉐이더 :

#version 430 core 

layout (location = 0) in vec3 position; 

uniform mat4 uModel; 
uniform mat4 uView[2]; 
uniform mat4 uProjection[2]; 

out flat int ID; 

void main() 
{ 
    gl_Position = uProjection[gl_InstanceID] * uView[gl_InstanceID] * uModel * vec4(position.x, position.y, position.z, 1.0); 
    ID = gl_InstanceID; 
} 

내 조각 쉐이더 :

#version 430 core 

layout (location = 0) out vec3 color; 
layout (location = 1) out vec3 color1; 

in flat int ID; 

void main() 
{ 
    if (ID == 0) color = vec3(1.0f, 0.5f, 0.2f); 
    if (ID == 1) color1 = vec3(1.0f, 0.0f, 0.0f); 
} 

결과는이 : 4 triangles..

그것은 각 인스턴스화는 색상을 구현 한 것으로 보인다 color1 문. 'if'문이 유효하지 않습니까? 그리고 내 질문은 fbo 및 한 패스 중에 출력 대상이 얼마나 제한되는지입니다.

답변

2

쉐이더가 에 모두 쓰여지는 것을 막을 수는 없습니다. 모든 출력은 첨부 된입니다. 코드에서 수행하는 작업은 입니다.에는 하나의 출력에만 값이 할당되지만 다른 하나는 여전히 쓰여집니다.

첨부 파일 중 하나에서만 출력을 표시하려면 출력에 완전한 투명색을 쓰고 알파 블렌딩을 활성화 할 수 있습니다.

+0

ID가 입력이 아닌 유니폼 인 경우 쓰기 마스크를 사용하여 특정 버퍼에 대한 쓰기를 해제 할 수 있습니다. –

+0

답장을 보내 주셔서 감사합니다. 지금 당장 시도해 보겠습니다.하지만 조금 낭비가되는 것 같습니다 ... –

+0

새로운 질문 .... 말하자면, 셰이더가 모든 출력에 쓸 경우 왼쪽과 오른쪽은 같은 색 삼각형이되어야하고, '오렌지색' '빨간색'과 '빨간색' '오렌지색'이 될 것입니다. 그렇다면 'if'문은 유효하지 않습니까? –

관련 문제