[OpenGL] 이미지 출력하기
* 코딩 환경 Visual Studio 2019
파일 로드를 위한 헤더
이미지를 읽어오기 위해 아래 깃허브에서 헤더를 다운로드한다.
여기서 우리는 stb_image.h를 사용할 것이다.
https://github.com/nothings/stb/blob/master/stb_image.h
- 사용가능한 파일 확장자 : JPG, PNG, TGA, BMP, PSD, GIF, HDR, PIC
- 이미지 크기는 상관없음
다운로드한 헤더 파일은 소스코드에 알아서 잘 넣도록 하자.
- 속성에서 추가 디렉터리로 연결해주던가
- 아님, 헤더 파일 폴더에 추가하기
해당 헤더를 사용하기 위해서는 아래와 같이 define이 필요함. (중요)
1
2
|
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
|
cs |
사용한 이미지
전에 쏘롱 하면서 jiychoi가 그려준 으썸한 벽돌 이미지...
킹갓제너럴금손 지최 존경합니다 ㅎㅎ
전체 소스 코드
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
|
#include <iostream>
#include <GL/glut.h>
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
using namespace std;
// image width and height
int width, height;
//이미지 파일 열기
unsigned char* LoadMeshFromFile(const char* texFile)
{
GLuint texture;
glGenTextures(1, &texture);
FILE* fp = NULL;
if (fopen_s(&fp, texFile, "rb")) {
printf("ERROR : No %s. \n fail to bind %d\n", texFile, texture);
return (unsigned char*)false;
}
int channel;
unsigned char* image = stbi_load_from_file(fp, &width, &height, &channel, 4);
fclose(fp);
return image;
}
// texture 설정
void init()
{
GLuint texID;
unsigned char* bitmap;
bitmap = LoadMeshFromFile((char*)"block.png");
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmap);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
free(bitmap);
}
void drawBox()
{
glBegin(GL_POLYGON);
glTexCoord2d(0.0, 1.0); glVertex3d(-0.5, -0.5, 0.0);
glTexCoord2d(0.0, 0.0); glVertex3d(-0.5, 0.5, 0.0);
glTexCoord2d(1.0, 0.0); glVertex3d(0.5, 0.5, 0.0);
glTexCoord2d(1.0, 1.0); glVertex3d(0.5, -0.5, 0.0);
glEnd();
}
void display()
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawBox();
glutSwapBuffers();
}
void reshape(GLint w, GLint h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 30.0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("image");
glutReshapeFunc(reshape);
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
|
cs |
* 주의사항
- 이미지 한 개만 있을 때를 가정하고 코딩한 거라 여러 이미지를 넣고 싶다면 texID를 배열로 바꿔야 하고..
- glGenTextures 인자도 바꿔줘야 함.
- 물론 전역 변수로 설정한 width나 height도 수정 들어가야 함.
- 이 글은 이미지를 출력해보는데 의의가 있으므로 거기까진 안 함.
'프로그래밍 언어 > OpenGL' 카테고리의 다른 글
[OpenGL] 스플라인_3차 함수 곡선 그리기(cubic spline) (3) | 2021.12.16 |
---|---|
[OpenGL] 스플라인_2차 함수 곡선 그리기 (quadratic function) (0) | 2021.11.13 |