개발/Graphics

OpenGL Super Bible 그래픽스 공부하기 - 2.3 처음 그리는 삼각형

huiyu 2018. 1. 14. 14:15

OpenGL Super Bible 그래픽스 공부하기 - 1. OpenGL 기본개념이해

OpenGL Super Bible 그래픽스 공부하기 - 2. 첫번째 OpenGL 프로그램

Part 2.3 처음 그리는 삼각형

삼각형 예제는 지난번 점을 찍는 예제에서 간단한 수정만 있음 수정이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        //vertext shader source code
        static const GLchar * vertex_shader_source[] =
        {
                "#version 430 core                           \n"
                "                                            \n"
                "void main(void)                             \n"
                "{                                           \n"
                "    const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0),"
                "                             vec4(-0.25, -0.25, 0.5, 1.0),"
                "                             vec4(0.25, 0.25, 0.5, 1.0));\n"
                "    gl_Position = vertices[gl_VertexID];    \n"
                "}                                           \n"
        };
 
cs

우선 vertex shader code를 변경한다. 

위 코드에선 vertices[3] 배열을 선언 한 뒤 하드코딩으로 삼각형 좌표를 그린다. 
이를 gl_VertexID라는 glsl 내부변수를 이용하여 삼각형을 그리고 있다.

* GLSL 내부변수
  - gl_Position : 해당 시점에 그릴 position
  - gl_VertexID : 해당 시점에 처리 될 vertex Index, 이 인덱스를 사용하여 각 버텍스에 대해 다른 위치를 지정할 수 있다.
          -> glDrawArrays()에 입력으로 들어온 첫번째 인자부터 count의 수만큼 한개씩 증가하게 된다.


glDrawArrays()의 mode를 GL_TRAINGLES, count를 3으로 바꿔준다. 삼각형을 그리기 위해..!

1
glDrawArrays(GL_TRIANGLES, 03);
cs


다음 실행시키면 아래와 같이 삼각형이 나오는 걸 볼 수있다.


전체 코드는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <SDL.h>
#include <GL/gl.h>
 
GLuint compile_shaders(void)
{
    GLuint vertex_shader;
    GLuint fragment_shader;
    GLuint program;
 
    //vertext shader source code
    static const GLchar * vertex_shader_source[] = 
    {
        "#version 430 core                           \n"
        "                                            \n"
        "void main(void)                             \n"
                "{                                           \n"
        "    const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0),"
                "                             vec4(-0.25, -0.25, 0.5, 1.0)," 
                "                             vec4(0.25, 0.25, 0.5, 1.0));\n"
                "    gl_Position = vertices[gl_VertexID];    \n"
                "}                                           \n"
    };
 
    //fragment shader source code
    static const GLchar * fragment_shader_source[] = 
    {
        "#version 430 core                          \n"
                "                                           \n"
                "out vec4 color;                            \n"
                "                                           \n"
                "void main(void)                            \n"
                "{                                          \n"
                "    color = vec4(0.0, 0.0, 1.0, 1.0);      \n"
                "}                                          \n"
    };
 
    //create vertex shader and compile
    vertex_shader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
    glCompileShader(vertex_shader);
 
    //create fragment shader and compile
    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
    glCompileShader(fragment_shader);
 
    //create program->attach shader->link
    program = glCreateProgram();
    glAttachShader(program, vertex_shader);
    glAttachShader(program, fragment_shader);
    glLinkProgram(program);
 
    //delete shader 
    glDeleteShader(vertex_shader);
    glDeleteShader(fragment_shader);
 
    return program;
}
 
int main()
{
    SDL_Window *win = NULL;
    SDL_GLContext context;
    GLuint rendering_program;
 
    SDL_Init(SDL_INIT_VIDEO);
    win = SDL_CreateWindow("window"20000480800, SDL_WINDOW_OPENGL);
    
    context = SDL_GL_CreateContext(win);
    rendering_program = compile_shaders();
 
    SDL_bool isQuit = SDL_FALSE;
 
//    glPointSize(40);
    while(!isQuit) {
        SDL_Event e;
        if(SDL_PollEvent(&e)) {
            if(e.type == SDL_QUIT) {
                isQuit = SDL_TRUE;
            }
            
        }
        static const GLfloat red[] = {0.0f, 0.2f, 0.0f, 1.0f};
        glClearBufferfv(GL_COLOR, 0, red);
        glUseProgram(rendering_program);
        glDrawArrays(GL_TRIANGLES, 03);
        SDL_GL_SwapWindow(win);
    }
    
    SDL_Quit();
    return 0;
}
cs


728x90
반응형