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, 0, 3); | 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", 2000, 0, 480, 800, 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, 0, 3); SDL_GL_SwapWindow(win); } SDL_Quit(); return 0; } | cs |
728x90
'Software Development > Graphics' 카테고리의 다른 글
OpenGL Super Bible 그래픽스 공부하기 - 3. 파이프라인 따라가기 - 2) 테셀레이션 (0) | 2018.01.21 |
---|---|
OpenGL Super Bible 그래픽스 공부하기 - 3. 파이프라인 따라가기 - 1) 쉐이더간 데이터 전달 (0) | 2018.01.20 |
우분투 환경에서 SDL2 + GL 설정하고 빌드해보기 (0) | 2018.01.14 |
OpenGL Super Bible 그래픽스 공부하기 - 2. 첫번째 OpenGL 프로그램 (0) | 2018.01.14 |
OpenGL Super Bible 그래픽스 공부하기 - 1. OpenGL 기본개념이해 (0) | 2018.01.13 |