OpenGL 레 드 북 트라이앵글 프로그램 - shader 를 통 해 정점 색상 추가
2060 단어 OpenGL
mspaint 색상 선택 천 처럼 Triangles 에 다른 색상 을 추가 할 계획 입 니 다.
1. 이미 알 고 있 음
우 리 는 이미 알 고 있다.
2. 실현
그러면 저 희 는 주로 vertex shader 를 이용 하여 정점 에 색 을 부여 하고 fragment shader 에서 플러그 인 후의 색 을 선택 합 니 다.
코드 참조: vi triangles. vert (vertex shader)
#version 400 core
layout( location = 0 ) in vec4 vPosition;
out vec4 fColor;
void
main()
{
gl_Position = vPosition;
switch(gl_VertexID % 3)
{
case 0:
fColor = vec4(1.0, 0.0, 0.0, 1.0);
break;
case 1:
fColor = vec4(0.0, 1.0, 0.0, 1.0);
break;
case 2:
fColor = vec4(0.0, 0.0, 1.0, 1.0);
break;
};
}
코드 참조: vi triangles. frag (fragment shader)
#version 400 core
in vec4 fColor;
out vec4 vColor;
void main()
{
vColor = fColor;
}
3. 과정 에서 발생 하 는 문제
실행 시 이상: 셰 이 더 연결 실패: 경고: 프 래 그 먼 트 셰 이 더 에 의 해 읽 히 지 않 는 수직 셰 이 더 'vColor' 의 출력 오류: 수직 셰 이 더 에 의 해 쓰 여지 지 않 은 프 래 그 먼 트 셰 이 더 'vInColor' 의 입력
이 유 는 vertex shader 에서 정의 하 는 출력 이름 은 vColor 를 사용 하고 fragment shader 에서 정의 하 는 입력 이름 은 vInColor 를 사용 하 며 이름 이 일치 하지 않 기 때 문 입 니 다.이 로 인해 링크 를 만 들 었 을 때 a. vertex shader 에서 출력 한 vColor 가 fragment shader 에서 b. fragment shader 에서 사용 하 는 vInColor 가 vertex shader 에 기록 되 지 않 은 것 을 발 견 했 습 니 다.
문제 가 발생 한 원인: 처음에 저 는 두 main 프로그램 이 서로 독립 되 어야 한다 고 생각 했 습 니 다. fragment shader 는 픽 셀 의 분 산 된 삽입 값 에 대응 하 는 수 치 를 입력 했 고 이름 에 대해 매개 변수 순 서 를 통 해 해당 하 는 값 을 전달 할 수 있 습 니 다.발생 한 오 류 를 통 해 알 수 있 듯 이 이들 은 동명 의 매개 변 수 를 통 해 값 을 전달 하고 분 산 된 플러그 인 후의 값 도 동명 의 매개 변 수 를 통 해 전달 된다.
문제 해결: vertex shader 의 출력 매개 변 수 를 fragment shader 의 입력 매개 변수 이름과 대응 합 니 다.vertex shader 출력 color 이름 은 fColor 를 사용 하고 fragment shader 의 입력 color 이름 은 fColor 를 사용 합 니 다.2 절 에서 코드 가 실 현 된 것 처럼
(Owed by: 봄 밤 단비http://blog.csdn.net/chunyexiyu)