지난 시간에는 Shader 밖에서 설정 된 Vertex 좌표가 gl_Position에 전달되는지 확인 해 봤습니다. 코드 상에서는 glRotate를 했지만 이것은 Model View Matrix에 영향을 미쳤고, glVertex로 입력 된 좌표가 그대로 gl_Position으로 전달 된 것을 볼 수 있었습니다.
https://learn-and-give.tistory.com/29
Vertex Shader 내부에서의 좌표 조정
이제 Shader 내부에서 좌표를 변경했을 때 어떻게 되는지 살펴보겠습니다. 그 영향이 잘 드러나도록 Vertex가 많은 주전자를 이용해보겠습니다. 그리고, 아직 조명이 적용되지 않았기 때문에 Solid Teapot은 위치의 변화를 나타낼 수 없으니, Wireframe Teapot을 사용하겠습니다.
x좌표를 삼각함수의 입력으로 하여 계산 된 값을 y좌표에 더해주면 꿀렁꿀렁거리는 모양이 될 것 같네요.
Vertex Shader를 아래와 같이 작성 해 보겠습니다.
void main()
{
gl_FrontColor = gl_Color;
vec4 newPos = vec4(gl_Vertex);
newPos.y = newPos.y + sin(2.0*newPos.x);
gl_Position = gl_ModelViewProjectionMatrix * newPos;
}
결과는~
sine curve가 되는 것 같기는 한데, 구불구불 해지도록 주기가 좀 더 빨라지도록 하고(X2 --> X8), 진폭도 조금 줄여서(/4) 화면 내에서 잘 보이도록 해보겠습니다.
void main()
{
gl_FrontColor = gl_Color;
vec4 newPos = vec4(gl_Vertex);
newPos.y = newPos.y + sin(8.0*newPos.x) / 4.0;
gl_Position = gl_ModelViewProjectionMatrix * newPos;
}
의도한 모양으로 잘 변형이 되었네요.
생각 해 볼 사항
만약 가로로 선을 하나 그리면 구불구불한 곡선이 될까요??
glColor3f(0.2f, 0.2f, 0.6f);
//glutWireTeapot(0.5f);
glBegin(GL_LINES);
glVertex3f(-0.5f, 0.f, 0.f);
glVertex3f(0.5f, 0.f, 0.f);
glEnd();
glFlush();
결과는???
왜 곡선이 아니라 직선이 나왔을까요??
Vertex Shader에서는 Vertex의 위치를 조정해줬습니다. 즉, 두 점을 이어주는 도형의 양 끝점의 좌표만 바꿔주었기 때문에 그대로 선으로 그려졌습니다. 주전자의 경우, Vertex가 많았기 때문에 마치 화면 전체가 변형 된 것 처럼 보였던 것입니다. 가로로 그어진 선이라도 그 사이에 Vertex가 많다면 어떨까요??
네, 맞습니다. 아래와 같이 선 사이에 Vertex를 넣어주면 각각의 좌표가 변환되어 곡선 형태에 가까워집니다.
그럼, 화면이 꿀렁꿀렁 거리는 것은 어떻게 구현할까요??
아직 배우지 않은 내용이지만 한번 상상해보는 것으로 남기고, 마무리 하겠습니다.
이렇게 해 놓고 보니, 동적으로 변화하는 모습을 만들어 보고 싶은데, 다음 시간에 한번 해 보도록 하겠습니다.
https://learn-and-give.tistory.com/34
'공허의 유산 > 표현의 자유' 카테고리의 다른 글
[opengl].[#2.GLSL] 08. 잔소리...Toon shading (0) | 2023.01.11 |
---|---|
[opengl].[#2.GLSL] 07. Vertex Shader에서 간단한 애니메이션 구현 (0) | 2023.01.11 |
[opengl].[#2.GLSL] 05. gl_Position 끄적거리기 (0) | 2023.01.08 |
[opengl].[#2.GLSL] 04. gl_Color 끄적거리기 (0) | 2023.01.07 |
[opengl].[#2.GLSL] 03. Shader, 이걸 누가 설명 해 줬더라면... (0) | 2023.01.05 |
댓글