【GLSL】Flatten Shader

2064 단어 bufferfloatshader
shader는 나로 하여금 새로운 효과를 자유롭게 실현할 수 있게 한다. 이 예는 shader 프로그램을 통해 특이한 방식으로 정점을 처리하는 것을 보여 준다.
우선, 우리는 모델 보기를 바꾸기 전에 z 좌표를 0으로 설정하여 3d모델을 납작하게 한다.정점 shader는 다음과 같습니다.
 
	void main(void)
	{
		vec4 v = vec4(gl_Vertex);		
		v.z = 0.0;
		
		gl_Position = gl_ModelViewProjectionMatrix * v;
	} 

일단glvertex에 국부 변수,gltex는 GLSL에서 제공하는 속성 변수입니다. 따라서 정점shader에서는 읽기만 하기 때문에 국부 변수 v를 부여해서 (프로그램) 입력한 정점 값을 수정해야 합니다.
스크린 shader는 색깔만 설정하는 데 사용되기 때문에 앞에서 언급한 Hello World의 것처럼 사용할 수 있습니다.
여기에 정점 프로그램에서 z값을 0으로 설정하여 찻주전자 모형에 적용할 때 얻은 결과는 다음과 같을 수 있다
 
그럼 다른 효과를 다시 한 번 시험해 보겠습니다. z의 계산 항목을 다음과 같이 계산하면 결과는 다음과 같습니다.
	void main(void)
	{
		vec4 v = vec4(gl_Vertex);		
		v.z = sin(5.0*v.x )*0.25;
		
		gl_Position = gl_ModelViewProjectionMatrix * v;
	} 

 
자, 다음은 정점 애니메이션을 추가하려고 합니다. 우선 현재 시간을 추적하는 변수가 필요합니다. 정점 프로그램은 이런 변수를 할 수 없습니다. 따라서 Opengl 프로그램에서 이 변수를 정의하고 uniform 변수를 통해 정점shader에게 전달해야 합니다.응용 프로그램에 시간 변수가 있고 정점shader에 같은 이름의 uniform 변수가 있다면 정점shader는 이렇게 됩니다.
uniform float time;

void main(void)
{
	vec4 v = vec4(gl_Vertex);
	
	v.z = sin(5.0*v.x + time*0.01)*0.25;

	gl_Position = gl_ModelViewProjectionMatrix * v;
} 

위에서 언급한 속성 변수와 같이 응용 프로그램 세그먼트에는 두 가지 절차가 있습니다.
설정:속성 변수의 위치 가져오기
렌더링:속성 변수 업데이트
구축 단계:loc =glGetUniformLocationARB(p,time);
여기 p는 정점shader의 핸들입니다. time는 uniform 변수이고,loc는 GLint 형식입니다. 렌더링 단계에서 접근할 수 있는 위치를 정의해야 합니다.
렌더링 함수는 다음과 같습니다.
	void renderScene(void) {
	
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
		glLoadIdentity();
		gluLookAt(0.0,0.0,5.0, 
			0.0,0.0,0.0,
			0.0f,1.0f,0.0f);
	
		glUniform1fARB(loc, time);
	
		glutSolidTeapot(1);
		time+=0.01;
	
		glutSwapBuffers();
	}

이 시간 변수는 초기화할 때 주는 초기값으로 프레임마다 업데이트됩니다.
프로젝트 코드는 여기에서 flatten을 다운로드할 수 있습니다
 

좋은 웹페이지 즐겨찾기